物理の駅 Physics station by 現役研究者

テクノロジーは共有されてこそ栄える

Python: OpenCVでライン(線形)プロファイルを取得する

Windows11でおなじみの壁紙のラインプロファイル=直線上のピクセルの輝度値を取得してみよう。

参考にしたブログ ラインプロファイルの取得法【5/24 訂正】 #Python - Qiita

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

x0, y0 = 2000, 300
x1, y1 = 3000, 2300
num = int(round(np.hypot(x1-x0, y1-y0)))
xx, yy = np.linspace(x0, x1, num), np.linspace(y0, y1, num)

# OpenCVではBGRの順で読み込まれる
dst_cv = cv2.imread(r"C:\Windows\Web\Wallpaper\Windows\img0.jpg",-1) 
# BGR→RGB変換
dst_rgb = cv2.cvtColor(dst_cv, cv2.COLOR_BGR2RGB)
# GRAYスケールで読み込む
dst_gray = cv2.imread(r"C:\Windows\Web\Wallpaper\Windows\img0.jpg",0)
plt.imshow(dst_rgb)
plt.plot([x0, x1], [y0, y1], 'ro-',linewidth = 1, label='width=1')
plt.show()

# GRAYスケール画像でしか機能しない。座標指定順がYY→XXなのに注意
profile = scipy.ndimage.map_coordinates(dst_gray, np.vstack((yy,xx))) 
plt.plot(profile)
plt.show()

著作権が気になるのでプロファイルのプロットのみ掲載する。

docs.scipy.org

scipy.ndimage.map_coordinates のデフォルトは order=3なので、スプラインを3次関数でフィッティングしている。つまり、Cubic補間である。

単なる線形補間にしたい場合は、order=1 を指定すれば良い。

cv2.splitを使って色を分割すれば、各色ごとのプロファイルも取得できる。