检测正方形左上角的简单图像过滤器?

Simple image filter that detects a square's upper left corner?

我正在学习计算机视觉和使用滤镜。一个问题是提出一个过滤器,该过滤器可以检测二值图像中正方形的左上角,其中正方形是黑色背景上的白色。

在 MATLAB 中,我尝试了一个如下所示的过滤器:

ul = [0 0 0; 0 1 1; 0 1 1]

但它似乎并没有给我我想要的。命令 imshow 基本上显示与原始图像相同的图像。

i = imread('white_square_on_black.png');
imshow(imfilter(i, ul, 'conv'));

什么滤镜适合做这个,大体上的原理是什么?

首先,您在过滤后接近同一图像的原因是您的过滤器正在检测其右侧和下方的邻居不为零的所有像素。这包括图像中间的所有像素,因为它们有非零的邻居。

要解决此问题,您需要对左侧或上方的相邻像素不为零的像素进行惩罚。所以我们可以将过滤器更改为:

ul = [-5 -5 -5;
      -5  1  1;
      -5  1  1];

这样一来,即使有一个不需要的像素不为零,它也会强制该值低于零。 (假设您使用的是有符号数字类型。)

如果您在代码中使用此过滤器,您会注意到它突出显示了正方形的右下角。这是因为 conv 在卷积之前翻转内核。您可以通过将 conv 更改为 corr,或者完全删除它,或者预先翻转过滤器来解决这个问题。

我创建了一个测试图像:

然后我使用

创建了过滤图像
sf = (imfilter(img, ul) >= 3);   % make sure we get a full corner