边缘检测受光照影响

时间:2017-03-07 03:23:09

标签: c++ opencv edge-detection connected-components canny-operator

我有灰度的原始图像:

enter image description here

我想检测对象的边缘。但是,它受边缘附近的照明影响。这是我在高斯模糊和Canny边缘检测之后获得的:

enter image description here

这是我的代码:

    cv::cvtColor(imgOriginal, imgGrayscale, CV_BGR2GRAY);       // convert to grayscale

    cv::GaussianBlur(crop,                  // input image
        imgBlurred,                         // output image
        cv::Size(5, 5),                     // smoothing window width and height in pixels
        5);                                 // sigma value, determines how much the image will be blurred

    cv::Canny(imgBlurred,           // input image
        imgCanny,                   // output image
        0,                          // low threshold
        100);                       // high threshold

光源位于物体下方。物体边缘的照明来自光源或光的反射。他们总是在同一个地方。

照明也被检测为边缘。我已经尝试了其他几种方法,例如连接组件标记和用示例代码(这里是初学者)二进制化图像,但是可以使用。有没有办法检测干净的边缘照明?

2 个答案:

答案 0 :(得分:1)

背景光补丁可以使用一些具有相当大内核的erosion来移除,因为该对象比光补丁大得多

您可以尝试的另一种常用技巧是使用distance transform + watershed。距离变换可能会返回您确定在对象内的(因为对象具有很少的暗区)。 Watershed将尝试查找已连接的区域(通过比较渐变)与已确认的。如果距离变换在对象内部给出多个点,则可能需要在分水岭之后组合多个区域。

答案 1 :(得分:0)

完全摆脱这个问题是不可能的。边缘检测器可以检测到的是由于物体中的边缘而导致的强度变化。鉴于你在那里的照明,由照明引起的变化是非常突出的。

我建议两种方法来解决这个问题:

  1. 如果可以的话,调整光线 正确照明解决了任何计算机视觉问题的50%。

  2. 使用您对图像,背景或光照的任何知识来删除不必要的边缘。如果相机静止,则背景减法可以消除背景产生的边缘。如果您知道对象的形状,颜色等,则可以删除与对象不相适应的边缘。如果确定对象的确切属性太难了,您还可以使用许多照片训练机器学习系统,以分割图像。