击中和击不中变换

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

方法步骤:

  • 有两个不相交的集合B={B1,B2},B称为复合结构元素
  • 假设有一幅图像要检测边缘,假设被检测物体为黑色部分,称为X
  • 用B1去腐蚀X,然后用B2去腐蚀X的补集,得到的结果相减就是击中击不中变换

9e7c022bf60f0d07c2d59bb47e371692.png

  • 先用B1腐蚀黑色的部分,再用B2腐蚀黑色以外的部分

2375014b2d3b3f3c5eb953841f1834db.png
浅绿色为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函数第三组击中击不中变换');

 

0c7faa064f3e5b402ab082386a568dff.png
05f27062d61c1fba76cb073924152a3c.png

参考:
https://www.cnblogs.com/tornadomeet/archive/2012/03/20/2408086.html

posted @ 2019-10-27 10:22  AsahiLock  阅读(1995)  评论(0编辑  收藏  举报