我试图根据图像找到拉普拉斯算子的变体,目的是根据图像的模糊度得到一个数值。
这是一个有用的帖子 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);
任何帮助都将不胜感激。
基本上,我从图像开始,想要使用拉普拉斯算法得到一个代表图像模糊度的值。
答案 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张照片做这个,我的笔记本电脑关闭了。应该有办法优化这一点。