やること
どうも、Suzuです (゜▽゜)
ロングセラーのアニメキャラクターは時代に合わせてデザインが変化しているそうです。最近、ネットサーフィンをしていたら「初期のピカチュウの方が太っていて可愛い」と言っているサイトを見つけました。確かに初期のピカチュウ(画像左)と今のピカチュウ(画像右)を比べると明らかに今の方が痩せています。なんていうか昔のはずんぐりむっくりしています(ひどい)。ライザ〇プのようなBefore~Afterを成し遂げています。
なお、ハム太郎のほうがもっとひどいです。いま2024年ですがまだ体残ってますか?
今回はピカチュウとハム太郎がどれくらい痩せたのか、画像処理で円形度を測定して定量的に調べてみたいと思います。
参考文献
「丸さ」を表す指標には「真円度」と「円形度」があります。こちらのサイトで詳しく説明されているのでご覧ください。
こちらのサイトによる、真円度よりも円形度のほうが直感的な丸さを表現している、とのこと。今回は円形度を算出することにしました。
使用した画像
ピカチュウはこちらの画像を拝借しました。1997年発売の手乗りピカチュウも参戦しています(底面に2つの電極があり、手に乗せると「ピカチュウ??」と疑問形で鳴く)。
ハム太郎はこちらの画像を使用させていただきました。
前処理
各画像、耳や尻尾などを無視したボディを白く塗りつぶしました。手作業です。
ハム太郎も同様に二値化しました。
白い領域の大きさが違うと思われるかもしれませんが、これは円形度に影響しないのでご安心を。
コード
円形度は、白い領域の面積(A)と周囲長(L)を求めて「4πA/L2」で求められます。直感的には、「この面積で作られる円の面積」/「この周囲長で作られる円の面積」、という比率を表します。0~1の値が出て、円形度=1は真円です。
こちらがコードです。
import cv2
import numpy as np
import matplotlib.pyplot as plt
#グレースケール画像として読み込む
img = cv2.imread('5-29_p1.png', 0)
#輪郭を取得
contours, hierarchy = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
print(f'len(contours) = {len(contours)}')
#輪郭を描画
img2 = np.zeros(img.shape, 'uint8')
cv2.drawContours(img2, contours, -1, 255, 2)
plt.imshow(img2, vmin=0, vmax=255, cmap='gray')
plt.show()
#面積
area = cv2.contourArea(contours[0])
print(f'area = {area}')
#周囲長
length = cv2.arcLength(contours[0], closed=True)
print(f'length = {length}')
#円形度
circularity = 4 * np.pi * area / (length**2)
print(f'circularity = {circularity}')
len(contours) = 1
area = 55252.0
length = 901.2346260547638
circularity = 0.85483467169637
ということで昔のピカチュウの円形度は0.85と分かりました!
現代のピカチュウは、
len(contours) = 1
area = 46415.0
length = 880.1564154624939
circularity = 0.7529194234795733
円形度0.75でした。
円形度が0.1くらい低下していることから、現代のピカチュウはスリムになったことが示されました。
結果まとめ
ピカチュウの円形度がこちらです!手乗りピカチュウが丸すぎる!
ハム太郎の円形度はこちらです!順調に痩せています!ちなみに正方形の円形度は0.785です。
さいごに
初代と現代のピカチュウの体型を定量的に比較しました。ネットで指摘されているように、ピカチュウはダイエットに成功していたのですね、、、これがシンデレラ体重とかモデル体重と呼ばれる領域なのでしょうか。
今回のネタに似たことを過去にもやっています。「ポケモンのデザインが丸みを帯びてきているのでは?」に興味がある方はこちらもどうぞ↓
応援はリツイートなどを実行する形でお願いします!また、Qiitaとnoteもやっていますのでフォローお願いします!
Qiita
note