Pythonにおける座標変換(coordinate transformation)は、グラフィックス、画像処理、物理シミュレーション、地図データ処理など、さまざまな分野でよく使われる概念です。
ここでは、初心者にも分かりやすく、2次元座標系を使った基本的な変換方法を中心に解説します。
目次
座標変換とは
座標変換とは、「ある座標系で表現された点を、別の座標系での位置に変換する」ことを指します。
たとえば
- 左上が原点の画像の座標系 → 中心が原点の数学的な座標系
- 回転や拡大縮小を適用した座標に変換
- 緯度経度 → 平面直角座標
よく使う2D座標変換の種類
以下は、2D(x, y)座標における基本的な変換の一覧です。
種類 | 内容 |
---|---|
平行移動 | 座標を一定量だけ移動する |
回転 | 原点や任意の点を中心に回転 |
拡大・縮小 | 倍率をかけてスケーリングする |
アフィン変換 | 上記すべてを含む線形変換 + 移動 |
Pythonコードで学ぶ座標変換(基本編)
平行移動(Translation)
def translate(x, y, dx, dy):
return x + dx, y + dy
# 例: (10, 5) を x方向に3, y方向に-2移動
print(translate(10, 5, 3, -2)) # → (13, 3)
回転(Rotation)
import math
def rotate(x, y, angle_degrees, ndigits=6):
angle_radians = math.radians(angle_degrees)
cos_a = math.cos(angle_radians)
sin_a = math.sin(angle_radians)
x_new = x * cos_a - y * sin_a
y_new = x * sin_a + y * cos_a
return round(x_new, ndigits), round(y_new, ndigits)
print(rotate(1, 0, 90)) # → (0.0, 1.0)
拡大・縮小(Scaling)
def scale(x, y, sx, sy):
return x * sx, y * sy
# 例: (2, 3) をx2倍, y0.5倍
print(scale(2, 3, 2, 0.5)) # → (4, 1.5)
座標変換をまとめて行う(アフィン変換)
座標変換は行列を使って連続して適用することもできます。
NumPyを使ってアフィン変換
import numpy as np
# アフィン変換行列(3x3)
def affine_transform(point, matrix):
x, y = point
vector = np.array([x, y, 1]) # 同次座標に変換
result = matrix @ vector
return result[0], result[1]
# 例:回転 + 平行移動
angle = 45
theta = np.radians(angle)
cos_a = np.cos(theta)
sin_a = np.sin(theta)
# 回転 + 移動行列
affine_matrix = np.array([
[cos_a, -sin_a, 100], # x方向に100移動
[sin_a, cos_a, 50], # y方向に50移動
[0, 0, 1]
])
point = (10, 0)
print(affine_transform(point, affine_matrix)) # → 変換された新しい座標
よく使われるライブラリ
ライブラリ | 用途 |
---|---|
NumPy | 行列による変換処理 |
OpenCV | 画像処理での座標変換(cv2.warpAffineなど) |
matplotlib | 座標変換の可視化 |
pyproj | 緯度経度などの地理座標系の変換 |
補足:座標変換は順番が重要!
複数の変換を行う場合、「どの順に変換をかけるか」が結果に大きく影響します。
- 例:回転→移動 と 移動→回転 では全く異なる座標になる
- 行列として掛け合わせる場合も、順番に注意
まとめ

ポイント | 説明 |
---|---|
座標変換とは | 点の位置を別の座標系や操作後の位置に変換すること |
代表的な変換 | 平行移動、回転、拡大・縮小、アフィン変換 |
実装はNumPyが便利 | 行列操作で効率的に複雑な変換を一度に行える |
OpenCVやpyprojも便利 | 画像処理や地理データには専用ライブラリがある |
順番に注意 | 複数変換をするときは順序が結果を左右する |
以上、Pythonの座標変換についてでした。
最後までお読みいただき、ありがとうございました。