受光照影响的边缘检测

Posted

技术标签:

【中文标题】受光照影响的边缘检测【英文标题】:Edge detection affected by light illumination 【发布时间】:2017-03-07 03:23:09 【问题描述】:

我有这张灰度原始图像:

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

这是我的代码:

    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

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

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

【问题讨论】:

你需要做一些预处理来掩盖它。你能告诉我们更多关于这种照明的信息吗?它总是在同一个地方吗?你能得到一些没有对象的基线图像吗? 嗨@DanMašek,我尝试对图像进行二值化或使用 Otsu 方法但失败了。光源位于物体下方。物体边缘的照明来自光源或光的反射。他们总是在同一个地方。当物体移动时,它会覆盖光源并在边缘发生照明。 尝试在canny edge之前做adaptive thresholding或CLAHE 【参考方案1】:

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

您可以尝试的另一种常用技术是使用distance transform + watershed。距离变换可能会返回您确定在对象内部的(因为对象几乎没有暗区)。 Watershed 将尝试找到与已确认的相连的区域(通过比较梯度)。如果距离变换给出对象内部的多个点,您可能需要在分水岭之后合并多个区域。

【讨论】:

【参考方案2】:

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

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

    调整照明,如果可以的话 获得正确的照明可以解决 50% 的计算机视觉问题。

    使用您对图像、背景或照明的任何了解来去除不必要的边缘。如果相机是静止的,背景减法可以去除背景产生的边缘。如果您知道对象的形状、颜色等,则可以去除与对象不太吻合的边缘。如果很难确定对象的确切属性,您还可以训练一个包含许多照片的机器学习系统来分割图像。

【讨论】:

以上是关于受光照影响的边缘检测的主要内容,如果未能解决你的问题,请参考以下文章

物体检测算法 — 从传统检测方法到深度神经网络框架

Canny边缘检测

sobel边缘检测优缺点与canny算子的优缺点?

图像边缘检测基于matlab模拟退火算法图像边缘检测含Matlab源码 2398期

阿里云物联网边缘计算加载MQTT驱动

OpenCV Canny边缘检测 | 图像轮廓检测 | 直方图均衡化