3

OpenCVとPythonを使用して、次の画像の白い点を検出しようとしています。

ここに画像の説明を入力してください

関数cv2.HoughCirclesを使用してみましたが、成功しませんでした。

別の方法を使用する必要がありますか?

これは私のコードです:

import cv2, cv
import numpy as np
import sys

if len(sys.argv)>1:
    filename = sys.argv[1]
else:
    filename = 'p.png'

img_gray = cv2.imread(filename,cv2.CV_LOAD_IMAGE_GRAYSCALE)

if img_gray==None:
    print "cannot open ",filename

else:
    img = cv2.GaussianBlur(img_gray, (0,0), 2)
    cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
    circles = cv2.HoughCircles(img,cv2.cv.CV_HOUGH_GRADIENT,4,10,param1=200,param2=100,minRadius=3,maxRadius=100)
if circles:
    circles = np.uint16(np.around(circles))
    for i in circles[0,:]:
        cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),1) 
        cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)   

cv2.imshow('detected circles',cimg)
cv2.waitKey(0)
cv2.destroyAllWindows()
4

3 に答える 3

1

OpenCV で形態学的再構成を再現できる場合は、タスクを大幅に簡素化する h-dome 変換を簡単に構築できます。それ以外の場合は、ガウス フィルタリングの単純なしきい値でも十分な場合があります。

ここに画像の説明を入力

Binarize[FillingTransform[GaussianFilter[f, 2], 0.4, Padding -> 1]]

上記のコードではガウス フィルター処理が行われ、入力の境界付近のノイズが効果的に抑制されます。そうしないと、h ドーム変換後にノイズが残ります。

次に、ガウス フィルタリング後の単純なしきい値の結果 ( Binarize[GaussianFilter[f, 2], 0.5]) と、Kapur のしきい値処理法を使用した直接の 2 値化によって得られる別の結果があります (論文「ヒストグラムのエントロピーを使用したグレーレベル画像のしきい値処理の新しい方法」を参照)。 」(これはもはや新しい方法ではなく、1985年からのものです)):

ここに画像の説明を入力 ここに画像の説明を入力

上の右の画像には、境界全体に小さな点がたくさんありますが (この画像解像度では見ることができません)、完全に自動化されています。これら 3 つのオプションのうち、2 番目のオプションのみが OpenCV に既に存在します。

于 2013-02-08T17:26:13.177 に答える
0

メディアン フィルターを使用すると画像が改善されると思います。いくつかのカーネル、3x3 または 7x7 で実験してみてください。その後、いくつかの(ローカル)しきい値処理アルゴリズムが形状を取得します。HoughCircles を作成するか、単に輪郭を見つけて丸みをチェックすることができます。

于 2013-02-08T17:25:21.243 に答える
0

適切なしきい値手法を使用して、イメージをバイナリ イメージに変換します (Otsu が役立つ場合があります)。次に、侵食などの形態学的操作を使用して円を小さくすると、円の中心を簡単に見つけることができます。

于 2013-02-08T17:25:55.873 に答える