我正在开发一个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?
答案 0 :(得分:0)
通过使用Opencv的 CLAHE 技术,我将所有图像类型的图像都获得了更好的结果,剪辑限制为1,从而增强了图像对比度。
当然,剪辑限制变量取决于应用程序,并且1对我而言几乎是完美的。
我删除了图像阈值。
这是我在应用 GaussianBlur 之前添加的内容:
CLAHE clahe = Imgproc.createCLAHE();
clahe.setClipLimit(1);
clahe.apply(mGray, mGray);