我正在使用适用于 Java 的 OpenCV (v4.1) 进行简单的晕影校正。 我的想法是创建一个渐变的圆圈(从黑色到白色)并将值添加到我图像的亮度 channel 。这已经有效,但是我希望渐变圆的面积/跨度宽度更大,这样过渡在我的最终图像中就不会那么明显,而是更平滑 (见下面的快照)。
我使用 getGaussianKernel
方法创建了小插图模板,但我相信我不能在这里修改太多。我可以更改 sigma
值,但这只会更改圆圈的大小。还有其他更合适的方法吗?性能非常重要,因为我必须对许多图像执行此操作。
这里是我目前的做法:
public void Vignette(Mat img) {
System.loadLibrary( Core.NATIVE_LIBRARY_NAME ); // initializes openCV library
Mat column = new Mat();
Mat row = new Mat ();
Mat product = new Mat ();
Mat finalImage = new Mat ();
int sigma = 240; // vignette aperture
// creating vignette template
column = Imgproc.getGaussianKernel(img.cols(), sigma, org.opencv.core.CvType.CV_32F);
row = Imgproc.getGaussianKernel(img.rows(), sigma, org.opencv.core.CvType.CV_32F);
Core.gemm(row,column.t(),1,new Mat(),0, product); // generalized matrix multiplication for column x row matrix
Core.normalize(product, product, 255, 0, Core.NORM_MINMAX); // scaling values to [0...255]
product.convertTo(product, org.opencv.core.CvType.CV_8UC3, 255); // create 3 channel matrix
Core.bitwise_not(product, product); // invert vignette template
Imgproc.cvtColor(img, img, Imgproc.COLOR_BGR2HSV); // convert image from BGR to HSV
Vector <Mat> channels = new Vector(3);
Core.split(img, channels); // split HSV channels
Core.add(channels.get(2), product, channels.get(2)); // add value from product matrix to corresponding value of Brightness channel
Core.merge(channels, img); // merge HSV channels back together
Imgproc.cvtColor(img,img,Imgproc.COLOR_HSV2BGR); // convert image back to RGB
finalImage = img; // shows image with vignette correction
// finalImage = product; // shows vignette template
}
快照(小插图模板,“渐变宽度”标记为红色):
最佳答案
我不是 OpenCV 方面的专家,但我使用它并且在这种情况下我通常使用高斯模糊。这可能不是最简洁的方法,但通常可以很好地完成工作。
关于java - 更改晕影校正的衰落半径(OpenCV Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57140651/