模板匹配與霍夫檢測
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()