如何使用Opencv检测具有不同对比度和背景色的图像边缘?

时间:2019-03-08 11:00:46

标签: java android opencv image-processing opencv4android

我正在开发一个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)));

这是第一个示例图像

enter image description here

处理结果

enter image description here

这是第二张样本图片

enter image description here

这是结果

enter image description here

我必须指出一个事实,如果取消图像阈值处理,该算法可以完美地适用于具有不同光强度和不同对比度的同一图像,但仅适用于具有白色背景的图像。

是否可以通用方式应用Canny?

1 个答案:

答案 0 :(得分:0)

通过使用Opencv的 CLAHE 技术,我将所有图像类型的图像都获得了更好的结果,剪辑限制为1,从而增强了图像对比度。

当然,剪辑限制变量取决于应用程序,并且1对我而言几乎是完美的。

我删除了图像阈值。

这是我在应用 GaussianBlur 之前添加的内容:

    CLAHE clahe = Imgproc.createCLAHE();

    clahe.setClipLimit(1);

    clahe.apply(mGray, mGray);