击中击不中变换

定义

  形态学上的击中或击不中变换是形状检测的基本工具.

   击中击不中变换(HMT)需要两个结构元素B1和B2,合成一个结构元素对B=(B1,B2) 一个用于探测图像内部,作为击中部分;另一个用于探测图像外部,作为击不中部分。显然,B1和B2是不应该相连接的,即B1∩B2=Φ。击中击不中变换的数学表达式为: g(x, y)=hitmiss[f(x, y), B]=erode[f(x, y), B1]AND erode[fc(x, y), B2] 其中,fc(x,y)表示的是f(x,y)的补集。

算法步骤

  击中击不中变换是形态学中用来检测特定形状所处位置的一个基本工具。它的原理就是使用腐蚀;如果要在一幅图像A上找到B形状的目标,我们要做的是:

首先,建立一个比B大的模板W;使用此模板对图像A进行腐蚀,得到图像假设为Process1;

其次,用B减去W,从而得到V模板(W-B);使用V模板对图像A的补集进行腐蚀,得到图像假设为Process2;

然后,Process1与Process2取交集;得到的结果就是B的位置。这里的位置可能不是B的中心位置,要视W-B时对齐的位置而异;

其实很简单,两次腐蚀,然后交集,结果就出来了。

图示

  令每种形状的重心为它的原点。设 D 被包围在一个小窗口 W 中。与 W 有关的 D 的局部背景定义为集合的差 (W-D)。

  如果 B 表示由 D 和 D 的背景构成的集合,则在 A 中对 B 进行的匹配(或匹配操作的集合)表示为:

                 

 

 例子

clc
clear
f=imread('block.png');
imshow(f);
f=rgb2gray(f);
title('击中或不击中原始图像');
B1=strel([0 0 0;0 1 1;0 1 0]);%击中:要求击中所有1的位置
B2=strel([1 1 1;1 0 0;1 0 0]);%击不中,要求击不中所有1的位置
B3=strel([0 1 0;1 1 1;0 1 0]);%击中
B4=strel([1 0 1;0 0 0;0 0 0]);%击不中
B5=strel([0 0 0;0 1 0;0 0 0]);%击中
B6=strel([1 1 1;1 0 0;1 0 0]);%击不中
g=imerode(f,B1)&imerode(~f,B2)%利用定义来实现击中或击不中
figure,subplot(221),imshow(g);
title('定义实现组1击中击不中图像');
g1=bwhitmiss(f,B1,B2);
subplot(222),imshow(g1);
title('结构数组1击中击不中后的图像');
g2=bwhitmiss(f,B3,B4);
subplot(223),imshow(g2);
title('结构数组2击中击不中的图像');
g3=bwhitmiss(f,B5,B6);
subplot(224),imshow(g3);
title('结构数组3击中击不中的图像');

 

   如果我们将B2最后一元素改为1,则结果:

   会发现利用结构数组1并没有检测到形状。

原因:

  我们如果采用B1作为击中结构元:

  可以看到在我们想要确定的正方形其中有击中元素。

  如果采用B2作为击不中变换,把最后一个0改成1:

  可以发现,此时内部并无击不中元素,于是,最后取交集将没有任何元素。

posted @ 2021-01-14 13:26  为红颜  阅读(1803)  评论(0编辑  收藏  举报