击中和击不中变换
击中和不击中变换是形态学形状检测的基本工具
方法步骤:
- 有两个不相交的集合B={B1,B2},B称为复合结构元素
- 假设有一幅图像要检测边缘,假设被检测物体为黑色部分,称为X
- 用B1去腐蚀X,然后用B2去腐蚀X的补集,得到的结果相减就是击中击不中变换
- 先用B1腐蚀黑色的部分,再用B2腐蚀黑色以外的部分
浅绿色为B1腐蚀后黑色部分的剩余
深绿色为B2腐蚀后黑色部分以外区域的剩余
原理和解释:
- 击中-击不中结构是用来检测形状的,不是提取边界的。
- 用击中结构去腐蚀原始图像得到击中结果X(这个过程可以理解为在原始图像中寻找和击中结构完全匹配的模块,匹配上了之后,保留匹配部分的中心元素,作为腐蚀结果的一个元素)
- 然后用击不中结构去腐蚀原始图像的补集得到击不中结果Y(即在原始图像上找到击不中结构与原始图像没有交集的位置,这个位置的元素保留,作为腐蚀结果的一个元素)
- 取X和Y的交集就是击中-击不中的结果。
- 通俗理解就是:用一个小的结构元素(击中结构)去射击原始图像,击中的元素保留;再用一个很大的结构元素(击不中,一般取一个环状结构)去射击原始图像,击不中原始图像的位置保留。满足击中元素能击中and击不中元素不能击中的位置的元素就是最终的形状结果。
参考:https://blog.csdn.net/horseinch/article/details/50127955
在matlab中的使用举例:
f=imread('resource/hitmiss.tif'); imshow(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('定义实现第一组击中击不中变换'); g1=bwhitmiss(f,B1,B2); subplot(222),imshow(g1); title('bwhitmiss函数实现第一组击中击不中变换'); g2=bwhitmiss(f,B3,B4); subplot(223),imshow(g2); title('bwhitmiss函数二组击中击不中变换'); g3=bwhitmiss(f,B5,B6); subplot(224),imshow(g3); title('bwhitmiss函数第三组击中击不中变换');
参考:
https://www.cnblogs.com/tornadomeet/archive/2012/03/20/2408086.html