首页 > 解决方案 > 如何使用 Opencv 检测具有不同对比度和背景颜色的图像边缘?

问题描述

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

标签: javaandroidopencvimage-processingopencv4android

解决方案


通过使用 Opencv 的CLAHE技术,我设法在所有类型的图像上获得更好的结果,以增强图像对比度,剪辑限制为 1。

当然,剪辑限制变量取决于应用程序,1 对我来说几乎完美。

我删除了图像阈值。

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

    CLAHE clahe = Imgproc.createCLAHE();

    clahe.setClipLimit(1);

    clahe.apply(mGray, mGray);

推荐阅读