2017-05-06 1 views
0

私はすべての光学サークルを検出しようとしていましたが、円のエッジがかなり壊れているという難点に直面しています。他の場所では、ノイズが原因で2値化された後にサークル同士が接触しています。それを解決する方法はありますか?ノイズが存在する場合は円を切断し、エッジが壊れている場合は円を検出する方法は?

pattern = [{0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9}, 
     {0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9}, 
     {0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9}, 
     {0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9}, 
     {0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9}, 
     {0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9}, 
     {0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9}, 
     {0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9}, 
     {0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9}, 
     {0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9} 
    ] 
stringLen = len(pattern) 
blobCnts = sum([len(d) for d in pattern]) 

raw_image = cv2.imread(imagePath) 
gray = cv2.cvtColor(raw_image, cv2.COLOR_BGR2GRAY) 
thresh = cv2.threshold(gray, 0, 255, 
      cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1] 

bloblist = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0] 
blobcnts = contours.sort_contours(bloblist)[0] 
contour_list = [] 
sorted_contour = [] 
for blob in blobcnts: 
     approx = cv2.approxPolyDP(blob,0.01*cv2.arcLength(blob,True),True) 
     area = cv2.contourArea(blob) 
     (x,y),r = cv2.minEnclosingCircle(blob) 
     center = (int(x),int(y)) 
     r = int(r) 
     if ((len(approx) >= 8) & (len(approx) <= 23) & (area > 30) & (8 < r < 20)): 
      contour_list.append(blob) 

numlist = [] 
if blobCnts == len(contour_list): 
     for (l, i) in enumerate(np.arange(0, blobCnts, stringLen)): 
      cnts = contours.sort_contours(contour_list[i:i + 10],method="top-to-bottom")[0] 
      numlist.append(cnt) 

print cnt 

答えて

0

円が塗りつぶされている場合は、Cannyを使用してエッジを取得します。その後、ハフ変換を適用します。これは、ピクセルの欠落、オクルージョンなどのサークルでは堅牢です。

ハフ変換は「投票」システムで動作します。各可能な円は、各ピクセルによって(その上にある場合)投票されます。それは、以前の情報に応じて少し違って使用する必要があります。正確に1つのピクセルがあることがわかっている場合は、最も高いピクセルを選択します。ちょうど2つあることが分かっている場合は、最高のものを選んで、それに非常に近い円を除外します(おそらく同じ円に投票します)。数字がわからない場合は、しきい値と、サークル間の最小距離の両方を設定する必要があります(通常、オーバーラップを4分​​の1以下の半径で禁止する必要があります)。

+0

私はそれを適用するが、私はそれは私の要件 – Zara

+0

ごとに微調整をすることはできませんよ、私は実装が、どのように私はすべての画像のためのいくつかのパラメータを修正することができますか?照明に基づいて変化しています – Zara

+0

関数にはcannyのしきい値を定義するparam1が含まれています。私はそれを最初に30に設定しました。その時100個のサークルから99個のサークルがいくつかのサンプルで得られました。後で、私がそれを減らしたときに、100サークルを検出するレートが減少しました。後で、私は最初にcannyでエッジを検出し、次にこの関数への入力としてエッジ画像を渡しました。その後、58サンプルから2つだけが拒絶された。だから、私はこのシナリオの結論は何かを尋ねたいだけです。 – Zara

関連する問題