2016-08-22 4 views
2

まず、OpenCvでPython2.7によるブロブ検出を行っています。私がしたいのは、色の検出後にブロブ検出を終了することです。私は、赤い円(マーク)を検出し、他の斑点の干渉を避けるために、色の検出を最初に行い、次に斑点の検出を行いたいと思います。なぜ私はこのバイナリイメージでブロブ検出を行いません

と色検出後の画像が

binary maskは今、私はこの画像にブロブ検出をしたいですが、それは動作しません。 これは私のコードです。

import cv2 
import numpy as np; 

# Read image 
im = cv2.imread("myblob.jpg", cv2.IMREAD_GRAYSCALE) 

# Set up the detector with default parameters. 

params = cv2.SimpleBlobDetector_Params() 
# Change thresholds 
params.minThreshold = 10; # the graylevel of images 
params.maxThreshold = 200; 

params.filterByColor = True 
params.blobColor = 255 

# Filter by Area 
params.filterByArea = False 
params.minArea = 10000 

detector = cv2.SimpleBlobDetector(params) 


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

# Draw detected blobs as red circles. 
# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS ensures the size of the circle corresponds to the size of blob 
im_with_keypoints = cv2.drawKeypoints(im, keypoints, np.array([]), (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) 

# Show keypoints 
cv2.imshow("Keypoints", im_with_keypoints) 
cv2.waitKey(0)` 

それがこの画像white dots 上で動作するので、私は本当に私は白のドットの画像はバイナリマスクと似て静かですが、なぜカント私は、二値画像上のブロブ検出を行う?と思う、このコードで混乱しています誰も私に違いや正しいコードを教えてくれる?

ありがとうございます!

よろしく、 ナン

+1

私が思うように追加情報が必要です。なぜそれがうまくいかないかの手がかりは、ブロブの構造になる可能性があります。最初のイメージでは、白いピクセルは大きなブロブに接続されていません(つまり、いくつかの単一のピクセルが浮動していることを意味しています)が、第2のイメージでは円は完全なブロブです。 – meetaig

答えて

3

これは、ということになりますブロブ検出器にはデフォルトでfilterByInertiafilterByConvexityのパラメータが有効になっています。 あなたは、あなたのシステムでこれを確認することができます:あなたはdetector = cv2.SimpleBlobDetector(params)呼び出すとき

import cv2 
params = cv2.SimpleBlobDetector_Params() 
print params.filterByColor 
print params.filterByArea 
print params.filterByCircularity 
print params.filterByInertia 
print params.filterByConvexity 

は、だから、実際には、デフォルトの最小値と最大値との慣性と凸部によってもフィルタリングされています。

あなたは明示的にこれらのフィルタ条件を無効にした場合:

# Disable unwanted filter criteria params 
params.filterByInertia = False 
params.filterByConvexity = False 

...そしてあなたは、次の画像を取得detector = cv2.SimpleBlobDetector(params)を呼び出します。そのイメージで第三ブロブは白枠によって引き起こされる blobing result

をあなたの画像の右下にあります。 フレームが同じ場所に常にある場合は、画像をトリミングしたり、真円でフィルタするパラメータを使用し、望ましくないブロブ削除することができます。

params.filterByCircularity = True 
params.minCircularity = 0.1 

をそして、あなたは最終的に取得します:

enter image description here

2

その色によってフィルタでOpenCVのバグ。 >ブロブを検出 - - あなたがする必要があるのは、画像の色を反転させることである>元の色

コード

import cv2 
import numpy as np; 

# Read image 
im = cv2.imread("myblob.jpg", cv2.IMREAD_GRAYSCALE) 

# Set up the detector with default parameters. 
im=cv2.bitwise_not(im) 

params = cv2.SimpleBlobDetector_Params() 
detector = cv2.SimpleBlobDetector_create(params) 


# Detect blobs. 
keypoints = detector.detect(im) 
im=cv2.bitwise_not(im) 
# Draw detected blobs as red circles. 
# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS ensures the size of the circle corresponds to the size of blob 
im_with_keypoints = cv2.drawKeypoints(im, keypoints, np.array([]), (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) 

# Show keypoints 
cv2.imshow("Keypoints", im_with_keypoints) 
cv2.waitKey(0) 

出力

enter image description here

+0

@ArjitMukherjeeあなたをアップ投票する、すばらしいテクニックを使ってブロブを見つける。 –

0

に取得するために再び反転最も簡単な方法は@ArjitMukherjeeが言ったことだろう。

しかし、私はまた@meetaigは、それが動作しない理由についての手がかりはブロブの構造とすることができ、両方の画像

にブロブの構造の違いについて最初にコメントし何をエコーし​​ます。最初の画像白画素で 円は完璧な塊

ある第二の画像に 一方(「周りに浮い」少数の単一画素があるという意味)の大きな ブロブに接続されているすべてではありませんあなたのことが必要それは/しみ

の異なる構造と整合合っているように、微調整は、あなたのアルゴリズムでは、私は一種の部分的にあなたの要件を満たすことができ迅速な微調整を行った:

上記の同時実行
import cv2 
import numpy as np; 

# Read image 
im = cv2.imread("eRCe1.png", cv2.IMREAD_GRAYSCALE) 
# Set up the detector with default parameters. 

params = cv2.SimpleBlobDetector_Params() 
# Change thresholds 
params.minThreshold = 10; # the graylevel of images 
params.maxThreshold = 200; 

params.filterByColor = True 
params.blobColor = 255 

# Filter by Area 
params.filterByArea = True 
params.minArea = 300 

detector = cv2.SimpleBlobDetector(params) 

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

print keypoints 
# Draw detected blobs as red circles. 
# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS ensures the size of the circle corresponds to the size of blob 
im_with_keypoints = cv2.drawKeypoints(im, keypoints, np.array([]), (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) 


cv2.imshow("Keypoints", im_with_keypoints) 
cv2.waitKey(0) 

デあなたが与えた同じイメージの両方に、以下の出力が

サンプル1:

sample #1

サンプル2:

sample #2