Java Android中Canny边缘检测的快速自适应阈值
根据我的研究,Canny边缘检测器对于检测图像的边缘非常有用。在我做了很多努力之后,我发现OpenCV函数可以做到这一点,也就是Java Android中Canny边缘检测的快速自适应阈值,java,android,image-processing,opencv,image-recognition,Java,Android,Image Processing,Opencv,Image Recognition,根据我的研究,Canny边缘检测器对于检测图像的边缘非常有用。在我做了很多努力之后,我发现OpenCV函数可以做到这一点,也就是 Imgproc.Canny(Mat image, Mat edges, double threshold1, double threshold2) 但是对于低阈值和高阈值,我知道不同的图像有不同的阈值,所以我可以知道是否有任何快速自适应阈值方法可以根据不同的图像自动分配低阈值和高阈值吗?这相对容易做到。看看这个老话题 一种快速的方法是计算当前图像的平均值和标
Imgproc.Canny(Mat image, Mat edges, double threshold1, double threshold2)
但是对于低阈值和高阈值,我知道不同的图像有不同的阈值,所以我可以知道是否有任何快速自适应阈值方法可以根据不同的图像自动分配低阈值和高阈值吗?这相对容易做到。看看这个老话题 一种快速的方法是计算当前图像的平均值和标准偏差,并对图像应用+/-一个标准偏差 < C++中的例子将是类似的:
Mat img = ...;
Scalar mu, sigma;
meanStdDev(img, mu, sigma);
Mat edges;
Canny(img, edges, mu.val[0] - sigma.val[0], mu.val[0] + sigma.val[0]);
另一种方法是计算图像的中值,并以高于和低于中值的比率作为目标(例如,0.66*medianValue
和1.33*medianValue
)
希望有帮助 Opencv具有自适应阈值功能。 使用OpenCV4Android时,情况如下:
Imgproc.adaptiveThreshold(src, dst, maxValue, adaptiveMethod, thresholdType, blockSize, C);
例如:
Imgproc.adaptiveThreshold(mInput, mInput, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY_INV, 15, 4);
至于如何选择参数,您需要阅读文档了解更多详细信息。为每张图像选择正确的阈值是一个完全不同的问题。Rui Marques,你能帮我吗?提前谢谢。你应该查看OpenCV的代码源,他们在阈值方法中使用了大津大学的自适应阈值计算。你可以用它来获得canny的高阈值,然后乘以0.40.5得到低阈值。Adrian Popovici,你的意思是:Imgproc.canny(image,image,0.4*Imgproc.THRESH_OTSU,Imgproc.THRESH_OTSU)?但图像结果现在非常模糊。很抱歉,因为我是OpenCV新手,我已经尽了最大努力对其进行研究。希望您能帮助我。谢谢。我不知道如何在Java中获得Otsu阈值,但您应该有这样一个方法:getOtsuThreshold(图像)返回整数。然后像这样应用它(srcImage,dstImage,0.4*thresh,thresh)。记住让目标图像与源图像不同。嗨,我看到你在评论中写了我的名字,但你必须在名字之前写@,以便通知该人。