9.2.2 Python图像处理之图像数学形态学-二值形态学应用-目标检测
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图像处理之图像数学形态学-二值形态学应用-目标检测相关推荐
- 9.2.1 Python图像处理之图像数学形态学-二值形态学应用之噪声消除
9.2.1 Python图像处理之图像数学形态学-二值形态学应用之噪声消除 文章目录 9.2.1 Python图像处理之图像数学形态学-二值形态学应用之噪声消除 1 算法原理 2 代码 3 效果 1 ...
- 9.2.3 Python图像处理之图像数学形态学-二值形态学应用-区域填充
9.2.3 Python图像处理之图像数学形态学-二值形态学应用-区域填充 文章目录 9.2.3 Python图像处理之图像数学形态学-二值形态学应用-区域填充 1 算法原理 2 代码 3 效果 1 ...
- 9.1 Python图像处理之图像数学形态学-二值形态学(腐蚀、膨胀、开启、闭合)
9.1 Python图像处理之图像数学形态学-二值形态学(腐蚀.膨胀.开启.闭合) 文章目录 9.1 Python图像处理之图像数学形态学-二值形态学(腐蚀.膨胀.开启.闭合) 1 算法原理 1.1 ...
- 9.4 Python图像处理之图像数学形态学-基于灰度形态学的应用(形态梯度、形态平滑、高帽变换、低帽变换)
9.4 Python图像处理之图像数学形态学-基于灰度形态学的应用(形态梯度.形态平滑.高帽变换.低帽变换) 文章目录 9.4 Python图像处理之图像数学形态学-基于灰度形态学的应用(形态梯度.形 ...
- 9.3 Python图像处理之图像数学形态学-灰度形态学
9.3 Python图像处理之图像数学形态学-灰度形态学 文章目录 9.3 Python图像处理之图像数学形态学-灰度形态学 1 算法原理 2 代码 3 效果 1 算法原理 灰度图像与二值图像的区别在 ...
- 【图像处理】——图像的二值化操作及阈值化操作(固定阈值法(全局阈值法——大津法OTSU和三角法TRIANGLE)和自适应阈值法(局部阈值法——均值和高斯法))
目录 一.二值化的概念(实际上就是一个阈值化操作) 1.概念: 2.实现方法 3.常用方法 二.阈值类型 1.常见阈值类型(主要有五种类型) (1)公式描述 (2)图表描述 2.两种特殊的阈值算法(O ...
- 利用python opencv实现图像自适应二值化
对灰度图像利用阈值得到一个二值化的图像,是常最常用的图像处理技术之一.例如,灰度大于127的图像设置为1.小于127的设置为0,这种处理便是固定阈值127的二值化处理. 自适应的二值化处理不同于固定阈 ...
- 8.3 Python图像处理之图像典型分割-分水岭分割
8.3 Python图像处理之图像典型分割-分水岭分割 文章目录 8.3 Python图像处理之图像典型分割-分水岭分割 1 算法原理 2 代码 3 效果 1 算法原理 分水岭概念是以对图像进行三维可 ...
- 8.1 Python图像处理之图像典型分割-SUSAN边缘检测
8.1 Python图像处理之图像典型分割-SUSAN边缘检测 文章目录 8.1 Python图像处理之图像典型分割-SUSAN边缘检测 1 算法原理 2 代码 3 效果 1 算法原理 SUSAN 的 ...
最新文章
- [转自脚本之家] Javascript cookie 详解
- 欧瑞变频器800参数设置_【收藏】变频器密码大全和维修常用方法!
- linux系统分区不,其中,不属于Linux系统分区的是()。
- C# datagridview、datagrid、GridControl增加行号
- oracle 查询不同编号的时间最小记录_投稿 | ORACLE amp; PostgreSql 利用伪列删除完全重复的两行...
- mysql 时间戳 2038_mysql数据库的timestamp为什么从1970到2038的某一时间?某一时间是指什么时间?过了这个时间之后怎么办?-问答-阿里云开发者社区-阿里云...
- 6-3 递增的整数序列链表的插入 (10 分)
- VMware Harbor现已加入Rancher社区Catalog
- 用C为密集运算函数加速
- 二进制炸弹--拆弹实验
- XMind12周的学习使用-变成厉害的人成长记录
- 苹果7服务器是什么系统版本,最新系统 iOS14.7 Beta1 版本推出!
- Git分支 查看branch 创建 切换checkout 合并merge(先切回主分支) 删除branch -d 推送push
- 广义Pareto分布---极值理论的学习3
- 解决ios以及mac yyyy-MM-dd HH:mm:ss格式不兼容
- Python基础从0到1自我学习(3)
- C# Chart 曲线(多曲线展示)
- 【学习笔记】商业数据分析
- 日历函数单元 (转)
- html格子像素画,html – rotateY()文本模糊/像素化