大家看这篇博文前可以先看一看下面这篇博文,下面这篇博文是这篇博文的基础:
详解图像形态学操作之图形的腐蚀和膨胀的概念和运算过程,并利用OpenCV的函数erode()和函数dilate()对图像进行腐蚀和膨胀操作

击中击不中变换的最常见作用是去匹配一幅图像中像素的特定结构,比如孤立的前景像素或是线段的端点像素。
简单来说击中击不中变换用于找寻图像中与结构一样的结构,并将找到的结构的中心点的值置为1。

击中击不中变换处理的对像是二值图像,这一点大家要注意。

击中击不中变换的英文缩写为HMT(Hit-Miss Transform)。

其运算规律是:
如果图像中某个区域与结构相同,那么这个区域与结构腐蚀的结果与上这个区域的补集与结构的补集的腐蚀结果是:这个区域的中心点被置为1,这个区域的其它值被置为0。
所以,由此我们定义图像A和结构B的击中击不中变换为以下的运算:

A ⊗ B = ( A ⊖ B ) ∩ ( A c ⊖ B c ) A\otimes B=(A\ominus B )\cap (A^{c}\ominus B^{c}) A⊗B=(A⊖B)∩(Ac⊖Bc)

上面的式子具体表述为:
1 利用结构B对原图像A进行腐蚀变换
2. 利用结构B的补集对图像A的补集进行腐蚀变换。
3. 对上述二者取交集得结果。

从以上叙述我们可以看出,图像中的某区域若与结构相同,那么这个区域的中心点在以下两个运算中的值都为1。
第①个运算为这个区域与结构作腐蚀运算。
第②个运算为这个区域的补集与结构的补集作腐蚀运算。
通过这段叙述大家还可以理解击中击不中变换这个名字的来历:如果某个像素点的击中击不中变换的结果值为1,那么它相当于:
①在上述的第①个运算中被结构B击中了;②在上述的第②个运算中其补集被结构 B c B^{c} Bc击中了,由于是它的补集被结构 B c B^{c} Bc击中了,相当于它本身没有被击中的。这就是击中击不中变换名字的来历。
严格来说,击中和击不中变换是其更准确的名字,但人们称击中或击不中变换更习惯了,所以大家通常见到的名字是“击中或击不中变换”,英文中叫“hit or miss”,比如OpenCV就称其为“hit or miss”,截图如下:

另外,在更高级的应用中,两个腐蚀结构并不一定要是相互补集的,它们可以有某些元素值同为0,而不一定非得是一个为0,另一个为1,这个元素叫不关心元素,即我们在进行结构匹配时这样的元素的像素值并不影响结果,这样就可以提高我们匹配的模糊性。

我们根据上面的叙述用下面的几个实例程序来演示击中击不中变换的运算过程,大家读懂下面的代码并看下运行结果就会对击中击不中变换的运算过程和作用有个完整的理解了。

示例代码一:

# 博主微信/QQ 2487872782
# 有问题可以联系博主交流
# 有图像处理需求也可联系博主
# 图像处理技术交流QQ群 271891601# !/usr/bin/env python
# -*- coding: utf-8 -*-
# OpenCV的版本为4.1import numpy as np
import cv2 as cvA = np.zeros((9, 9), dtype='uint8')
A[3:6, 3:6] = 1
A[3, 3] = 0
A[3, 5] = 0
A[5, 3] = 0
A[5, 5] = 0B = cv.getStructuringElement(cv.MORPH_CROSS, (3, 3))
A_erode = cv.erode(A, B)A_c = abs(A-1)
A_c = A_c//255B_c = abs(B-1)
B_c = B_c//255
A_c_erode = cv.erode(A_c, B_c)# bitwise_and是按位与操作
A_HMT = cv.bitwise_and(A_erode, A_c_erode)

运行结果如下:






从上面的运行结果可以看出,A中和结构B一样的区域的中心被标记为了1。

示例代码二:
示例代码一中的A是下面这样的:

我们在示例代码二中把A改成下面这样,看下能不能检测出A中的B结构。

示例二的代码如下:

