OpenCV Java与Python中Laplace方差计算结果不一致的解决方法
问题:OpenCV Java与Python计算Laplace方差结果不一致
使用OpenCV分别通过Java(4.5.5版本)和Python(4.7.0版本)计算Laplace方差时,得到不同结果,以下是原实现代码及问题:
原代码
Java 代码
Mat src, src_gray = new Mat(); MatOfDouble dst = new MatOfDouble(); int kernel_size = 3, scale = 1, delta = 0, ddepth = CvType.CV_16S; rc = Imgcodecs.imread("image.jpg", Imgcodecs.IMREAD_COLOR); Imgproc.cvtColor(src, src_gray, Imgproc.COLOR_RGB2GRAY ); Imgproc.Laplacian(src_gray, dst, ddepth, kernel_size, scale, delta, Core.BORDER_DEFAULT); MatOfDouble median = new MatOfDouble(); MatOfDouble std = new MatOfDouble(); Core.meanStdDev(dst, median,std); double varianceLaplace = Math.pow(std.get(0,0)[0], 2); double mean = Math.pow(median.get(0,0)[0], 2); Toast.makeText(this, Core.getVersionString()+"\n"+mean+"\n"+varianceLaplace, Toast.LENGTH_SHORT).show();
Python 代码
import cv2 src = cv2.imread("image.jpg", cv2.IMREAD_COLOR) src_gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY) dst = cv2.Laplacian(src_gray, cv2.CV_16S, ksize=3, scale=1, delta=0) (mean, std) = cv2.meanStdDev(dst) print(std[0][0]**2, mean[0][0]**2) print(cv2.__version__)
Python 版本计算结果:
154.52608731077953 1.322542731132772e-07
差异原因及修改方案
1. 颜色空间转换错误
OpenCV 的 imread 函数在 Java 和 Python 中,默认读取的图像都是 BGR 格式,但原 Java 代码中使用了 Imgproc.COLOR_RGB2GRAY 进行灰度转换,而 Python 代码用的是正确的 cv2.COLOR_BGR2GRAY,这会导致灰度图完全不同,后续所有计算结果必然不一致。
2. 变量初始化错误
原 Java 代码中,读取图像赋值给了 rc,但后续灰度转换使用的是未初始化的 src 变量,这是明显的笔误,会导致运行错误或异常结果。
3. 输出类型错误
原 Java 代码中错误地将 dst 声明为 MatOfDouble,但 Imgproc.Laplacian 的输出应该是 Mat 类型(对应图像数据),这也是一个潜在错误。
修改后的 Java 代码
Mat src = new Mat(); Mat src_gray = new Mat(); Mat dst = new Mat(); int kernel_size = 3, scale = 1, delta = 0, ddepth = CvType.CV_16S; src = Imgcodecs.imread("image.jpg", Imgcodecs.IMREAD_COLOR); Imgproc.cvtColor(src, src_gray, Imgproc.COLOR_BGR2GRAY ); Imgproc.Laplacian(src_gray, dst, ddepth, kernel_size, scale, delta, Core.BORDER_DEFAULT); MatOfDouble mean = new MatOfDouble(); MatOfDouble std = new MatOfDouble(); Core.meanStdDev(dst, mean, std); double varianceLaplace = Math.pow(std.get(0,0)[0], 2); double meanSquared = Math.pow(mean.get(0,0)[0], 2); Toast.makeText(this, Core.getVersionString()+"\n"+meanSquared+"\n"+varianceLaplace, Toast.LENGTH_SHORT).show();
修改以上三点后,Java 和 Python 版本的计算结果将完全一致。
内容的提问来源于stack exchange,提问作者nhatrongbp
相关产品推荐
相关产品推荐

