Python使って同心円画像を作る

python

 MTF測定用チャートに出てくるような同心円の画像を作る必要があったのでその過程を記しておきます。

仕様

 任意のサイズ(正方形)の画像に対して、任意の個数の円を描画するもの。輝度変化はcosで変化し、円の外側は繰り返しにするか、指定の個数の円で打ち止めるか決められる。としました。

 こんなのを発生させられるような関数。

コード

 関数に切り出して、10行で済んでしまいました。

###
# 2次元の同心円画像を発生
def concentricCirclesGen(size, cycle, border=0):
    x = np.linspace(-cycle, cycle, size)
    xx,yy = np.meshgrid(x, x)
    dis = np.sqrt(xx**2 + yy**2)
    
    if border == 0:
        dis[cycle < dis] = cycle

    cos = (0.5*np.cos(2*np.pi*dis) + 0.5) * 255
    
    return cos.astype(np.uint8)

 画像サイズの等差数列を作って、それを2次元に拡張。その差は円の個数で決定されます。3個の円を13×13画素で作りたければ、-3,-2.5,-2,…,2,2.5,3 という配列を作ることになります。これを2次元に拡張して2乗してルート。すなわち中心からの距離を表す2次元配列にします。

 3より大きければ3にクリップすればそこより先の円は書かれません。これに2π掛けてcos通して0~255に正規化すだけ。

 使い方は簡単。512×512、4個の円をきっかりで書きたければ

img = concentricCirclesGen(512, 4)

 こんな呼び方で。

 こんな画像が得られます。borderを非ゼロ指定すれば

img = concentricCirclesGen(512, 4, border = 1)

 こう。cosの輝度変化が煩わしければ

img = (img > 128) * 255 # 2値化

 こんなして2値化すればよし。太さは2値化閾値(今回だと128)を調整すればよいです。

 こう

 たいしたもんではないですが、後でこの関数の書き方を忘れたとき用のメモですね。

python画像処理
スポンサーリンク
キャンプ工学

コメント

タイトルとURLをコピーしました