【python版CV】图像轮廓&模板匹配

简介: 【python版CV】图像轮廓&模板匹配

1、图像轮廓

1.1 findContours函数:
cv.findContours(img,mode,method)

mode:轮廓检索模式

  • RETR_EXTERNAL:只检索最外面轮廓
  • RETR_CCOMP:检索所有轮廓,并将它们组织为两层;顶层是各部分的外部边界,第二层是空洞的边界
  • RETR_TREE:检索所有轮廓,并重构嵌套轮廓层次(常用)

method:轮廓逼近方法

  • RETR_LIST:检索所有轮廓,并将其保存到一条链表当中
  • CHAIN_APPROX_NONE:以Freeman链码的方式输出轮廓,所有其他方法输出多边形(顶点序列)
  • CHAIN_APPROX_SIMPLE:压缩水平的、垂直的和斜的部分,也就是函数保留它们终点部分

为了更高的准确率,使用二值图像

image=cv.imread("E:\\Pec\\lan.jpg")
#转化为灰度图
gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
#转化为二值图
ret,thresh=cv.threshold(gray,127,255,cv.THRESH_BINARY)
#返回值一:计算好或者设定好的阈值
#返回值二:处理好的图像

1.2 获取轮廓信息(可能会报错原因)
#binary,contours,hierarchy=cv.findContours(,,)
#因为OpenCV库的更新,会报错“not enough values to unpack (expected 3, got 2)”
#把返回值从三个改成两个即可(删除第一个返回值)
contours,hierarchy=cv.findContours(thresh,cv.RETR_TREE,cv.CHAIN_APPROX_NONE)
#返回值一:轮廓信息
#返回值二:层级


1.4 轮廓特征:
#轮廓特征
cnt=contours[0]#第0个轮廓
#面积
area=cv.contourArea(cnt)
print(area)
#周长,True表示闭合的轮廓图像
girth=cv.arcLength(cnt,True)
print(girth)
1.5 轮廓近似:

说明:曲线AB,假设C点是到直接AB最大的点,然后过C点做直线AB的垂直线d,若d点小于T(自己设置的阈值),直线AB可以取代曲线AB,若d大于T,不能取代,则同理在曲线CB取一点D,做D到直线CB的曲线,然后再比较阈值。。。。。

#轮廓近似
#二值图获取
img=cv.imread("E:\\Pec\\lunk.jpg")
gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
ret,thresh=cv.threshold(gray,127,255,cv.THRESH_BINARY)
#获取轮廓
contours,hierarchy=cv.findContours(thresh,cv.RETR_TREE,cv.CHAIN_APPROX_NONE)
cnt=contours[2]
draw_img=img.copy()
res=cv.drawContours(draw_img,contours,-1,(0,255,0),5)
cv_show("res",res)
#取近似
epsilon=0.15*cv.arcLength(cnt,True)#设置的比较阈值,一般是周长的百分比
#百分比越小,变化越不明显
approx=cv.approxPolyDP(cnt,epsilon,True)#做近似
draw_img=img.copy()
res=cv.drawContours(draw_img,[approx],-1,(0,0,255),2)
cv_show("res",res)
1.6 边界矩形
img=cv.imread("E:\\Pec\\lunk.jpg")
gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
ret,thresh=cv.threshold(gray,127,255,cv.THRESH_BINARY)
contours,hierarchy=cv.findContours(thresh,cv.RETR_TREE,cv.CHAIN_APPROX_NONE)
cnt=contours[3]
x,y,w,h=cv.boundingRect(cnt)
image=cv.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
cv_show("image",image)

2、模板匹配

说明:模板匹配和卷积原理很像,模板在原图像上从原点开始滑动,计算模板与(图像被模板覆盖的地方)的差别程度,这个差别程度的计算方法在opencv中有6种,然后将每次计算的结果放入一个矩阵里,作为结果输出。如原图形是AxB大小,而模板是axb大小,则输出结果是(A-a+1)x(B-b+1)

6种差别程度的计算方法:(尽量用归一化)

TM_SQDIFF:计算平方不同,计算出来的值越小,越相关

TM_CCORR:计算相关性,计算出来的值越大,越相关

