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

Sco*_*ott 4 java opencv image-processing blurry

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

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

cv2.Laplacian(image, cv2.CV_64F).var()
Run Code Online (Sandbox Code Playgroud)

我一直在努力实现同样的运气.我的起点是表示图像的字节[](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);
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激.

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

Ped*_*ira 9

拉普拉斯变换可以由应用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);
Run Code Online (Sandbox Code Playgroud)

希望这有助于您的编码.

注意:我从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);
Run Code Online (Sandbox Code Playgroud)

比python更简单,结果相同.


iGb*_*nam 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);
Run Code Online (Sandbox Code Playgroud)

我在从 RAW 转换而来的大约 37 个 JPG(每个大约 8MB)上运行了这个程序,尽管速度很慢,但它还是有效的。我尝试对 340 张照片执行此操作,但我的笔记本电脑已关闭。应该有一些方法来优化这一点。