1

我有这个灰度原始图像:

在此处输入图像描述

我想检测物体的边缘。但是,它会受到边缘附近照明的影响。这是我在高斯模糊和 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

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

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

4

2 回答 2

1

背景光斑可以使用相当大的内核进行一些腐蚀来移除,因为对象比光斑大得多

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

于 2017-03-08T08:22:42.463 回答
0

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

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

  1. 调整照明,如果你能够获得正确的照明解决任何计算机视觉问题的 50%。

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

于 2017-03-08T07:12:29.353 回答