TM_CCOEFF:计算相关系数,计算出来的值越大,越相关

TM_SQDIFF_NORMED:计算归一化平方不同,计算出来的值越接近0,越相关

TM_CCORR_NORMED:计算归一化相关性,计算出来的值越接近1,越相关

  • TM_CCOEFF_NORMED:计算归一化相关系数,计算出来的值越接近1,越相关
#模板匹配
img=cv.imread("E:\\Pec\\lida.jpg",0)
template=cv.imread("E:\\Pec\\face.jpg",0)
#cv_show("lida",img)
#cv_show("tem",template)
h,w=template.shape[:2]
print(img.shape)
print(template.shape)
methods=['cv.TM_CCOEFF','cv.TM_CCORR','cv.TM_CCOEFF','cv.TM_SQDIFF_NORMED'
    ,'cv.TM_CCORR_NORMED','cv.TM_CCOEFF_NORMED']
#进行模板匹配
res=cv.matchTemplate(img,template,3)
#第三个参数是一个数值,1对应上面的TM_CCOEFF,同理下面
print(res.shape)
min_val,max_val,min_loc,max_loc=cv.minMaxLoc(res)
print(min_val)#最小值
print(max_val)#最大值
print(min_loc)#最小值位置
print(max_loc)#最大值位置

for meth in methods:
    img2=img.copy()
    #匹配方法的真值
    method=eval(meth)#eval函数是以字符串的形式运行代码,如a1,a2...分别赋予1,2..
    print(method)
    res=cv.matchTemplate(img,template,method)
    min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)
    #如果是平方差匹配TM_SQDIFF或者归一化平方差匹配,取最小值
    if method in [1,4]:
        top_left=min_loc
    else:
        top_left=max_loc
    bottom_right=(top_left[0]+w,top_left[1]+h)
    #画矩形
    cv.rectangle(img2,top_left,bottom_right,255,2)
    #位置由三个整型数值构成:第一个代表行数,第二个代表列数,第三个代表索引位置。
    #举例:plt.subplot(2, 3, 5) 和plt.subplot(235) 一样。
    plt.subplot(121),plt.imshow(res)
    plt.xticks([]),plt.yticks([])#隐藏坐标轴
    plt.subplot(122),plt.imshow(img2)
    plt.xticks([]), plt.yticks([])  # 隐藏坐标轴
    plt.suptitle(meth)
    plt.show()

(255, 255)
(146, 153)
(110, 103)
0.7732675671577454
0.9017052054405212
(8, 109)
(67, 35)
4
2
4
1
3
5

匹配多个对象:

python zip()函数:

zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。

如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。zip(*loc[::-1])

img_jb1=cv.imread("E:\\Pec\\jinbi1.jpg")
#cv_show("res",img_jb1)
img_jb2=cv.imread("E:\\Pec\\jinbi2.jpg")
#cv_show("res",img_jb2)
h,w=img_jb2.shape[:2]
res=cv.matchTemplate(img_jb1,img_jb2,cv.TM_CCOEFF_NORMED)
#取匹配度大于80%的坐标
threshold=0.7
loc=np.where(res>threshold)
for pt in zip(*loc[::-1]): #*表示可选参数
    bootom_right=(pt[0]+w,pt[1]+h)
    cv.rectangle(img_jb1,pt,bootom_right,(0,255,0),2)
cv_show("jb",img_jb1)

3、图像金字塔

  • 高斯金字塔
  • 拉普拉斯金字塔
3.1 高斯金字塔

(1)向下采样方法(缩小)

  • 将Gi与高斯内核卷积
  • 将所有偶数行和列去除,两边各缩小一半,面积缩小四分之一
down=cv.pyrDown(image)
#cv_show("down",down)

(2)向上采样方法(放大)

  • 将图像在每个方向扩大到原来的两倍,新增的行和列以0填充
  • 使用先前同样的内核(乘以4)与放大后的图像卷积,获取近似值
up=cv.pyrUp(image)
#cv_show("up",up)
 
3.2 拉普拉斯金字塔

Li=Gi−PyrUp(PyrDown(Gi))

