记录研究生封校生活的学习day22(第三篇)概率霍夫变换

91 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情

总计:今天是十月更文计划第二十二天,第四十一篇

为了更好地判断直线,概率霍夫变换算法对选取直线的方法作了两点改进: 所接受直线的最小长度 接受直线时允许的最大像素点间距

lines = cv2.HoughLinesP( image, rho, theta, threshold,minLineLength,maxLineGap)

lines :一对浮点数,表示检测到的直线的参数,即(r,θ),是numpy.ndarray类型

images :原始图像。

rho :以像素为单位的距离r的精度。

theta :角度θ的精度。

threshold :阈值。该值越小,判定出的直线越多。

minLineLength :用来控制“接受直线的最小长度”的值。

maxLineLength :用来控制接受共线线段之间的最小间隔。

具体代码如下:

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('computer.jpg',-1)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize =3)
orgb=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
oShow=orgb.copy()
lines = cv2.HoughLinesP(edges,1,np.pi/180,160,minLineLength=100,maxLineGap=10)
for line in lines:
    x1,y1,x2,y2 = line[0]
    cv2.line(orgb,(x1,y1),(x2,y2),(255,255,255),2)
plt.subplot(121)
plt.imshow(oShow)
plt.axis('off')
plt.subplot(122)
plt.imshow(orgb)
plt.axis('off')

image.png

霍夫圆环变换

实际上,只要是能够用一个参数方程表示的对象,都适合用霍夫变换来检测。

霍夫圆变换中,需要考虑圆半径和圆心(x,y,r)。OpenCV中采用的策略是两轮筛选。第1轮筛选找出可能存在圆的位置;第2轮再根据第1轮的结果筛选出半径的大小

circles = cv2.HoughCircles( image, method, dp, minDisth,param1,param2,minRadius,maxRadius)

circles :一对浮点数,表示检测到的直线的参数,即(r,θ),是numpy.ndarray类型

images :原始图像。

method :检测方法。代表霍夫圆检测中两轮检测所用方法。

dp :累计器分辨率。用来指定图像分辨率与圆心累加器分辨率的比例。

minDist :圆心间的最小距离。

param1 :该参数是缺省的。默认值为100,它对应Canny边缘检测器的高阈值。

param2 :圆心位置必须收到的投票数。该值越大,检测的圆越少。

minRadius :圆半径的最小值。

maxRadius :圆半径的最大值。

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('chess.jpg',0)
imgo=cv2.imread('chess.jpg',-1)
o=cv2.cvtColor(imgo,cv2.COLOR_BGR2RGB)
oshow=o.copy()
img = cv2.medianBlur(img,5)
circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,300,param1=50,param2=30,minRadius=100,maxRadius=200)
circles = np.uint16(np.around(circles))
for i in circles[0,:]:
  cv2.circle(o,(i[0],i[1]),i[2],(255,0,0),12)
  cv2.circle(o,(i[0],i[1]),2,(255,0,0),12)
plt.subplot(121)
plt.imshow(oshow)
plt.axis('off')
plt.subplot(122)
plt.imshow(o)
plt.axis('off')

输出的结果如下:

image.png