# 博主微信/QQ 2487872782
# 有问题可以联系博主交流
# 有图像处理需求也可联系博主
# 图像处理技术交流QQ群 271891601# !/usr/bin/env python
# -*- coding: utf-8 -*-
# OpenCV的版本为4.1import numpy as np
import cv2 as cvA = np.ones((9, 9), dtype='uint8')
A[3, 3] = 0
A[3, 5] = 0
A[5, 3] = 0
A[5, 5] = 0B = cv.getStructuringElement(cv.MORPH_CROSS, (3, 3))
A_erode = cv.erode(A, B)A_c = abs(A-1)
A_c = A_c//255B_c = abs(B-1)
B_c = B_c//255
A_c_erode = cv.erode(A_c, B_c)# bitwise_and是按位与操作
A_HMT = cv.bitwise_and(A_erode, A_c_erode)

运行结果如下:







从上面的运行结果我们可以看出,A中的B结构也被检测出来了。

示例代码三:
示例代码三中我们把A改成下面这样的,结构B不变,结果应该是A没有与结构B相同的区域。

我们用代码测试一下是不是A中没有与结构B相同的区域。

# 博主微信/QQ 2487872782
# 有问题可以联系博主交流
# 有图像处理需求也可联系博主
# 图像处理技术交流QQ群 271891601# !/usr/bin/env python
# -*- coding: utf-8 -*-
# OpenCV的版本为4.1import numpy as np
import cv2 as cvA = np.zeros((9, 9), dtype='uint8')
A[3:6, 3:6] = 1B = cv.getStructuringElement(cv.MORPH_CROSS, (3, 3))
A_erode = cv.erode(A, B)A_c = abs(A-1)
A_c = A_c//255B_c = abs(B-1)
B_c = B_c//255
A_c_erode = cv.erode(A_c, B_c)# bitwise_and是按位与操作
A_HMT = cv.bitwise_and(A_erode, A_c_erode)

运行结果如下:

从结果来看,和我们的预测结果是一样的。

OpenCV4中的函数morphologyEx()的参数op增加了做"击中击不中变换"的可选值,如下:


虽然增加了,但是大家别高兴得太早,根据博主的实测,发现OpenCV4的击中击不变换是有问题的,测试代码如下:

# !/usr/bin/env python
# -*- coding: utf-8 -*-
# OpenCV的版本为4.1import numpy as np
import cv2 as cvA = np.zeros((9, 9), dtype='uint8')
A[3:6, 3:6] = 1B = cv.getStructuringElement(cv.MORPH_CROSS, (3, 3))A_opencv_HMT = cv.morphologyEx(A, cv.MORPH_HITMISS, B)

关于函数morphologyEx()的使用,大家可参考下面这篇博文:
https://blog.csdn.net/wenhao_ir/article/details/124797255
上面的代码运行结果如下:


从上面的A和B来看,A中没有和B相同的结构区域,所以A_opencv_HMT中应该全为0才对,但是上面的结果却不全为0,所以OpenCV中的击中击不中变换操作是有问题的,大家还是根据击中击不中变换操作自己去用腐蚀操作、求补集操作和按位与实现吧。
我另外又测试了几个例子,发现OpenCV中的击中击不中变换操作似乎就只是单纯的腐蚀操作而已。

参考资料:《数字图像处理的MATLAB实现(第2版)》冈萨雷斯著 第9.3.2节,如下图所示:

扩展阅读:
详解图像形态学操作之图形的腐蚀和膨胀的概念和运算过程,并利用OpenCV的函数erode()和函数dilate()对图像进行腐蚀和膨胀操作
图像的形态学开操作(开运算)和闭操作(闭运算)的概念和作用,并用OpenCV的函数morphologyEx()实现对图像的开闭操作
图像的形态学梯度运算(基本梯度、外部梯度、内部梯度、X方向梯度、Y方向梯度)的概念、作用以及相关的OpenCV示例代码
图像形态学操作之顶帽操作(TopHat)与黑帽操作(BlackHat)