相关文章
|
3月前
|
机器学习/深度学习 算法 TensorFlow
动物识别系统Python+卷积神经网络算法+TensorFlow+人工智能+图像识别+计算机毕业设计项目
动物识别系统。本项目以Python作为主要编程语言,并基于TensorFlow搭建ResNet50卷积神经网络算法模型,通过收集4种常见的动物图像数据集(猫、狗、鸡、马)然后进行模型训练,得到一个识别精度较高的模型文件,然后保存为本地格式的H5格式文件。再基于Django开发Web网页端操作界面,实现用户上传一张动物图片,识别其名称。
111 1
动物识别系统Python+卷积神经网络算法+TensorFlow+人工智能+图像识别+计算机毕业设计项目
|
17天前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
99 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
8天前
|
Python
Seaborn 教程-模板(Context)
Seaborn 教程-模板(Context)
28 4
|
1月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
利用Python和TensorFlow构建简单神经网络进行图像分类
利用Python和TensorFlow构建简单神经网络进行图像分类
59 3
|
2月前
|
存储 JSON API
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(1)
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(1)
69 7
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(1)
|
3月前
|
机器学习/深度学习 人工智能 算法
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
植物病害识别系统。本系统使用Python作为主要编程语言,通过收集水稻常见的四种叶片病害图片('细菌性叶枯病', '稻瘟病', '褐斑病', '稻瘟条纹病毒病')作为后面模型训练用到的数据集。然后使用TensorFlow搭建卷积神经网络算法模型,并进行多轮迭代训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地模型文件。再使用Django搭建Web网页平台操作界面,实现用户上传一张测试图片识别其名称。
142 22
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
|
3月前
|
机器学习/深度学习 人工智能 算法
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
鸟类识别系统。本系统采用Python作为主要开发语言,通过使用加利福利亚大学开源的200种鸟类图像作为数据集。使用TensorFlow搭建ResNet50卷积神经网络算法模型,然后进行模型的迭代训练,得到一个识别精度较高的模型,然后在保存为本地的H5格式文件。在使用Django开发Web网页端操作界面,实现用户上传一张鸟类图像,识别其名称。
120 12
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
|
2月前
|
JSON API 数据格式
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(2)
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(2)
59 0
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(2)
|
6月前
|
机器学习/深度学习 人工智能 算法
海洋生物识别系统+图像识别+Python+人工智能课设+深度学习+卷积神经网络算法+TensorFlow
海洋生物识别系统。以Python作为主要编程语言,通过TensorFlow搭建ResNet50卷积神经网络算法,通过对22种常见的海洋生物('蛤蜊', '珊瑚', '螃蟹', '海豚', '鳗鱼', '水母', '龙虾', '海蛞蝓', '章鱼', '水獭', '企鹅', '河豚', '魔鬼鱼', '海胆', '海马', '海豹', '鲨鱼', '虾', '鱿鱼', '海星', '海龟', '鲸鱼')数据集进行训练,得到一个识别精度较高的模型文件,然后使用Django开发一个Web网页平台操作界面,实现用户上传一张海洋生物图片识别其名称。
210 7
海洋生物识别系统+图像识别+Python+人工智能课设+深度学习+卷积神经网络算法+TensorFlow
|
6月前
|
机器学习/深度学习 人工智能 算法
【乐器识别系统】图像识别+人工智能+深度学习+Python+TensorFlow+卷积神经网络+模型训练
乐器识别系统。使用Python为主要编程语言,基于人工智能框架库TensorFlow搭建ResNet50卷积神经网络算法,通过对30种乐器('迪吉里杜管', '铃鼓', '木琴', '手风琴', '阿尔卑斯号角', '风笛', '班卓琴', '邦戈鼓', '卡萨巴', '响板', '单簧管', '古钢琴', '手风琴(六角形)', '鼓', '扬琴', '长笛', '刮瓜', '吉他', '口琴', '竖琴', '沙槌', '陶笛', '钢琴', '萨克斯管', '锡塔尔琴', '钢鼓', '长号', '小号', '大号', '小提琴')的图像数据集进行训练,得到一个训练精度较高的模型,并将其
89 0
【乐器识别系统】图像识别+人工智能+深度学习+Python+TensorFlow+卷积神经网络+模型训练