Java教程

模板匹配与霍夫检测

本文主要是介绍模板匹配与霍夫检测,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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

 

这篇关于模板匹配与霍夫检测的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!