详解图像形态学中的击中击不中变换操作(HMT),并提醒大家OpenCV4中的击中击不中变换操作是有问题的相关推荐

  1. 详解图像形态学操作之图形的腐蚀和膨胀的概念和运算过程,并利用OpenCV的函数erode()和函数dilate()对图像进行腐蚀和膨胀操作

    图像形态学中两种最基本的操作就是对图形的腐蚀和膨胀,可以说,形态学中的中高级操作都是建立在这两种操作之上.通过这两种基本的运算可以去除图像中的噪声,分割出独立的区域或者将两个区域连接在一起. 关于图像 ...

  2. 【Matplotlib】详解图像各个部分

    转自:https://www.cnblogs.com/nju2014/p/5620776.html [Matplotlib]详解图像各个部分 首先一幅Matplotlib的图像组成部分介绍. 在mat ...

  3. js点击取消按钮关闭当前弹框_UI设计中“取消按钮”的分析详解

    按钮,无论是在 Web 还是 App 上都被广泛地使用,而很少有设计师会注意到按钮当中的细节,导致在设计过程中出现一些低级的错误,使得用户在完成任务的过程中产生阻碍,无法顺利达成目的. 在许多优秀的产 ...

  4. 【OpenCV 4开发详解】形态学应用

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  5. OpenCV4萌新之路——详解图像读取函数 “imread”

    OpenCV4萌新之路--详解图像读取函数 "imread" 一.函数简析 二.参数详解 1.String& filename 2.flags = IMREAD_COLOR ...

  6. 零基础多图详解图神经网络(GNN/GCN)【论文精读】

    视频链接:零基础多图详解图神经网络(GNN/GCN)[论文精读] - 哔哩哔哩 (bilibili.com) 博客链接:A Gentle Introduction to Graph Neural Ne ...

  7. python爬虫模拟点击下拉菜单和_python+selenium爬虫过程中的模拟点击问题

    题目描述 下拉菜单选项无法提取成列表以及不能够被点击,请帮忙分析看一下什么原因 题目来源及自己的思路 对于app移动掌上营业厅抓包后,PC端的爬虫过程. 第一步:进入首页,点击"更多&quo ...

  8. 基于列表框的简单选课窗体开发。编写Windows应用程序,设计实现一个简单选课系统,要求:(1)点击“添加”按钮,将把在第一文本框中的输入的课程名称添加到左边的列表框中,且所添加的课程不能为空,不能

    基于列表框的简单选课窗体开发.编写Windows应用程序,设计实现一个简单选课系统,要求: (1)点击"添加"按钮,将把在第一文本框中的输入的课程名称添加到左边的列表框中,且所添加 ...

  9. Android自定义控件3:带边框点击背景变色的textview,原型是支付宝手机充值中话费充值按钮

    一.原型:支付宝手机充值中话费充值按钮. 二.实现效果: 三.在res/drawable下面创建两个xml: custom_border_txt_bg.xml用户可点击时,点击切换背景 custom_ ...

最新文章

  1. 汉字转换成html,汉字与16进制、汉字与Html转义符的转换
  2. [置顶] 如何搭建一个 Data Guard 环境
  3. jquery源码解析:each,makeArray,merge,grep,map详解
  4. 详解Java解析XML的四种方法
  5. HDU-5723 Abandoned country
  6. 使用Android SDK Manager下载sdk时总是出现中断异常的解决办法。
  7. CodeForces - 1355C Count Triangles(数学)
  8. RPC调用和HTTP调用的区别你知道吗
  9. 通过 Continual Learning 提高 ML.NET 模型准确性并增强性能
  10. [js] 写一个 document.querySelector 的逆方法
  11. 移动云亮相 2021 IDC 年度盛典 共话变革与赋能
  12. 【MySQL】MySQL 8不支持查询缓存
  13. 关于“Fluent UI”或Ribbon Design报道的补充说明
  14. 无碳小车 matlab,无碳小车的创新设计及MATLAB,SOLIDWORKS,CATIA仿真
  15. LBP特征提取原理和python库代码
  16. wps android 特色功能,WPS Office手机版
  17. 剧情插件Cutscene Creator uSequencer 1.3.7.1使用说明一
  18. 智慧产业园区综合解决方案
  19. vlan的理解以及华为access、trunk、hybrid三种链路对比
  20. 【Keil】十字路口车辆行人红绿灯实现 _单片机Keil开发

热门文章

  1. linux分区多个挂载点,linux – 将分区挂载到两个挂载点
  2. mac误删相片怎么恢复?
  3. 【Python】pyqt6入门到入土系列,非常详细...
  4. 服务器网站集成环境哪个好,如何搭建Web服务器之集成环境
  5. canvas绘图中的图片组合
  6. Mysql中表的创建、修改与删除
  7. POI兴趣点在地图显示上进行聚合算法的研究
  8. hdu 动态规划(46道题目)倾情奉献~ 【只提供思路与状态转移方程】(转)
  9. 机器学习之sklearn官网初探之Quick-start
  10. 我家云刷android系统教程,我家云刷机教程——小白详细版