我試圖在openCV中使用Canny過濾器來識別輪廓並填充輪廓以創建一個蒙版。我有這樣的起始圖像: 在opencv中填充輪廓
我試圖找出我的圖像中的所有功能,繪製輪廓,並填充它們。我想這個代碼在OpenCV中實現它:
img = cv2.imread(os.path.join(fName,f), 0)
img = cv2.GaussianBlur(img,(5,5),0)
cv2.bilateralFilter(img, 9, 150,450)
edge = np.zeros((img.shape[0] + 2, img.shape[1] + 2), np.uint8)
edge = cv2.Canny(img, 500, 300, apertureSize=5)
cont, heir = cv2.findContours(edge.copy(), cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
contours = [cv2.approxPolyDP(cnt, 3, True) for cnt in cont]
cv2.morphologyEx(img, cv2.MORPH_CLOSE, np.ones((5,5), dtype='uint8'))
cv2.drawContours(img, contours, -1, 255, -1)
plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')
plt.xticks([]), plt.yticks([]) # to hide tick values on X and Y axis
大多數情況下,我在參數猜測(試驗和錯誤,這很難!)。不幸的是,不是整齊的輪廓,用白色填充,我得到了更像這樣的東西:
有什麼想法嗎?顯然,我需要更好地關閉邊緣,並調整一些Canny參數,但我真的可以使用一些指導。
謝謝!
編輯:閾值並沒有做很好的創建我想要的面具,我認爲我的'明亮'點不比背景明亮,但我想能夠在黑色背景上有白色的點。
代碼:
img = cv2.imread(os.path.join(fName,f), 0)
cv2.bilateralFilter(img, 9, 90,16)
#img = cv2.GaussianBlur(img,(5,5),0)
#binImg = np.zeros((img.shape[0], img.shape[1]), np.uint8)
binImg = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 25, 2)
#binImg = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
#newimg = np.multiply(img, np.divide(edge, 255.0))
plt.imshow(binImg, cmap = 'gray', interpolation = 'bicubic')
plt.xticks([]), plt.yticks([]) # to hide tick values on X and Y axis
#plt.show()
'特徵'在這裏指圖像中的淺色點。 'Countours'指的是這些點上的邊緣。由於採用了一些自動閾值算法,二進制濾波在過去使用ImageJ是不可靠的,但它是一種有效的選擇。我想比較這兩種方法。 – JMarotta 2014-10-01 18:32:56
OP用二進制掩碼結果更新。 – JMarotta 2014-10-01 18:57:10