天天看點

模闆比對與霍夫檢測

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:檢測圓心和确定半徑時所共有的門檻值

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

繼續閱讀