OpenCV,拉普拉斯的变异(Java)

时间:2016-04-04 21:39:54

标签: java opencv image-processing blurry

我试图根据图像找到拉普拉斯算子的变体,目的是根据图像的模糊度得到一个数值。

这是一个有用的帖子 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);

任何帮助都将不胜感激。

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

2 个答案:

答案 0 :(得分:8)

拉普拉斯变换可以用应用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更简单,结果相同。

答案 1 :(得分:0)

我没有找到任何直接函数来计算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张照片做这个,我的笔记本电脑关闭了。应该有办法优化这一点。