9.2.2 Python图像处理之图像数学形态学-二值形态学应用-目标检测(击中与击不中)

文章目录

  • 9.2.2 Python图像处理之图像数学形态学-二值形态学应用-目标检测(击中与击不中)
    • 1 算法原理
    • 2 代码
    • 3 效果

1 算法原理

采用击中与击不中来进行目标检测

击中击不中变换定义

击中击不中变换(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)的补集。

Hit-miss示意图

已知A,B:在A图中寻找B图所示的图像目标的位置。

4步:

1 确定结构元素

既然是寻找图B所示形状,选取H为图B所示的形状。再选一个小窗口W,W包含H,M=W-H。如下图所示:

2,求H对待检测A的腐蚀

3、求M对A补集的腐蚀

4、求2,3步结果的交集得到目标图案的位置

2 代码

运行代码说明

1.要改变代码中的图片地址(地址不能有中文)

更改65-66行的图片地址

2.注意最后的plt.savefig('1.new.jpg')是保存plt图像,如果不使用可以注释掉

代码依赖包:

matplotlib  3.4.2
numpy  1.20.3
opencv-python  4.1.2.30
# pip安装
pip install matplotlib numpy opencv-python
import cv2
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = Falsedef plt_show_opcv(title, image):'''显示结果图像,只有一个图像:param title::param image::return:'''if image.shape.__len__() == 3:plt.imshow(image[:, :, ::-1])else:plt.imshow(image, cmap='gray')plt.title(title)plt.savefig(title + "Target_Detection.jpg")plt.show()def pme(titles, images, rc=None):'''显示多张图像在一个画布:param titles::param images:要显示图像的列表:param rc::return:'''row = Nonecol = Noneif rc is None:length = len(titles)row = int(np.sqrt(length))col = int(length / row)if length - row - col > 0:row += 1else:row = rc[0]col = rc[1]for i in range(len(titles)):plt.subplot(row, col, i + 1), plt.imshow(images[i], 'gray')plt.title(titles[i])plt.savefig(titles[1]+"Target_Detection.jpg")plt.show()def hmt(a, b):b1 = ~b  # 补集b2 = ba1 = ~aa2 = apme(["原图补集", "原图", "目标图形补集", "目标图形原图"],[a1, a2,b1, b2])x1_erode_b1 = cv2.erode(a1, b1)# 补集腐蚀x2_erode_b2 = cv2.erode(a2, b2)  # 正常腐蚀r = cv2.bitwise_and(x1_erode_b1, x2_erode_b2)pme(['补集之间腐蚀', '正常图像腐蚀',"最后腐蚀结果"], [x1_erode_b1, x2_erode_b2,r])return rimage_X = cv2.imread("jiance2.png", 0)  # 待检测的图像
image_B = cv2.imread("shuzi2.png", 0)  # 模板图像ret1, image_X = cv2.threshold(image_X, 127, 255, cv2.THRESH_BINARY)
ret2, image_B = cv2.threshold(image_B, 127, 255, cv2.THRESH_BINARY)re = hmt(image_X, image_B)targets = []
for i in range(re.shape[0]):for j in range(re.shape[1]):if re[i][j]:targets.append((j, i))print(i, j)for target in targets:image_X = cv2.drawMarker(image_X, target, 125, markerType=cv2.MARKER_CROSS, markerSize=20, thickness=3)
plt_show_opcv("十字标记目标", image_X)

3 效果

使用击中与击不中原理来检测目标,这个我只在方方正正的目标和图像中实现了,其他复杂图像没能成功。

我实验的待检测的图片,左上角的黑色正方形是要检测的目标图案

模板图案:


结果图像

原图Target_Detection.jpg

正常图像腐蚀Target_Detection.jpg

目标结果图像

