击中击不中变换的简化版(其实就是模板匹配)

今天看了击中击不中变换,发现很多地方说的比较模糊,比较常见的说法是:

(集合X为原二值化图像的像素集合,对X取反求得~X(非X, Y表示), 选择的结构元为s1, 对结构元s1取反的结构元为s2)

首先对用s1对X进行腐蚀得到A1,, 用s2对Y(即~X)进行腐蚀得到A2。最终结果C = A1 & A2。

嘟噜嘟噜一大堆话直接把人说晕了,然后在知乎上看到这样的回答“就是一个完全的模板匹配过程”,我仔细想了一下,按照上面的说法,如果结构元s2是s1的取反的话,就是这么回事,简直是无语。

只是模板匹配的话只用卷积就能实现,代码如下

  1. sse1 = int8(se1);
  2. sse1(~se1) = -1;
  3. sse1 = rot90(sse1 , 2);
  4. ac = conv2(aa , sse1 , 'same');
  5. ao = (ac == sum(sum(se1)));

复制代码

aa原图,se1是需要匹配的模板,对比MATLAB自带的击中击不中变换函数,整个代码如下:

  1. aa = false(10,10);
  2. aa(1:7,:) = true;
  3. aa(4,5) = false;
  4. aa(1,1) = false;
  5. aa(:,2:3) = false;
  6. se1 = false(3,3);
  7. se1(1:3,3) = true;
  8. se2 = ~se1;
  9. ao = bwhitmiss(aa, se1, se2);
  10. figure;
  11. imshow(aa);
  12. figure;
  13. imshow(se1);
  14. figure;
  15. imshow(ao);
  16. sse1 = int8(se1);
  17. sse1(~se1) = -1;
  18. sse1 = rot90(sse1 , 2);
  19. ac = conv2(aa , sse1 , 'same');
  20. ao = (ac == sum(sum(se1)));
  21. figure;

  22. imshow(ao);

复制代码

图太麻烦就不贴了,有兴趣的自己复制下来运行一下就可以了。
需要注意的是,与腐蚀一样, bwhitmiss函数把图像外的区域识别为1,而我的方法默认为0,所以结果并不完全一样。
另外有需要的话还能计算匹配程度,ac就是 匹配程度 的矩阵,加个 sum(sum(se1))然后除以2就可以得到适应度为0~ sum(sum(se1))的 匹配程度 矩阵了。
bwhitmiss有意义的地方可能在于se2不是se1的取反的情况,不过我并没有看到有关这种情况的介绍,也不知道这种情况的用途,所以有大神看到的话希望能指点一二。如果有不对的地方,也欢迎大家批评指正。

你可能感兴趣的:(图像处理)