本人新書《玩轉Python網絡爬蟲》,可在天貓、京東等商城搜索查閱,項目深入淺出,適合爬蟲初學者或者是已經有一些網絡爬蟲編寫經驗,但希望更加全面、深入理解Python爬蟲的開發人員。
———-歡迎加入學習交流QQ羣:657341423
直線檢測
cv2.HoughLinesP()函數原型:
HoughLinesP(image, rho, theta, threshold, lines=None, minLineLength=None, maxLineGap=None)
- image: 必須是二值圖像,推薦使用canny邊緣檢測的結果圖像;
- rho:線段以像素爲單位的距離精度,double類型的,推薦用1.0
- theta: 線段以弧度爲單位的角度精度,推薦用numpy.pi/180
- threshod:累加平面的閾值參數,int類型,超過設定閾值才被檢測出線段,值越大,基本上意味着檢出的線段越長,檢出的線段個數越少。根據情況推薦先用100試試
- lines:線條的輸出向量。
- minLineLength:線段以像素爲單位的最小長度。
- maxLineGap:同一方向上兩條線段判定爲一條線段的最大允許間隔(斷裂),超過了設定值,則把兩條線段當成一條線段,值越大,允許線段上的斷裂越大,越有可能檢出潛在的直線段
示例一
import cv2
import numpy as np
img = cv2.imread('lines.jpg')
# 灰度處理
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# canny邊緣處理
edges = cv2.Canny(gray,50,120)
line = 100
minLineLength = 20
# HoughLinesP函數是概率直線檢測,注意區分HoughLines函數
lines = cv2.HoughLinesP(edges, 1, np.pi/180, 100, lines=line, minLineLength=minLineLength)
# 降維處理
lines1 = lines[:,0,:]
# line 函數勾畫直線
# (x1,y1),(x2,y2)座標位置
# (0,255,0)設置BGR通道顏色
# 2 是設置顏色粗淺度
for x1,y1,x2,y2 in lines1:
cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2)
# 顯示圖像
cv2.imshow("edges", edges)
cv2.imshow("lines", img)
cv2.waitKey()
cv2.destroyAllWindows()
原圖
效果圖
直線的識別與HoughLinesP函數參數的設置有關
圓檢測
HoughCircles函數原型
cv2.HoughCircles(image, method, dp, minDist, circles=None, param1=None, param2=None, minRadius=None, maxRadius=None)
參數說明:
- image- 8位,單通道,灰度輸入圖像。 method- 使用檢測方法。
- dp - 累加器分辨率與圖像分辨率的反比。例如,如果 dp= 1,則累加器具有與輸入圖像相同的分辨率。如果 dp = 2,則累加器的寬度和高度都是一半。
- minDist -檢測到的圓的中心之間的最小距離。如果參數太小,除了真正的參數外,可能會錯誤地檢測到多個鄰居圈。如果太大,可能會錯過一些圈子。
- circles- 找到的圓的輸出向量。每個向量被編碼爲3元素的浮點向量 (x,y,半徑)。
- param1 -第一個方法特定的參數。在CV_HOUGH_GRADIENT的情況下,
兩個傳遞給Canny()邊緣檢測器的閾值較高(較小的兩個小於兩倍) - param2 -第二種方法參數。在CV_HOUGH_GRADIENT的情況下,它是檢測階段的圓心的累加器閾值。越小,可能會檢測到越多的虛假圈子。首先返回對應於較大累加器值的圈子。
- minRadius -最小圓半徑。
示例二
import cv2
import numpy as np
planets = cv2.imread('planet_glow.jpg')
# 灰度處理
gray_img = cv2.cvtColor(planets, cv2.COLOR_BGR2GRAY)
# medianBlur 平滑(模糊)處理
img = cv2.medianBlur(gray_img, 5)
# 灰度圖像轉彩色圖像
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
# 圓檢測
circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 100, param1=100, param2=30, minRadius=50, maxRadius=100)
# 轉化整數
circles = np.uint16(np.around(circles))
for i in circles[0,:]:
# 勾畫圓形,planets圖像、(i[0],i[1])圓心座標,i[2]是半徑
cv2.circle(planets,(i[0],i[1]),i[2],(0,255,0),2)
# 勾畫圓心,圓心實質也是一個半徑爲2的圓形
cv2.circle(planets,(i[0],i[1]),2,(0,0,255),3)
# 顯示圖像
cv2.imwrite("planets_circles.jpg", planets)
cv2.imshow("mypic", cimg)
cv2.imshow("HoughCirlces", planets)
cv2.waitKey()
cv2.destroyAllWindows()
原圖
效果圖
圓的識別與HoughCircles函數參數的設置有關
注意:
例子可參考:Python 使用Opencv實現邊緣檢測以及輪廓檢測的示例二
參考資料:OpenCV 3計算機視覺 Python語言實現第二版