受光照影响的边缘检测
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% 的计算机视觉问题。
使用您对图像、背景或照明的任何了解来去除不必要的边缘。如果相机是静止的,背景减法可以去除背景产生的边缘。如果您知道对象的形状、颜色等,则可以去除与对象不太吻合的边缘。如果很难确定对象的确切属性,您还可以训练一个包含许多照片的机器学习系统来分割图像。
【讨论】:
以上是关于受光照影响的边缘检测的主要内容,如果未能解决你的问题,请参考以下文章