9.2.2 Python图像处理之图像数学形态学-二值形态学应用-目标检测相关推荐

  1. 9.2.1 Python图像处理之图像数学形态学-二值形态学应用之噪声消除

    9.2.1 Python图像处理之图像数学形态学-二值形态学应用之噪声消除 文章目录 9.2.1 Python图像处理之图像数学形态学-二值形态学应用之噪声消除 1 算法原理 2 代码 3 效果 1 ...

  2. 9.2.3 Python图像处理之图像数学形态学-二值形态学应用-区域填充

    9.2.3 Python图像处理之图像数学形态学-二值形态学应用-区域填充 文章目录 9.2.3 Python图像处理之图像数学形态学-二值形态学应用-区域填充 1 算法原理 2 代码 3 效果 1 ...

  3. 9.1 Python图像处理之图像数学形态学-二值形态学(腐蚀、膨胀、开启、闭合)

    9.1 Python图像处理之图像数学形态学-二值形态学(腐蚀.膨胀.开启.闭合) 文章目录 9.1 Python图像处理之图像数学形态学-二值形态学(腐蚀.膨胀.开启.闭合) 1 算法原理 1.1 ...

  4. 9.4 Python图像处理之图像数学形态学-基于灰度形态学的应用(形态梯度、形态平滑、高帽变换、低帽变换)

    9.4 Python图像处理之图像数学形态学-基于灰度形态学的应用(形态梯度.形态平滑.高帽变换.低帽变换) 文章目录 9.4 Python图像处理之图像数学形态学-基于灰度形态学的应用(形态梯度.形 ...

  5. 9.3 Python图像处理之图像数学形态学-灰度形态学

    9.3 Python图像处理之图像数学形态学-灰度形态学 文章目录 9.3 Python图像处理之图像数学形态学-灰度形态学 1 算法原理 2 代码 3 效果 1 算法原理 灰度图像与二值图像的区别在 ...

  6. 【图像处理】——图像的二值化操作及阈值化操作(固定阈值法(全局阈值法——大津法OTSU和三角法TRIANGLE)和自适应阈值法(局部阈值法——均值和高斯法))

    目录 一.二值化的概念(实际上就是一个阈值化操作) 1.概念: 2.实现方法 3.常用方法 二.阈值类型 1.常见阈值类型(主要有五种类型) (1)公式描述 (2)图表描述 2.两种特殊的阈值算法(O ...

  7. 利用python opencv实现图像自适应二值化

    对灰度图像利用阈值得到一个二值化的图像,是常最常用的图像处理技术之一.例如,灰度大于127的图像设置为1.小于127的设置为0,这种处理便是固定阈值127的二值化处理. 自适应的二值化处理不同于固定阈 ...

  8. 8.3 Python图像处理之图像典型分割-分水岭分割

    8.3 Python图像处理之图像典型分割-分水岭分割 文章目录 8.3 Python图像处理之图像典型分割-分水岭分割 1 算法原理 2 代码 3 效果 1 算法原理 分水岭概念是以对图像进行三维可 ...

  9. 8.1 Python图像处理之图像典型分割-SUSAN边缘检测

    8.1 Python图像处理之图像典型分割-SUSAN边缘检测 文章目录 8.1 Python图像处理之图像典型分割-SUSAN边缘检测 1 算法原理 2 代码 3 效果 1 算法原理 SUSAN 的 ...

最新文章

  1. [转自脚本之家] Javascript cookie 详解
  2. 欧瑞变频器800参数设置_【收藏】变频器密码大全和维修常用方法!
  3. linux系统分区不,其中,不属于Linux系统分区的是()。
  4. C# datagridview、datagrid、GridControl增加行号
  5. oracle 查询不同编号的时间最小记录_投稿 | ORACLE amp; PostgreSql 利用伪列删除完全重复的两行...
  6. mysql 时间戳 2038_mysql数据库的timestamp为什么从1970到2038的某一时间?某一时间是指什么时间?过了这个时间之后怎么办?-问答-阿里云开发者社区-阿里云...
  7. 6-3 递增的整数序列链表的插入 (10 分)
  8. VMware Harbor现已加入Rancher社区Catalog
  9. 用C为密集运算函数加速
  10. 二进制炸弹--拆弹实验
  11. XMind12周的学习使用-变成厉害的人成长记录
  12. 苹果7服务器是什么系统版本,最新系统 iOS14.7 Beta1 版本推出!
  13. Git分支 查看branch 创建 切换checkout 合并merge(先切回主分支) 删除branch -d 推送push
  14. 广义Pareto分布---极值理论的学习3
  15. 解决ios以及mac yyyy-MM-dd HH:mm:ss格式不兼容
  16. Python基础从0到1自我学习(3)
  17. C# Chart 曲线(多曲线展示)
  18. 【学习笔记】商业数据分析
  19. 日历函数单元 (转)
  20. html格子像素画,html – rotateY()文本模糊/像素化

热门文章

  1. Docker Images Containers
  2. EI主题词新版界面查询-Engineering Village
  3. 新闻稿投放前的策划事项
  4. QQ强聊器原理和代码
  5. 癞子麻将胡牌算法实现
  6. python猜拳小游戏实验报告_Java猜拳小游戏程序设计实验报告
  7. CSS3 内阴影的应用
  8. ProgressBar 深入分析
  9. android progressbar换背景,Android自定义ProgressBar背景
  10. u6系统服务器停止怎么办,windows xp系统停止服务怎么办