【问题标题】:Pre processing image before applying Canny Edge detection在应用 Canny 边缘检测之前预处理图像
【发布时间】:2016-06-25 15:55:12
【问题描述】:

我有一张下面房间的图像,我想检测所有墙壁边缘。我尝试了很多不同的过滤器组合(双边、高斯、拉普拉斯等),最好的组合似乎如下,

  • 将图像转换为灰度
  • 应用双边过滤器
  • 运行 Canny 边缘检测过程
  • 再应用两个双边滤波器以去除任何噪声
  • 应用膨胀过滤器“堵塞”边缘上的任何孔

我遇到的问题是,无论我尝试过什么,我都无法获得一个明显的直边,它穿过靠近天花板的墙壁。我尝试了多种技术来尝试使边缘变暗,但无济于事。应用商店中有一个应用程序可以检测到这个边缘,所以我知道它可以完成,我只是不确定我需要应用哪些预处理过滤器,希望有人能指出我正确的方向。

cv::Mat edgeFrame;
cv::Mat grayImage;
cv::Mat blurFrame;
outputFrame=inputFrame.clone();

getGray(inputImage, grayImage);
cv::bilateralFilter(grayImage, blurFrame, 9,80, 80);
cv:Canny(blurFrame, edgeImage,100, 110,5);
cv::bilateralFilter(edgeImage, blurFrame, 21 , 80, 80);
cv::bilateralFilter(blurFrame, edgeImage,21, 100, 150);
int dilation_size =1;
Mat element = getStructuringElement( MORPH_ELLIPSE,
                                    Size( 2*dilation_size + 1, 2*dilation_size+1 ),
                                    Point( dilation_size, dilation_size ) );
dilate( edgeImage, outputFrame, element );

【问题讨论】:

  • 应该实时处理吗?或者你可以花(几?)秒?
  • 试试饱和度或蓝色通道。
  • @Miki - 不必实时完成,几秒钟是可以接受的。
  • @Piglet - 我已经尝试增加饱和度,但变化不大,我会尝试增加蓝色通道,看看结果如何。
  • @WagglyWonga 增加饱和度和蓝色是什么意思?创建灰色图像时会丢失信息。因此尝试在单独的通道中进行边缘检测并结合结果。除了JPG,你能得到别的东西吗?我看了那张图片,在色调通道中有一些非常难看的压缩伪影

标签: opencv computer-vision canny-operator


【解决方案1】:

问题在于这些边缘的阴影,这是由于照明完全来自通过窗户的太阳,并且房间内没有光源。而且图片比较暗,所以它的直方图会集中在下边。话虽如此,我将应用直方图均衡作为第一步,将强度分布在 0-255 的整个范围内,然后在 canny 内应用相对较大的 sigma(高斯模糊)以抑制高频边缘。

更新: 1)灰度值

2) histeq

3) 精明的

确实,虽然 histeq 增加了对比度,但它在这里无济于事,因为在门上方的那个区域,梯度几乎为零,正如您从第二张图片中看到的那样。

【讨论】:

  • 你真的尝试过吗?如果是这样,您可以发布您的代码和结果吗?或者这只是一个猜测?
  • 我不使用open CV,但稍后会在Matlab上检查并在此处提供更新。
  • 不错!我很好奇;D
  • @Settembrini 谢谢,我尝试过检测和消除图像中的阴影/反射,但我不是这方面的专家,所以只是反复试验。我将尝试使用直方图均衡的方法,看看是否可行。
  • @Settembrini 在问题区域从天花板到墙壁的过渡非常平滑,以至于基于梯度的方法不会找到边缘,因为梯度非常低。直方图均衡应该如何帮助?您不能向图像添加信息。你可以改变它。直方图均衡化主要是为了提高人眼的可见度。它在这里根本没有帮助。如果您的图像不好,那么现在世界上的预处理将改变这一点。
猜你喜欢
  • 2011-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-13
  • 2014-03-30
  • 2017-04-22
相关资源
最近更新 更多