2017-07-25 14 views
5

私はハーフサークルを視点の循環オブジェクトに適用しようとしている画像を持っています。ハーフサークルを円形の影に変換する

私はシリンダーの外側の影に合った円を見つけるのが難しいです。このシャドウを適切に分割して円を簡単に合わせるには何ができますか?

コード:

img = cv2.medianBlur(im,7) 
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR) 

plt.imshow(cimg) 
plt.show() 

circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,20, 
          param1=50,param2=150,minRadius=100,maxRadius=0) 

circles = np.uint16(np.around(circles)) 

for i in circles[0,:]: 
    # draw the outer circle 
    cv2.circle(cimg,(i[0],i[1]),i[2],(255,0,0),10) 
    # draw the center of the circle 
    cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),20) 

    radius = i[2] 
    print 'radius', radius, 'px' 

plt.imshow(cimg) 
plt.show() 
+0

「三日月画像の上に? – Micka

+0

はい - 画像の上半分に黒い影があります。 – Sam

+0

入力画像を提供できますか? –

答えて

2

多くの機能があり、あなたが知っているかわからないものを想定していて、執筆に長時間を費やすことができないので、コードを書き留めて、それを通過しません。 をお持ちの場合はの質問があればお気軽にお問い合わせください。

あなたは三日月の影に円を当てるように頼んだので、影に円を当てはめました。私が想像していたある種の制作コードでは、このような性質の画像を多く処理しなければならないことに気づいて、それに合わせてサークルを修正する必要があります。特にこのタイプの構造解析は、対象のオブジェクトがあなたが探しているものではなく、与えられた形状をピクセルにフィットさせることだけを心配しています。

私は意図的に誤ってフィッティングしたサークルをそこに残しました。私は、あなたが興味を持っている正確に何に依存凸包、またはハール検出器や形状マッチングのために行くことをお勧め。

import cv2 
import numpy as np 

img = cv2.imread("orig.png", cv2.IMREAD_GRAYSCALE) 

ret, thresh = cv2.threshold(img, 80, 255, cv2.THRESH_BINARY_INV) 

ero = cv2.erode(thresh, np.ones((5,5))) 
dil = cv2.dilate(ero, np.ones((5,5))) 

img, contours, hierarchy = cv2.findContours(dil, cv2.RETR_EXTERNAL, 
              cv2.CHAIN_APPROX_NONE) 

#just for drawing purposes, the cimg is not really required 
cimg = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) 
for cnt in contours: 
    (x, y), radius = cv2.minEnclosingCircle(cnt) 
    center = (int(x), int(y)) 
    radius = int(radius) 
    cv2.circle(cimg, center, radius, (255, 0, 0), 1) 

私が得た出力画像はいずれも三日月が装着されている

enter image description here

ました正確に三日月ではなく、タンクの外側に一致する底の1つで正確に。あなたは一種のヒステリシスを追跡し、外縁が正確に一貫して三日月になるまでその円を移動させることができます。

パラメータを調整するだけで追加の円を削除できますが、必要な正確な円をフィルタリングすることはあなた次第です。 F.e.一番上の三日月が最小のy座標だけを求めたい場合、すべての影がこれらと同じ大きさであれば、ある閾値より大きな半径の円などを求めることができます。

2

あなたがセグメントに見ている影がはるかに暗い領域です。私はより明るいすべてのピクセルをフィルタリングするためにしきい値を使用します。残っているノイズがある場合は、Connected Componentsを使用して最大の「ブロブ」を探します。影が唯一残っていて他のすべてのピクセルが0に設定されたら、私は上記のダンシュカが推奨するminEnclosingCircleを試します。

関連する問題