我学习计算机视觉和玩过滤器。一个问题是提出一个过滤器,它可以检测二进制图像中方形的左上角,其中正方形在黑色背景上是白色的。
在MATLAB中,我尝试了一个如下所示的过滤器:
ul = [0 0 0; 0 1 1; 0 1 1]
但它似乎没有给我我想要的东西。命令imshow
基本上显示与原始图像相同的图像。
i = imread('white_square_on_black.png');
imshow(imfilter(i, ul, 'conv'));
这样做的正确过滤器是什么,一般原理是什么?
答案 0 :(得分:3)
首先,您在过滤后接近同一图像的原因是您的过滤器正在检测右侧和右侧的邻居非零的所有像素。这包括位于图像中间的所有像素,因为它们具有非零的邻居。
要解决此问题,您需要惩罚一个像素,如果它的左边或上面的邻居是非零的。所以我们可以将过滤器更改为:
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