java - 更改晕影校正的衰落半径(OpenCV Java)

标签 java opencv

我正在使用适用于 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

    }

快照(小插图模板,“渐变宽度”标记为红色):

vignette template

最佳答案

我不是 OpenCV 方面的专家,但我使用它并且在这种情况下我通常使用高斯模糊。这可能不是最简洁的方法,但通常可以很好地完成工作。

关于java - 更改晕影校正的衰落半径(OpenCV Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57140651/

相关文章:

java - 使用静态类或此引用将数据从一个Jframe传输到另一个Jframe?

java - java中类中的公共(public)静态字段

c++ - 为 C++ 初学者从 OpenCV 流式传输的优雅方式?

python - 如何使用 OpenCV 同时从​​连接到 Raspberry Pi 3 的两个 USB 摄像头捕获和保存图像?

python - 在 OpenCV 中加载 haar 级联文件 -> "OpenCV returned NULL"

java - 如何使用 Scanner 类读取一行中空格分隔的字符串?

java - Sql事件与Servlet中的ScheduledExecutorService

opencv - 使用CV Android进行对象检测

python - 如何使用 OpenCV imshow 在没有键盘反馈的情况下循环显示最新图像

java - 当我们在不同的命令提示符下发出 java 命令时,会创建多少个 JVM 实例?