我有灰度的原始图像:
我想检测对象的边缘。但是,它受边缘附近的照明影响。这是我在高斯模糊和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
光源位于物体下方。物体边缘的照明来自光源或光的反射。他们总是在同一个地方。
照明也被检测为边缘。我已经尝试了其他几种方法,例如连接组件标记和用示例代码(这里是初学者)二进制化图像,但是可以使用。有没有办法检测干净的边缘照明?
答案 0 :(得分:1)
背景光补丁可以使用一些具有相当大内核的erosion来移除,因为该对象比光补丁大得多
您可以尝试的另一种常用技巧是使用distance transform + watershed。距离变换可能会返回您确定在对象内的点(因为对象具有很少的暗区)。 Watershed将尝试查找已连接的区域(通过比较渐变)与已确认的点。如果距离变换在对象内部给出多个点,则可能需要在分水岭之后组合多个区域。
答案 1 :(得分:0)
完全摆脱这个问题是不可能的。边缘检测器可以检测到的是由于物体中的边缘而导致的强度变化。鉴于你在那里的照明,由照明引起的变化是非常突出的。
我建议两种方法来解决这个问题:
如果可以的话,调整光线 正确照明解决了任何计算机视觉问题的50%。
使用您对图像,背景或光照的任何知识来删除不必要的边缘。如果相机静止,则背景减法可以消除背景产生的边缘。如果您知道对象的形状,颜色等,则可以删除与对象不相适应的边缘。如果确定对象的确切属性太难了,您还可以使用许多照片训练机器学习系统,以分割图像。