模板匹配与霍夫检测
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板匹配与霍夫检测相关的知识,希望对你有一定的参考价值。
1.模板匹配就是拿一张图乡与另外一张图乡比较,看是否是其中一部分
API:cv.matchTemplate(img,template,method)
参数:
img:要进行模板匹配的图像
Template:模板
method:实现模板的算法,主要有:
1)平方差匹配(CV_TM_SQDIFF):利用模板与图像的平方差进行匹配,最好的
匹配是0,匹配越差,匹配的值越大
2)相关匹配(CV_TM_CCORR):利用模板与图像之间的乘法进行匹配,数值越大
表示匹配程度越高,越小表示匹配效果差
3)相关系数匹配(CV_TM_CCOEFF):利用模板与图像的相关系数匹配。1表示
完美的匹配,-1表示最差的匹配匹配后,使用cv.minMaxLoc()方法查找最大值所在的位置即可。若选用平方差,最小位置是最佳匹配位置
import numpy as np
import cv2 as cv
import matplotlib.plylot as plt
#1.图像和模板读取
img = cv.imread(image.jpg)
template = cv.imread(image.jpg)
h,w,l = template.shape#模板的长宽高
#2.模板匹配
#2.1模板匹配
res = cv.matchTemplate(img,template,cv.TM_CCORR)
#2.2返回图像中最匹配的位置,确定左上角的坐标,并将匹配位置绘制
在图像上
min_val,max_val,min_loc,max_loc = cv.minMaxLoc(res)
#使用平方差时最大值为最佳匹配位置
top_left = max_loc#左上角位置
bottom_right = (top_left[0] + w,top_left[1] + h)#右下角位置
cv.rectangle(img,top_left,bottom_right,(0,255,0).2)
plt.imshow(img[:,:,::-1])
plt.show()
2.霍夫变换就是从来提取图像中的直线和圆等几何形状
霍夫变换的转换有两种一种是斜线通过x轴和y轴坐标表示,另外一种就是直线,通过极坐标轴表示
3.霍夫线检测
API:cv.HoughLines(img,rho,theta,threshold)
参数:
rho,theta:半径和角度的精确度
threshold:阈值,累加器的值高于阈值就被认为是直线
import numpy as np
import cv2 as cv
import matplotlib.plylot as plt
#1.图像读取
img = cv.imread(image.jpg)
2)进行Canny边缘检测
edges = cv.Canny(img,100,200)
3)进行直线计算
lines = cv.HuoghLines(edges,0.8,np.pi/180,150)
for line in lines:
rho,theta = line[0]#半径和角度
a = np.cos(theta)
b = np.sin(theta)
xo = rho*a
yo = rho*b
x1 = int(x0+1000*(-b))#直线的坐标点1
y1 = int(y0+1000*a)
x2 = int(x0-1000*(-b))#直线的坐标点2
y2 = int(y0-1000*a)
cv.line(img,(x1,y1),(x2,y2),(0,255,0))
plt.imshow(img[:,:,::-1])
plt.show()
4.霍夫圆检测,在直线的交点处,设置阈值,大于这个阈值就是圆心
API:cv.HoughCircles(img,method,dp,minDist,param1 = 100,param2 = 100,minRadius = 0,maxRadius = 200)
参数:
method:检测算法,参数:CV.HOUGU_GRADINT
dp:dp = 1表示霍夫空间与输入图像空间一致,dp = 2或负空间为输入图像空间一半
param1:边缘检测使用Canny算子的高阈值,低阈值是高阈值的一半
param2:检测圆心和确定半径时所共有的阈值
maxRadius:圆半径最大半径
minRadius:圆半径最小半径
import numpy as np
import cv2 as cv
import matplotlib.plylot as plt
#1.图像读取
img = cv.imread(image.jpg)
#2.中值滤波
img = cv.medianBlur(img,7)
#3.霍夫圆检测
circles = CV.HoughCircles(img,cv,Hough_GRADINT,1,200,param1 = 100,param2 = 30)
#4.将检测结果绘制到图像上
for i in circles[0, :]#遍历矩阵每一行数据
#绘制圆形
cv.circle(img,(i[0],i[1],i[2],(0,255,0),2))#i[0],i[1]是圆心,i[2]
是半径
#绘制圆心
cv.circles(img,(i[0],i[1],i2],(0,255,0),3))
plt.imshow(img[:,:,::-1])
plt.show()
以上是关于模板匹配与霍夫检测的主要内容,如果未能解决你的问题,请参考以下文章