2017-07-25 140 views
5

我有一個圖像,我試圖將霍夫圓變換應用到視圖中的圓形對象。霍夫圓變換爲圓形陰影

我很難找到一個適合圓周的外部陰影的圓。可以做些什麼來恰當地分割這個陰影,並輕鬆地適應一個圓圈?

代碼:

img = cv2.medianBlur(im,7) 
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR) 

plt.imshow(cimg) 
plt.show() 

circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,20, 
          param1=50,param2=150,minRadius=100,maxRadius=0) 

circles = np.uint16(np.around(circles)) 

for i in circles[0,:]: 
    # draw the outer circle 
    cv2.circle(cimg,(i[0],i[1]),i[2],(255,0,0),10) 
    # draw the center of the circle 
    cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),20) 

    radius = i[2] 
    print 'radius', radius, 'px' 

plt.imshow(cimg) 
plt.show() 
+0

你的意思是「新月」區域圖像頂部? – Micka

+0

是的 - 圖像上半部分出現的黑影。 – Sam

+0

你能提供輸入圖像嗎? –

回答

2

我只是要寫出代碼,而不是經過它,因爲有很多功能,我不願意承擔你知道或不知道的事情,並花很長時間來完成寫作。如果您有任何問題隨時問,我會在帖子中添加它們。

您要求爲新月形陰影適合一個圓圈,所以我已將圓圈設置爲陰影。重要的是要認識到,在我想象的某種生產代碼中,必須處理大量這種性質的圖像,因此有必要改進所安裝的圓。特別是這種類型的結構分析只是擔心將給定的形狀擬合到像素上,而不是所討論的對象是您正在尋找的東西。

我特意在那裏留下了錯誤的圈。我建議去爲凸形輪廓,或哈爾探測器或形狀匹配取決於究竟你感興趣的問題。

import cv2 
import numpy as np 

img = cv2.imread("orig.png", cv2.IMREAD_GRAYSCALE) 

ret, thresh = cv2.threshold(img, 80, 255, cv2.THRESH_BINARY_INV) 

ero = cv2.erode(thresh, np.ones((5,5))) 
dil = cv2.dilate(ero, np.ones((5,5))) 

img, contours, hierarchy = cv2.findContours(dil, cv2.RETR_EXTERNAL, 
              cv2.CHAIN_APPROX_NONE) 

#just for drawing purposes, the cimg is not really required 
cimg = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) 
for cnt in contours: 
    (x, y), radius = cv2.minEnclosingCircle(cnt) 
    center = (int(x), int(y)) 
    radius = int(radius) 
    cv2.circle(cimg, center, radius, (255, 0, 0), 1) 

我得到的輸出圖像是

enter image description here

兩個半月形配以正確地與底部一個匹配的坦克外,而不是新月準確。儘管如此,你可以做一種遲滯跟蹤並移動這個圓,直到它的外緣恰好處於新月時。

如果您恰好調整參數,但是過濾所需的確切圓圈取決於您,還有一個可以刪除的圓圈。 F.E.如果你只想要頂部新月要求最小的座標,如果所有的陰影都像這些一樣大,那麼你可以要求只有大於某個閾值的半徑的圓等...

2

你正在尋找段的陰影是迄今爲止最暗的區域。我會使用閾值過濾掉所有更亮的像素。如果仍有噪聲,我會使用Connected Components來查找最大的「blob」。一旦陰影是唯一剩下的東西,所有其他像素都設置爲0,我會嘗試dhanushka上面推薦的minEnclosingCircle。