Python でアクリルキーホルダーの重心を調べる



Python で画像処理してアクリルキーホルダーの重心を調べるのがあまりにも簡単で衝撃を受けたのでメモ。

$ python3

以下のコードを入力。

from PIL import Image
import numpy as np
from scipy import ndimage

# PNG画像の読み込み
im = np.array(Image.open('keychain.png'))

# 画像からアルファ値のみを取り出す
im2 = im[:, :, 3]

# アルファ値がない場合で、輝度値を用いる場合は以下を実行
# im2 = (im[:, :, 0].astype(float) + im[:, :, 1] + im[:, :, 2]) / 3.0

# 重心を計算
(y, x) = ndimage.measurements.center_of_mass(im2)

print("y = {0}, x = {1}".format(y, x))

このプログラムを実行すると、重心が出力される。試しに重心の位置に赤点を描いてみたのが以下の画像です。合ってるかな?

参考にした記事

scipy.ndimage.measurements.center_of_mass
Python, NumPyで画像処理(読み込み、演算、保存) | note.nkmk.me
NumPyでRGB画像の色チャンネルを分離して単色化、白黒化、色交換 | note.nkmk.me

追記

重心を画像に表示して保存する。

im[int(y), :, (0, 1, 2)] = 0
im[int(y), :, 3] = 255
im[:, int(x), (0, 1, 2)] = 0
im[:, int(x), 3] = 255
Image.fromarray(im).save("keychain_center.png")