OpenCV识别圆(复杂背景下的圆)
生活随笔
收集整理的這篇文章主要介紹了
OpenCV识别圆(复杂背景下的圆)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
- 顏色模式 HSL和HSV cv2.inRange函數(shù)
- 邊緣提取
- 圖像閾值
- OpenCv的HoughCircles函數(shù)
- 函數(shù)原型:
- 參數(shù)解釋:
- 實(shí)例:
- 檢測(cè)復(fù)雜背景下的圓
顏色模式 HSL和HSV cv2.inRange函數(shù)
參考:
- 整理:opencv顏色灰度值、HSV和HSL
- HSL和HSV色彩空間
- RGB、HSV和HSL顏色空間
HSL(PowerPoint中顏色模式之一)即色相、飽和度、亮度(英語:Hue, Saturation, Lightness)。HSV(Opencv中的顏色模式)即色相、飽和度、明度(英語:Hue, Saturation, Value),又稱HSB,其中B即英語:Brightness。
由于這里使用Opencv,所以暫時(shí)只關(guān)注HSV
-
常規(guī)使用:
- H hue 色相 取值范圍0-360 ° 角度 使用圓環(huán)來表示顏色
- S Saturation 飽和度 范圍 0-100 % 百分比
- V Value 明度 范圍 0-100 % 百分比
+Hue 用角度度量,取值范圍為0~360°,表示色彩信息,即所處的光譜顏色的位置。表示如下:
顏色圓環(huán)上所有的顏色都是光譜上的顏色,從紅色開始按逆時(shí)針方向旋轉(zhuǎn),Hue=0 表示紅色,Hue=120 表示綠色,Hue=240 表示藍(lán)色等等。
顏色圓環(huán)上所有的顏色都是光譜上的顏色,從紅色開始按逆時(shí)針方向旋轉(zhuǎn),Hue=0 表示紅色,Hue=120 表示綠色,Hue=240 表示藍(lán)色等等。
HSV 圓柱體的半邊橫截面(Hue=60):
其中水平方向表示飽和度,飽和度表示顏色接近光譜色的程度。飽和度越高,說明顏色越深,越接近光譜色飽和度越低,說明顏色越淺,越接近白色。飽和度為0表示純白色。取值范圍為0~100%,值越大,顏色越飽和。
豎直方向表示明度,決定顏色空間中顏色的明暗程度,明度越高,表示顏色越明亮,范圍是 0-100%。明度為0表示純黑色(此時(shí)顏色最暗)。
-
Opencv中的HSV Changing Colorspaces:
- H hue 色相 范圍 [0,179]
- S saturation 飽和度 范圍[0,255]
- V value 明度 范圍 [0,255]
- 不同的軟件有不同的量程檔,需要自己進(jìn)行正則化/歸一化,將數(shù)據(jù)縮放至Opencv的這個(gè)值的范圍內(nèi)。
- 獲取某個(gè)RGB顏色對(duì)應(yīng)的HSV值:
-
inRange函數(shù)使用:
- python-opencv中的cv2.inRange函數(shù)
- 函數(shù)原型 -Opencv inRange
- 使用demo:Changing Colorspaces
- python-opencv中的cv2.inRange函數(shù)
邊緣提取
- findContours 輪廓查找
- Finding contours in your image?
- Contours : Getting Started
- OpenCV – Contour輪廓
- 邊緣檢測(cè),框出物體的輪廓(使用opencv-python)
- OpenCV: Detecting Edges, Lines, and Shapes
圖像閾值
參考: Opencv-tutroal—Image Thresholding
- 圖像閾值主要包括:
- 簡(jiǎn)單的閾值: cv2.threshold函數(shù)
- cv2.THRESH_BINARY
- cv2.THRESH_BINARY_INV
- cv2.THRESH_TRUNC
- cv2.THRESH_TOZERO
- cv2.THRESH_TOZERO_INV
- 自適應(yīng)閾值:cv2.adaptiveThreshold
- 簡(jiǎn)單的閾值: cv2.threshold函數(shù)
OpenCv的HoughCircles函數(shù)
官方文檔-FeatureDetection-HoughCircles()
函數(shù)原型:
注意:通常該功能可以很好地檢測(cè)圓心。 但是,它可能找不到正確的半徑。 您可以通過指定半徑范圍(minRadius和maxRadius)來輔助該功能。 或者,對(duì)于HOUGH_GRADIENT方法,您可以將maxRadius設(shè)置為負(fù)數(shù),以便僅在不進(jìn)行半徑搜索的情況下返回中心,并使用其他過程查找正確的半徑。
參數(shù)解釋:
- image 8bit 單通道圖像 輸入灰度圖
- circles 輸出檢測(cè)到的圓,每個(gè)向量由3個(gè)(x,y,radius)或4個(gè)浮點(diǎn)數(shù)點(diǎn)(x,y,radius,votes)。不知道votes是干啥的???
- method 探測(cè)方法,目前只有 HOUGH_GRADIENT 和HOUGH_GRADIENT_ALT這兩個(gè)可以使用
- basically 21HT, described in [266] 看一篇論文了解原理
- HK Yuen, John Princen, John Illingworth, and Josef Kittler. Comparative study of hough transform methods for circle finding. Image and Vision Computing, 8(1):71–77, 1990.
- HOUGH_GRADIENT_ALT是HOUGH_GRADIENT的變體,有更高的準(zhǔn)確率
- dp 累加器分辨率與圖像分辨率的反比。 例如,如果dp = 1,則累加器具有與輸入圖像相同的分辨率。 如果dp = 2,則累加器的寬度和高度是其一半。 對(duì)于HOUGH_GRADIENT_ALT,建議值為dp = 1.5,除非需要檢測(cè)到一些很小的圓圈。
- minDist 檢測(cè)到的圓心之間的最小距離。 如果參數(shù)太小,則除了真實(shí)的圓圈外,還可能會(huì)錯(cuò)誤地檢測(cè)到多個(gè)鄰居圓圈。 如果太大,可能會(huì)錯(cuò)過一些圓圈。
- param1 第一個(gè) 方法特定的參數(shù)。 對(duì)于HOUGH_GRADIENT和HOUGH_GRADIENT_ALT,它是傳遞給Canny邊緣檢測(cè)器的兩個(gè)閾值中的較高閾值(較低的閾值則小兩倍)。 請(qǐng)注意,HOUGH_GRADIENT_ALT使用Scharr算法來計(jì)算圖像導(dǎo)數(shù),因此閾值通常應(yīng)較高,例如300或正常曝光和對(duì)比圖像。
- param2 第二種方法特定的參數(shù)。
- 在HOUGH_GRADIENT的情況下,它是檢測(cè)階段圓心的累加器閾值。 它越小,可能會(huì)檢測(cè)到更多的假圓圈。 與較大的累加器值相對(duì)應(yīng)的圓將首先返回。 該值越小,可以檢測(cè)到更多根本不存在的圓,該值越大,能通過檢測(cè)的圓就更加接近完美的圓形 (這個(gè)值越大,對(duì)所檢測(cè)的圓的完美程度要求越高)
- 在HOUGH_GRADIENT_ALT算法的情況下,這是圓的“完美”度量。 它越接近1,則選擇的形狀更好的圓形算法。 在大多數(shù)情況下,0.9應(yīng)該可以。 如果要更好地檢測(cè)小圓圈,可以將其降低到0.85、0.8甚至更低。 但是,然后還要嘗試限制搜索范圍[minRadius,maxRadius],以避免出現(xiàn)許多錯(cuò)誤的圓圈。
- minRadius 圓的最小半徑
- maxRadius 圓的最大半徑。 If <= 0,則使用最大圖像尺寸. If < 0, HOUGH_GRADIENT 只返回圓心坐標(biāo)而不返回半徑。HOUGH_GRADIENT_ALT 則始終計(jì)算圓半徑
實(shí)例:
circles=cv2.HoughCircles(binary,cv2.HOUGH_GRADIENT,4,25,param1=100,param2=40,minRadius=8,maxRadius=15) # 注意看參數(shù) 測(cè)試的話 可以把參數(shù)卡的死一點(diǎn) # dp =4 因?yàn)橐獧z測(cè)的圓比較小 # minDist 要檢測(cè)的圓之間圓心之間的距離 自己目測(cè)看吧 越準(zhǔn)確越好。。。 如果這個(gè)值過大或者過小,會(huì)發(fā)現(xiàn)很多圓都偏移的厲害(這個(gè)算法對(duì)設(shè)置的參數(shù)非常看重,有些地方明明沒有圓,只要設(shè)置了這個(gè)參數(shù),有點(diǎn)的差不多的都給你畫出個(gè)圓來) # param1 是跟著一個(gè)教程走的 # param2 如果你的圖中的圓非常標(biāo)準(zhǔn) 這個(gè)數(shù)就可以大點(diǎn),越大表示所要檢測(cè)的圓越標(biāo)準(zhǔn) # minRadius和maxRadius就根據(jù)自己圖的實(shí)際情況來定就好print(len(circles[0]),circles)for (x,y,r) in circles[0]:x=int(x)y=int(y)if 0<x<50 and 100<y<550:passelse:output_circle=cv2.circle(hole_right,(x,y),int(r),(0,0,255),3)output=cv2.rectangle(output_circle,(x-2,y-2),(x+2,y+2),(255,255,255),1) plt.figure(figsize=(10,20)) plt.imshow(output,'gray')
其中param1是根據(jù) OpenCV #010 Circle Detection Using Hough Transform 這個(gè)教程里的設(shè)置的
檢測(cè)復(fù)雜背景下的圓
參考:
- opencv 識(shí)別圖片上帶顏色的圓 帶完整代碼
- 如何檢測(cè)一個(gè)圓在多個(gè)圓內(nèi)?
- Circle Detection using OpenCV | Python
- OpenCV #010 Circle Detection Using Hough Transform
- Detecting overlapping circles
- OpenCV Coin Detection Project
- Counting blue and white bacteria colonies with Python and OpenCV
- Hough Circle Transform
- https://stackoverflow.com/questions/9860667/writing-robust-color-and-size-invariant-circle-detection-with-opencv-based-on
- https://stackoverflow.com/questions/26932891/detect-touching-overlapping-circles-ellipses-with-opencv-and-python
總結(jié)
以上是生活随笔為你收集整理的OpenCV识别圆(复杂背景下的圆)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电路设计100个小技巧
- 下一篇: 国家计算机二级西安培训机构,西安国家计算