检测图片上对象的一角

时间:2016-11-22 16:32:39

标签: c# image-processing

是否有任何算法可以检测图片上对象的一角?我有一个看起来像这样的图片列表:

左上角
enter image description here

右下角
enter image description here

现在在图片1上我希望左上角,在图片2上我期待右下角等等。

我需要的算法应该“确保”图片上的图片绝对是左上角/右下角/等(不仅仅是噪点,例如下图)如果是 - 返回角落的X和Y.

另外一个问题是图片上可能会有一些噪音,例如右下角的图片。还有一个问题是角落的图片可以稍微旋转。

稍微旋转的角落

enter image description here

UPD 我还应该确保图片是我期望的角落图片,因为图片看起来像这样:

噪声

enter image description here

3 个答案:

答案 0 :(得分:3)

我会从图像的角落开始,然后遍历像素,找到最靠近角落的白色像素。然后,当您找到白色像素时,使用泛光填充算法计算您看到的连续白色像素数。如果此像素数高于您的噪声阈值(可能是20像素?),则将此像素视为您的角落。这应该处理稍微旋转的图像。

答案 1 :(得分:2)

您可以考虑使用二维互相关算法。图像互相关通过找到重叠的点(x,y值)来工作,其中两个图像彼此最佳匹配(或相关)(Wikipedia--cross correlation)。考虑到您正在寻找一个角落,您可以将一个简单的盒子与原始图像相关联。如下图所示:

original image with a box with dimension of the same size

然后将框(右上方图像)与原始图像相关联(左上图像以找到最佳重叠点。如下所示:

Cross correlation result

请注意,轴在上图中展开,以显示整个移动的框图像。我的互相关返回了 x = -87 y = 63 的移位值。这意味着当我按这些值移动框时,它最好与原始图像重叠。 那些偏移的值也对应于您正在寻找的角落!只需将x方向的偏移(-87)添加到图像中的行数即可。因此,拐角处于/接近点 x = 152 y = 63 像素。

另请注意,您可以通过在频域中执行互相关来大幅加快此算法的速度(Wikipedia -- Convolution theorem

答案 2 :(得分:1)

我认为@Davids答案的核心是更强大的,如果您所追求的角落可以旋转。但是,不是使用泛光填充算法来确定角落,也许执行低通滤波器会更好。我首先概述了这个过程,然后解释为什么它可能是一个更好的选择。

从原始图像(下图中的左上图)开始,然后通过将其与相同尺寸的2D高斯进行卷积来对其进行过滤。我用sigma = 5构建了我的Gaussian,并将结果绘制在下面的右上方面板中。低通滤波采用二进制图像(由0和1或黑白像素组成)并在周围像素上平滑这些值。因此,由黑色像素围绕的白色像素将具有比其他白色像素附近的白色像素更低的值。现在,您可以设置阈值并仅选择高于阈值的值(左下方面板 - 高于阈值的值为绿色)。现在,您可以使用@Davids建议,找到从图像最左上角到阈值以上的最短距离。最短距离应该是您正在寻找的角落。

Algorithm on Clean Image

现在我建议使用低通滤波器的原因是,如果您对提供的嘈杂图像执行类似的平滑操作并使用相同的阈值,则会得到距离为或非常接近0的距离。下面:

Algorithm on Noise Image

现在可以很容易地放置任意数量的条件以确定图像是否值得找到角落。例如,您可以设置条件绿色像素的总面积高于阈值,确定最小距离你转角等等......当然你必须建立你的高斯低通滤波器并适当选择你的阈值。