1. 程式人生 > 其它 >模板匹配與霍夫檢測

模板匹配與霍夫檢測

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