【问题标题】:OpenCV, Variation of the Laplacian (Java)OpenCV,拉普拉斯变体(Java)
【发布时间】:2016-07-24 15:05:17
【问题描述】:

我正在尝试根据图像定位拉普拉斯变体,目的是根据图像的模糊度获得数值。

这是一个有用的帖子 http://www.pyimagesearch.com/2015/09/07/blur-detection-with-opencv/

cv2.Laplacian(image, cv2.CV_64F).var()

我一直在尝试实现同样的方法,但没有运气。我的出发点是一个代表图像(img)的字节[]:

Mat mat = new Mat(img.getImageHeight(), img.getImageWidth(), CvType.CV_8UC3);
Imgproc.cvtColor(mat, mat, Imgproc.COLOR_BGR2GRAY);
mat.put(0, 0, putData.getFileContents());
Imgproc.Laplacian(mat,mat, CvType.CV_64F);

任何帮助将不胜感激。

基本上,我从一张图像开始,想要使用拉普拉斯算子获得一个表示图像模糊度的值。

【问题讨论】:

    标签: java opencv image-processing blurry


    【解决方案1】:

    拉普拉斯变换可以用 filter2D 方法应用的内核代替。 我一直在这样的 java 程序中运行相同的 python 示例:

        Mat destination = new Mat();
        Mat matGray=new Mat();  
        Mat kernel = new Mat(3,3, CvType.CV_32F){
           {
              put(0,0,0);
              put(0,1,-1);
              put(0,2,0);
    
              put(1,0-1);
              put(1,1,4);
              put(1,2,-1);
    
              put(2,0,0);
              put(2,1,-1);
              put(2,2,0);
           }
        };        
        Imgproc.cvtColor(image, matGray, Imgproc.COLOR_BGR2GRAY);          
        Imgproc.filter2D(matGray, destination, -1, kernel); 
        MatOfDouble median = new MatOfDouble();
        MatOfDouble std= new MatOfDouble();        
        Core.meanStdDev(destination, median , std);
    
        Math.pow(std.get(0,0)[0],2);
    

    希望这对您的编码有所帮助。

    注意:我从 Python 和 Java 程序得到的值是不同的,我仍然不明白为什么。无论如何,java代码运行良好。

    找出为什么值不一样。使用 Imgproc.Laplacian 方法代替 Imgproc.filter2D 在 python 和 java 中产生完全相同的值。

    新代码变成:

    Mat destination = new Mat();
    Mat matGray=new Mat();  
    
    Imgproc.cvtColor(image, matGray, Imgproc.COLOR_BGR2GRAY);          
    Imgproc.Laplacian(matGray, destination, 3); 
    MatOfDouble median = new MatOfDouble();
    MatOfDouble std= new MatOfDouble();        
    Core.meanStdDev(destination, median , std);
    
    Math.pow(std.get(0,0)[0],2);
    

    简单得多,结果与 python 相同。

    【讨论】:

    • 我也一直在使用这个算法在不同焦距拍摄的一组图像中找到最佳焦距值。但是,我只评估了 2 个结果不正确的图像。我的输入图像是灰度的,所以我创建了这样的图像:Mat image = Imgcodecs.imdecode(new MatOfByte(bytes), Imgcodecs.CV_LOAD_IMAGE_UNCHANGED) 我不认为我可以将图像上传到此帖子,但如果有人有兴趣查看它们,我可以将它们发送给您。跨度>
    【解决方案2】:

    我还没有找到任何直接函数来计算 OpenCV 中图像的方差。但我找到了一些计算平均标准偏差的方法。从数学上看,方差就是平均标准差的平方。

    这就是我计算图像平均标准差的方法

    Mat im = Imgcodecs.imread("relative/path/to/file");
    Imgproc.cvtColor(im, im, Imgproc.COLOR_BGR2GRAY);
    MatOfDouble mu = new MatOfDouble(); // mean
    MatOfDouble sigma = new MatOfDouble(); // standard deviation
    Core.meanStdDev(d, mu, sigma);
    double variance = Math.pow(mu.get(0,0)[0], 2);
    

    我在从 RAW 转换的大约 37 张 JPG(每个大约 8MB)上运行了这个程序,虽然运行缓慢。我尝试为我的 340 张照片执行此操作,但我的笔记本电脑已关闭。应该有办法对此进行优化。

    【讨论】:

    • 首先,感谢您的帖子!请让我知道'd'变量来自哪里? d的值是多少?和我一样吗?
    猜你喜欢
    • 2019-02-02
    • 2023-03-24
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多