【发布时间】:2019-07-30 09:41:50
【问题描述】:
我正在开发一个 Android 应用程序来检测所有图像轮廓并使用 Opencv 绘制它们。
我在同一张图片上进行测试,一切正常。
但是,一旦我更改了相同的图像但对比度不同,检测就会失败。
我还更改了另一个背景较暗的示例图像,但又失败了。
代码如下:
Imgproc.cvtColor(mRGBA, mGray, Imgproc.COLOR_RGB2HSV);
Core.split(mGray, channels);
mGray = channels.get(1);
Imgproc.threshold(mGray, mGray, 50, 255, Imgproc.THRESH_BINARY);
Core.meanStdDev(mGray, mu, stddev);
Imgproc.GaussianBlur(mGray, mGray, new Size(5, 5), 5);
//Imgproc.Canny(mGray, mGray, 20, 80, 3, false);
Imgproc.Canny(mGray, mGray, mu.get(0, 0)[0], stddev.get(0, 0)[0], 3, false);
Mat kernell = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(9,9));
Imgproc.morphologyEx(mGray, mGray, Imgproc.MORPH_CLOSE, kernell);
Imgproc.dilate(mGray, mGray, Imgproc.getStructuringElement(Imgproc.MORPH_CROSS, new Size(3, 3)));
这是第一个示例图像
处理结果
这是第二张示例图片
这是结果
我必须指出这样一个事实,如果我移除图像阈值,该算法对于不同光强度和不同对比度的同一图像非常有效,但仅适用于白色背景的图像。
有没有办法以通用的方式应用 Canny?
【问题讨论】:
-
我将尝试使用 THRESH_OTSU 并为您提供更新,变量名为 mGray 因为我将图像转换为灰色,但它不适用于图像阴影,因此我将图像转换为 HSV 并使用饱和通道以获得更好的结果。写一个完整的答案,如果它工作正常,我会接受。还是谢谢你,先生。
-
@HansHirse
THRESH_OTSU没有成功,结果相同。adaptiveThreshold也没有给我带来好的结果。你有什么建议?
标签: java android opencv image-processing opencv4android