※当サイトではアフィリエイト広告を利用しています。

画像処理

pythonで円周上の座標を取得する方法

on-the-circle-coordinate-deg120

こんにちは、タナカです。

この記事では、画像の円周上の座標を求める方法を説明します。

この記事の内容
  • 画像上にある円の円周上の座標を取得する方法がわかる

1. 画像の軸を理解する

画像の軸は左上を原点とし、右方向に+x, 下方向に+yとなっています。今回、(x, y) = (150, 150)を中点とする半径50pxの円を考えます。

角度に応じてこの円周上の座標を取得する方法を説明します。

2. 円周上の座標を取得する

円周上の座標は下図の三角形を考えると求めることができます。特に、円の中点を原点として考えるとわかりやすいです。

画像はx軸を0°とし、右回りに+、左周りに-となっています。例えば、角度10°の場合は左図のような三角形になり、角度-120°の場合は右図のような三角形になります。

circle-coordinate-image

円周上の座標は、中点からx方向にrcosθ移動し、y方向にrsinθ移動したところになります。半径rの大きさや角度θに応じて、その移動量が変わることになります。

3. 円周上の座標を取得するコード

円周上の座標を求めるコードはこのようになります。コードの詳細については、コメントをご確認ください。

import numpy as np
import matplotlib.pyplot as plt
import cv2
import math

height = 300
width = 300

# 真っ白な300x300の画像
white = np.ones([height, width, 3], dtype = np.uint8) * 255

# 円の中点
p = (150, 150)

# 半径r[px]
r = 50

# 円の描画
cv2.circle(white, p, 1, (255, 0, 0), -1)
cv2.circle(white, p, r, (255, 0, 0), 1)

# 角度θ[°]
theta = -120

# degree → rad に変換
rad = np.deg2rad(theta)

# 移動量を算出
rsinθ = r * np.sin(rad)
rcosθ = r * np.cos(rad)

# 円周上の座標
t = np.array([p[0] + rcosθ, p[1] + rsinθ])

# 円周上の点を描画
cv2.circle(white, (int(t[0]), int(t[1])), 1, (0, 0, 0), -1)

# 画像の可視化
plt.imshow(white)
plt.show()
on-the-circle-coordinate-deg120

np.sin()とnp.cos()の引数には、角度を「°」ではなく「rad」を入れる必要があるため、np.deg2rad()で「rad」に変換しています。

まとめ

円周上の座標を求める方法を備忘録としてまとめました。

画像のx軸とy軸の方向を間違えやすいので、ご注意ください。