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()