2016-09-12 373 views
0

我正在嘗試使用OpenCV進行一些白色blob檢測。但是我的腳本未能檢測到大白塊,這是我的目標,同時檢測到一些小斑點。我是OpenCV的新手,在OpenCV中使用simpleblobdetection時我做錯了什麼? [解決了部分,請閱讀下文]使用OpenCV進行Blob檢測

這裏是腳本:

#!/usr/bin/python 

# Standard imports 
import cv2 
import numpy as np; 

from matplotlib import pyplot as plt 

# Read image 
im = cv2.imread('whiteborder.jpg', cv2.IMREAD_GRAYSCALE) 
imfiltered = cv2.inRange(im,255,255) 

#OPENING 
kernel = np.ones((5,5)) 

opening = cv2.morphologyEx(imfiltered,cv2.MORPH_OPEN,kernel) 

#write out the filtered image 

cv2.imwrite('colorfiltered.jpg',opening) 


# Setup SimpleBlobDetector parameters. 
params = cv2.SimpleBlobDetector_Params() 

params.blobColor= 255 
params.filterByColor = True 


# Create a detector with the parameters 
ver = (cv2.__version__).split('.') 
if int(ver[0]) < 3 : 
    detector = cv2.SimpleBlobDetector(params) 
else : 
    detector = cv2.SimpleBlobDetector_create(params) 


# Detect blobs. 
keypoints = detector.detect(opening) 

# Draw detected blobs as green circles. 
# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS ensures 
# the size of the circle corresponds to the size of blob 

print str(keypoints) 

im_with_keypoints = cv2.drawKeypoints(opening, keypoints, np.array([]), (0,255,0), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) 

# Show blobs 
##cv2.imshow("Keypoints", im_with_keypoints) 

cv2.imwrite('Keypoints.jpg',im_with_keypoints) 

cv2.waitKey(0) 

編輯

通過增加面積最大值的更大的價值,我能夠識別大blob但我的最終目標是確定存在或不存在的大白色矩形。我所做的白色斑點檢測不僅返回了矩形,還返回了周圍區域。 [這部分解決]

編輯2:

基於從@PSchn答案,我更新我的代碼應用邏輯,首先將彩色濾光片只得到了白色像素,然後取出噪聲點使用開放。它適用於樣本數據,我可以在BLOB檢測後成功獲得關鍵點。 enter image description here

回答

2

如果你只是要檢測的白色矩形,你可以嘗試設置了較高的門檻,如253,用開口抹去小物體,並拍下最大的斑點。我第一次平滑圖像,然後進行閾值吧:

enter image description here

,並開口道:

enter image description here

現在你只需要使用findContours並採取boundingRect。如果你的矩形總是那麼白,它應該工作。如果你下那麼251與您的門檻其他小斑點將會出現,您所在的地區與他們合併,就像這裏:

enter image description here

,那麼你仍然可以做一個開口幾次,你會得到這樣的: enter image description here

但我不認爲這是最快的想法;)

+0

真棒解釋。這是我正在尋找的。感謝! –

+0

不客氣。但我不知道它是否適用於所有圖像。希望它;) – PSchn

+0

你介意分享代碼如何做平滑和其他步驟?另外調整參數以獲得此類任務的最佳過濾器的最佳方法是什麼?再次感謝! –

1

你可以嘗試將params.maxArea設置爲令人討厭的東西(在數以萬計的某處):默認值可能比你試圖檢測的矩形區域更低。此外,我不知道這是否是真實的,但我聽說顏色檢測與邏輯錯誤,因此它可能值得嘗試禁用它,以防萬一是導致問題(這可能被固定在以後的版本,但它仍然是值得一試)

+0

通過設置一個較大的maxArea參數過濾器,我可以檢測到大斑點。感謝您的回答。但我碰到另一個問題,我只是想確定哪些像素在相同的顏色值和相鄰的(不被其他值的其他像素分隔)的斑點。就像我之前發佈的例子,我試圖找出大的白色矩形塊,我得到的是巨大的矩形塊和它投降的白色像素。 –