2016-12-05 1 views
0

イメージを持っていて、半径rの円に属するピクセルの強度を中点(Mx、My)の周りに引き出す必要があります。 重要な部分は、ルックアップのために円の周囲を定義する座標(x、y)のリストを構築することです。私はmidpoint circle algorithm from rosettaのバージョンを採用しましたが、サークル上のポイントは注文されません。イメージ内の輝度値のルックアップに使用できる座標のリストを取得するためのスマートな方法はありますか?私はそれを実装せずにnumpyを避けるのが理想的です(しかし私はopenCVを使うことができます)。座標を取得したら、画像から値の検索を高速化するヒントもありがたく思う。pythonを使用して円と中点と半径のピクセル値を抽出します。

これは、番号なしリストのために私のコードです:

def circle(x0, y0, radius): 
    f = 1 - radius 
    ddf_x = 1 
    ddf_y = -2 * radius 
    x = 0 
    y = radius 

    clist=[] 

    while x < y: 
     if f >= 0: 
      y -= 1 
      ddf_y += 2 
      f += ddf_y 
     x += 1 
     ddf_x += 2 
     f += ddf_x  
     clist.append([x0 + x, y0 + y]) 
     clist.append([x0 - x, y0 + y]) 
     clist.append([x0 + x, y0 - y]) 
     clist.append([x0 - x, y0 - y]) 
     clist.append([x0 + y, y0 + x]) 
     clist.append([x0 - y, y0 + x]) 
     clist.append([x0 + y, y0 - x]) 
     clist.append([x0 - y, y0 - x]) 
    return clist 

c=circle(10,10,5)  
for i in range(len(c)): 
    plt.plot(c[i][0],c[i][1],'o',color=[i/50.0,1-i/50.0,1]) 
+0

numpyを使用していない場合の画像のフォーマットは何ですか?技術的な理由から – Iluvatar

+0

私は最終的に私がnumpyをインポートすることはできませんが、私はopencvをインポートすることができますironpythonでこれを実装する必要があります。 – jlarsch

+0

また、何らかの並べ替えが必要なことを暗示していますか?また、あなたがここに持っているコードは、周囲だけではなく塗りつぶされた円の点を得ているようです。 – Iluvatar

答えて

0

私はコメントで述べたように、そのための組み込み関数は、OpenCVのである確信しています。

円上の単純な順序の座標リストを取得するには、三角法を使用します。

x_perimeter = x_center +罪(角度)*半径

y_perimeter = y_center +(角度)のcos *半径

合理的な角度の増分のためにそれを行うと、あなたはどのような順序であなたのポイントの所望の数を取得します好き。

最も効率的な方法ではなく、そのシンプルで直感的な方法です。必要なのは、ほとんどの画像処理ライブラリが提供するサブピクセルの輝度を与える機能です。それ以外の場合は、独自の値を書き込むか、座標値を丸めます。

+0

ありがとう。私はラスタライズされたサークルのポイントを正確に与える一般的なソリューションを期待していました。あなたの解決策としては、1ピクセルあたり正確に1つの座標ペアを得るために正しい角度の増分を推測する必要があります。詳細については、このウィキペディアの記事を参照してください:https://en.wikipedia.org/wiki/Midpoint_circle_algorithm – jlarsch

+0

ライブビデオストリームで数百フレーム/秒でこれをやりたいので、パフォーマンスは重要です。私は避けたいのですが罪とコサインをできるだけ多く – jlarsch

+0

罪とcosの防衛では、彼らは非常に高速にすることができ、あなたが本当にそれが必要な場合は、ルックアップテーブルを使用することができます。 – Iluvatar

関連する問題