2016-09-12 32 views
0

OpenCVを使用して白いブロブ検出を実行しようとしています。しかし、私のスクリプトは小さな白い塊が検出されている間、私の目標である大きな白いブロックを検出することができませんでした。私はOpenCVを初めて使っています.OpenCVでsimpleblobdetectionを使用すると何か問題がありますか?OpenCVを使用したブロブ検出

を[部分的に解決、下記をお読みください]そして、ここでスクリプトです:

#!/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) 

はEDIT

面積の最大値の大きな値を追加することで、私は大きなを識別することができています私の最終目標は、大きな白い矩形が存在するかどうかを特定することです。そして、私が白いブロブの検出は、矩形だけでなく周囲の領域も返します。最初の白画素のみを取得し、除去するためにカラーフィルタを設定し、@PSchnからの回答に基づいて

、iは論理を適用するために自分のコードを更新:

EDIT 2 [この部分を解決しました]ノイズポイントは開口部を使用します。それはサンプルデータのために動作し、私は正常に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パラメータを設定することにより、私は大きな塊を検出することができます。ご回答有難うございます。しかし、私は別の問題にぶつかります。私は、同じ色の値のピクセルと互いに隣接する(他の値の他のピクセルで区切られていない)ブロブを識別したいだけです。私が前に投稿した例のように、私は大きな白い矩形のブロックを特定しようとします、そして、私が得るものは矩形の巨大な塊であり、多くの白いピクセルを放棄します。 –

関連する問題