【问题标题】:How to detect image edges with different contrast and background color using Opencv?如何使用 Opencv 检测具有不同对比度和背景颜色的图像边缘?
【发布时间】: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?

【问题讨论】:

  • 您使用threshold50 的固定阈值。尝试使用THRESH_OTSU 选项(请参阅doc)。或者,您可以尝试adaptiveThreshold (doc)。另外,这是Imgproc.cvtColor(mRGBA, mGray, Imgproc.COLOR_RGB2HSV); 的意图吗?您的变量名为 mGray,但您转换为 HSV!?
  • 我将尝试使用 THRESH_OTSU 并为您提供更新,变量名为 mGray 因为我将图像转换为灰色,但它不适用于图像阴影,因此我将图像转换为 HSV 并使用饱和通道以获得更好的结果。写一个完整的答案,如果它工作正常,我会接受。还是谢谢你,先生。
  • @HansHirse THRESH_OTSU 没有成功,结果相同。 adaptiveThreshold 也没有给我带来好的结果。你有什么建议?

标签: java android opencv image-processing opencv4android


【解决方案1】:

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

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

并且我删除了图像阈值。

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

    CLAHE clahe = Imgproc.createCLAHE();

    clahe.setClipLimit(1);

    clahe.apply(mGray, mGray);

【讨论】:

    猜你喜欢
    • 2020-08-17
    • 1970-01-01
    • 2014-12-22
    • 2020-06-15
    • 1970-01-01
    • 2014-11-14
    • 2020-12-16
    • 2018-11-14
    • 1970-01-01
    相关资源
    最近更新 更多