18.OpenCV的影像輪廓——霍夫變換
文章目錄
- 前言
- 一、霍夫直線變換
- 二、概率霍夫直線變換
- 三、霍夫圓變換
- 四、OpenCV-Python資源下載
- 總結
前言
??霍夫變換用于在影像中查找直線和圓等形狀,
一、霍夫直線變換
??cv2.HoughLines()函式利用霍夫變換演算法檢測影像中的直線,其基本格式如下:
lines =cv2.HoughLines(image, rho, theta, threshold)
lines使用極坐標系來表示直線, 直線運算式為r = x*cosθ + y*sinθ
image為原影像, 必須是8位單通道二值影像, 通常會在霍夫變換之前, 對影像執行閾值處理或Canny邊緣檢測
rho位距離的精度(以像素為單位), 通常為1
theta為角度的精度, 通常使用 π/180°, 表示搜索所有的可能的角度
threshold為閾值, 值越小, 檢測出來的直線越多
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 利用霍夫變換演算法檢測影像中的直線
img = cv2.imread('shape6.jpg')
cv2.imshow('original', img)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 150, apertureSize = 3)
cv2.imshow('Canny', edges)
#霍夫線變換
lines = cv2.HoughLines(edges, 1, np.pi / 180, 150)
#逐潭訓制直線
img1=img.copy()
for line in lines:
rho, theta = line[0]
a = np.cos(theta)
b = np.sin(theta)
x0, y0 = a * rho, b * rho
pt1 = ( int(x0+1000*(-b)), int(y0+1000*(a)) ) #計算直線端點
pt2 = ( int(x0-1000*(-b)), int(y0-1000*(a)) ) #計算直線端點
cv2.line(img1, pt1, pt2, (0, 0,255), 2) #繪制直線
cv2.imshow('HoughLines',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

二、概率霍夫直線變換
??cv2.HoughLinesP()函式利用概率霍夫變換演算法檢測影像中的直線,其基本格式如下:
lines =cv2.HoughLinesP(image, rho, theta, threshold[, minLineLength[, maxLineGap]])
lines為回傳的直線是以(x1,y1,x2,y2)4個元素的向量為元素的串列, 其中(x1,y1)和(x2,y2)表示一條線段的起點和終點
image為原影像, 必須是8位單通道二值影像, 通常會在霍夫變換之前, 對影像執行閾值處理或Canny邊緣檢測
rho位距離的精度(以像素為單位), 通常為1
theta為角度的精度, 通常使用 π/180°, 表示搜索所有的可能的角度
threshold為閾值, 值越小, 檢測出來的直線越多
minLineLength為可接受的直線的最小長度, 默認值為0
maxLineGap為共線線段之間的最大間隔, 默認值為0
# 利用概率霍夫變換演算法檢測影像中的直線
img=cv2.imread('shape6.jpg')
cv2.imshow('original',img)
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize =3)
cv2.imshow('Canny', edges)
#概率霍夫線變換
lines = cv2.HoughLinesP(edges, 1, np.pi/180, 1, minLineLength=100, maxLineGap=10)
#逐潭訓制直線
img1 = img.copy()
for line in lines:
x1, y1, x2, y2 = line[0]
cv2.line(img1, (x1, y1), (x2, y2), (0, 0,255), 2)
cv2.imshow('HoughLines',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

三、霍夫圓變換
??cv2.HoughCircles()函式利用霍夫變換演算法檢測影像中的圓,其基本格式如下:
circles = cv2.HoughCircles(image, method, dp, minDist[, param1[, param2[, minRadius[, maxRadius]]]])
circles為回傳的圓
image為原影像, 必須是8位單通道二值影像
method為查找方法, 可設定為cv2.HOUGH_GRADIENT和cv2.HOUGH_GRADIENT_ALT
dp為累加器解析度, 它與影像解析度成反比, dp=1, 則累加器與輸入影像的解析度相同, dp=2, 則累加器的寬和高是輸入影像的一半
minDist為圓心間的最小距離
param1為對應Canny邊緣檢測的高閾值(低閾值是高閾值的一半), 默認值是100
param2為圓心位置必須達到的投票數, 值越大, 檢測出的圓越少, 默認值是100
minRadius為最小圓半徑, 半徑小于該值的圓不會被檢測出來, 其默認值是0, 此時不起作用
maxRadius為最大圓半徑, 半徑大于該值的圓不會被檢測出來, 其默認值是0, 此時不起作用
# 利用霍夫變換演算法檢測影像中的圓
img = cv2.imread('shape6.jpg')
cv2.imshow('original', img)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 150, apertureSize = 3)
cv2.imshow('Canny', edges)
circles = cv2.HoughCircles(edges, cv2.HOUGH_GRADIENT, 1, 50, param2=30, minRadius=10, maxRadius=40)
circles = np.uint16(np.around(circles)) #把circles包含的圓心和半徑的值變成整數,np.around()用法功能:四舍五入取值
img1=img.copy()
for i in circles[0,:]:
cv2.circle(img1,(i[0],i[1]),i[2],(255,0,0),2)
cv2.circle(img1,(i[0],i[1]),2,(0,0,255),2)
cv2.namedWindow('circles',cv2.WINDOW_NORMAL)
cv2.imshow('circles',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

四、OpenCV-Python資源下載
OpenCV-Python測驗用圖片、中文官方檔案、opencv-4.5.4原始碼
總結
??以上內容介紹了OpenCV-Python的霍夫變換檢測直線與圓的方法,有關Python、資料科學、人工智能等文章后續會不定期發布,請大家多多關注,一鍵三連喲(●’?’●),
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/389010.html
標籤:其他
