计算边缘强度仅降低

时间:2014-08-27 16:56:00

标签: c++ opencv image-processing computer-vision edge-detection

我想在我的图像中找到边缘,特别是从亮到暗的强度垂直变化。这可能吗?我正在OpenCV中使用Canny / Sobel边缘探测器,但是他们正在拾取强度增加的边缘,这是我不想要的。

2 个答案:

答案 0 :(得分:0)

您可以编写自定义过滤器并使用cvFilter2D(2D卷积)。

举一个非常简单的例子,卷积核{1 0 -1; 1 0 -1; 1 0 -1}是一个3x3滤镜,可以突出从左到右的强度降低。您可以将结果阈值化以获得边缘。

您必须选择正确的内核大小以及正确的值,以适合您的图像。

Here是一个很好的链接,展示了如何使用cvFilter2d:

答案 1 :(得分:0)

一旦你理解了这些过滤器在数学上做了什么,很明显你需要改变什么。这必须在管道中。在他的回答中,Totoro已经指出你可以通过你自己的过滤器来运行。

Sobel边缘检测首先在图像上运行两个滤镜。这些滤镜在X和Y方向上给出图像的渐变。边缘和渐变的关联方式是,大幅度的渐变意味着图像有很多变化,这表明边缘!

因此,Sobel算法的下一步(iirc)是找到梯度的大小。最后,您可以对此进行阈值处理,仅将图像中的大变化视为边缘。最后,沿着边缘方向进行边缘细化和滞后阈值处理,但这不是很重要。

您希望与Sobel算法不同的重要步骤是您关心 direcction 的变化。如果从X和Y渐变(使用正弦和余弦)计算变化方向,则可以过滤出仅沿所需方向前进的边缘。

如果你只关心垂直变化,你可以运行一个卷积内核来计算沿水平方向的渐变并只取正值。所有正值都表明从浅到深有垂直变化。如果您愿意,您可以像索贝尔那样执行以下处理步骤。