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)
任何帮助,将不胜感激.
基本上,我从一个图像开始,想要使用拉普拉斯算法得到一个代表图像模糊度的值.
拉普拉斯变换可以由应用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更简单,结果相同.
我还没有找到任何直接的函数来计算 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 张照片执行此操作,但我的笔记本电脑已关闭。应该有一些方法来优化这一点。