OpenCV图像处理(十八)---图像之模板匹配

热力学温标是由威廉·汤姆森,第一代开尔文男爵于1848年利用热力学第二定律的推论卡诺定理引入的。它是一个纯理论上的温标,因为它与测温物质的属性无关。符号T,单位K(开尔文,简称开)。国际单位制(SI)的7个基本量之一,热力学温标的标度,符号为T。根据热力学原理得出,测量热力学温度,采用国际实用温标。热力学温度旧称绝对温度(absolute temperature)。单位是“开尔文”,英文是“Kelvin”简称“开”,国际代号“K”,但不加“°”来表示温度。开尔文是为了纪念英国物理学家Lord Kelvin而命名的。以绝对零度(0K)为最低温度,规定水的三相点的温度为 273.16K,开定义为水三相点热力学温度的1/273.16。

摄氏度为表示摄氏温度时代替开的一个专门名称。而水的三相点温度为0.01摄氏度。因此热力学温度T与人们惯用的摄氏温度t的关系是:T(K)=273.15+t(℃)。规定热力学温度的单位开(K)与摄氏温度的单位摄氏度(℃)的平均值完全相同。所以△T K = △T ℃。在表示温度差和温度间隔时,用K和用℃的值相同。                                                                

前言

     在上一期的文章中,我们学习了图像的直方图均衡化,了解到直方图均衡化能够更好的观察图像的细节部分,形成鲜明的对比度。今天,我们将继续学习图像的新知识--图像模板匹配。

一、模板匹配

     首先,我们从模板匹配的字义出发,模板顾名思义就是事先存在一个模板(图像或数据),然后利用这个模板进行下一步工作,匹配可以理解为比对的意思,因此,连起来就是事先有一个模板然后用这个模板与别的图像进行比对,最终的目的是在别的图像中找到我们事先准备好的模板,这样应该很好理解了吧。

     说点题外话,在深度学习兴起之前,在目标追踪领域使用最多的方法可能就是两种,一种是精度不高的直接进行模板匹配,另一种就是用各种各种特征工程的机器学习算法进行训练(SVM,KNN等)得到目标,实现追踪的目的。而如今,为了应对场景多样化,精度,稳定性,泛化能力,检测能力等等因素,深度学习中的各种目标检测方法得到的广泛的推崇,例如Yolov系列(version1-4,4是最近刚跟新的,但估计以后很难出现5了,据说Yolo之父退出了这个领域的研究)、SSD、R-CNN、SPP-Net、Fast R-CNN等等。这些算法的出现,使得目标追踪领域得到了前所未有的发展,落地项目也越来越多。

1.1 原始图像

图像一:

OpenCV图像处理(十八)---图像之模板匹配_第1张图片

以上图片(原始图像)中存在着模板图像,从这里面进行匹配)

图像二:

(以上图片为模板,小编直接从原始图片中截取)

1.2 代码实践

#coding:utf-8
import cv2


#导入需要进行模板匹配的大图片
src_img = cv2.imread("src_img.jpg")
#导入事先准备好的图片(模板图像)
key_img = cv2.imread("ai.jpg")
#获取模板图片的高度和宽度
key_height, key_width = key_img.shape[:2]
#调用函数matchTemplate()进行模板匹配
process_img = cv2.matchTemplate(src_img,key_img,cv2.TM_SQDIFF_NORMED)
#寻找矩阵中的最大值、最小值的匹配结果及其位置
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(process_img)
#绘制矩形边框,将匹配区域标注出来
#min_loc:矩形定点
#(min_loc[0]+key_width,min_loc[1]+key_height):给出矩形尺寸
#(0,255,0),RGB颜色原则,255位最大值,此时为绿色
# 一般情况下为了画矩形框直接调用函数就行,不需要返回值result_img
# 但是在后文的保存时,发现画框后的图像并没有保存
# 说明画框后的图像仅仅显示了,并没有写入原始图像,因此需要返回值的图像进行保存
result_img = cv2.rectangle(src_img,min_loc,(min_loc[0]+key_width,min_loc[1]+key_height),(0,255,0),2)
#显示结果,并将匹配值显示在标题栏上
cv2.imshow("result_img",src_img)
cv2.imwrite("result_im.jpg",result_img)
print("图像保存成功")
cv2.waitKey()
cv2.destroyAllWindows()


代码解读:从以上代码我们能够直接看出,代码首先读取木板图像和原始图像,随后得到了模板图像的尺寸,这个尺寸用于在后期的匹配成功后在原始图像中绘制矩形,紧接着,调用cv2.matchTemplate()函数进行模板匹配,第一第二两个参数是原始图像和模板图像,匹配的方式是第三个参数,这里我们选择了cv2.TM_SQDIFF_NORMED,当然还有其他的匹配方式,我们选择了较为常用的。匹配成功之后,我们需要用cv2.minMaxLoc()函数得到匹配的最大值最小值以及位置(这个位置通常是匹配最佳位置的左上角坐标),得到最佳位置的左上角坐标后,与模板的尺寸结合起来就可以在原始图像中利用cv2.rectangle()函数绘制矩形框选匹配到的模板了。

1.3 效果演示

OpenCV图像处理(十八)---图像之模板匹配_第2张图片

(可以看到,以上图像中我们的模板图像已经匹配成功,nice !)

END

结语

      今天的分享结到此束了,总的来说,代码比较简单,多看小编的注释哦,如果不清楚匹配后返回的值或者类型,就用老办法打印出来,看看是个啥,这样相当于每一步的调试,由此你能更加的理解代码。对于模板匹配,我们暂时只需要了解从大图中寻找小图就好,只是在匹配的过程中采用的方式不一样(cv2.matchTemplate()函数的第三个参数),老铁们可以尝试其他方式匹配哦,当然了匹配算法很多,我们今天仅仅实践了一种而已,期待大家多多学习其他优秀的算法哦!

编辑:玥怡居士|审核:小圈圈居士

往期精彩回顾

OpenCV图像处理(十七)---图像直方图均衡化

OpenCV图像处理(十六)---图像直方图

OpenCV图像处理(十五)---图像轮廓特征

扫码关注我们

IT进阶之旅

我就知道你“在看”

你可能感兴趣的:(OpenCV图像处理(十八)---图像之模板匹配)