在应用Canny边缘检测之前预处理图像

7
我有一张房间的图片,想要检测所有的墙壁边缘。我尝试了许多不同的滤波器组合(双边、高斯、拉普拉斯等),最好的组合似乎是以下步骤:
  • 将图像转换为灰度
  • 应用双边滤波器
  • 运行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 );

enter image description here

enter image description here


处理应该实时完成吗?还是可以花费几秒钟? - Miki
1
尝试饱和度或蓝色通道。 - Piglet
@Miki - 不必实时完成,几秒钟是可以接受的。 - WagglyWonga
@Piglet - 我已经尝试增加饱和度,但效果不大,我会尝试增加蓝色通道,看看结果如何。 - WagglyWonga
@WagglyWonga,你说的增加饱和度和蓝色是什么意思? 创建灰度图像时会丢失信息。因此,请尝试在单独的通道中进行边缘检测并合并结果。 你能用除了Jpg以外的其他格式吗?我看了一下那张图片,在色调通道中有一些相当丑陋的压缩伪影。 - Piglet
@Piglet 对不起,我误解了你的意思。我只在蓝色通道上应用了边缘检测,并得到了更好的结果,但我仍然无法捕捉到从天花板到工作台的垂直边缘,我认为这与房间中的阴影有关。稍后我会尝试上传带有代码的图片。 - WagglyWonga
1个回答

1
问题在于边缘处的阴影,这是由于照明完全来自窗户外的阳光,并且房间内没有光源。此外,图片相对较暗,因此其直方图将集中在较低的一侧。说了这些,我会首先应用直方图均衡化,以将强度分布到整个范围0-255之间,然后在Canny算法中应用相对较大的sigma(高斯模糊),以抑制高频边缘。
更新: 1)灰度值 enter image description here
2)直方图均衡化 enter image description here 3)Canny算法 enter image description here

确实,虽然直方图均衡化可以增加对比度,但在门上方的那个区域中,由于梯度几乎为零,它无法起到帮助作用,从第二张图片中可以清楚地看到这一点。


你有实际尝试过吗?如果是的话,你能否发布你的代码和结果?还是这只是一个猜测? - Miki
我不使用OpenCV,但稍后会在Matlab上检查并在此更新。 - Settembrini
不错!我很好奇 ;D - Miki
@Settembrini 谢谢,我尝试过检测和去除图像中的阴影/反射,但我在这个领域不是专家,所以只是试错。我会尝试你的直方图均衡化方法,看看是否有效。 - WagglyWonga
@Settembrini 在问题区域天花板到墙壁的过渡非常平滑,梯度方法无法找到边缘,因为梯度非常低。直方图均衡化应该如何帮助解决这个问题?你不能向图像添加信息,只能改变它。直方图均衡化主要是为了改善人眼的可见性,在这里完全没有帮助。如果你的图像现在很糟糕,预处理也无法改变这一点。 - Piglet
@piglet,我同意Settembrini看的那条边可能太微弱了无法检测到,但是从工作台到天花板的垂直边缘在另一个应用程序中被检测到了,我认为他们必须通过某种方式去除阴影才能得到一条直线的边缘。 - WagglyWonga

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接