コミュニティ

最近のポケモンはデザインが複雑になったのか?【Python】【OpenCV】

はじめに

先日、ポケモンたかさおじさんこと、生㌔Pのブログにて次のような記事が投稿された。

ポケモンらしさ-2_意見分析 マスコット感検証
https://pkmnheight.blogspot.com/2020/04/2.html

ざっくり引用すると、以前バズってた以下の海外の分析画像を、転載したTweetがあった。

このTweetに対して、ポケモンたかさおじさんが 猛撃 していたというものである。
ざっっっくり要約すると、各世代ごとに幼虫・昆虫ごとに部位をピックアップし、
そう単純にマスコット化しているわけではないと分析している。

恐ろしい観察・分析力とボリュームなので、是非読んでいただきたい。


ところで、ポケモンという巨大なコンテンツは20年以上続いているだけあり、
各人のポケモンに対する思い入れや付き合い方は異なる。

最も大きなインパクトだった1996年のポケモン赤緑直撃世代にとって
ポケモンは今でも初代のポケモン151匹なのだろう。

音楽バンドの古参ファンが
「やっぱ初期のアルバムの方がいいよね」
「最近はPOPになったなあ・・・」
などと言いがちなのと同様に、

「最近のポケモンはポケモンらしくない」
「昔のポケモンの方がよかった」

と言いがちなのである。

そんな古参ファンにとって、最近のポケモンがポケモンらしくない理由については、それぞれ思うところがあったのだろう。(だからこそ、先程の海外の分析画像を転載した方のように、昔のポケモン・最近のポケモンの一部を切り取り、その理由を求めるのだ)

先日のポケモンたかさおじさんのアンケートでは、古くからポケモンを嗜んできた者たちによって、以下のような意見が多く寄せられた。

  • 最近のポケモンは、デザインが複雑になってきた。
  • 最近のポケモンは、シンプルさがない。
  • 最近のポケモンは、マスコットキャラっぽい。
  • 最近のポケモンは、ゆるキャラっぽい。
  • 最近のポケモンは、丸い
  • 最近のポケモンは、生物感がない。

各々で感じる方向性は違えども、デザインについて今と昔で変わったと感じる意見が非常に多かった。

先程紹介したポケモンたかさおじさんの記事では、これらの意見に対してポケモンのデザインについて、主に生物的な面から分析が成されていた。

私の方はこの件に関して、「最近のポケモンは複雑になった」 かどうかについて調査を行った。


ポケモンのデザインの複雑さを情報量として定量化する

左のポケモンは1996年初出のメタモン。
右のポケモンは2019年初出のムゲンダイナである。

なるほど!!!!たしかに最近のポケモンは複雑である。

・・・・・・・・。
これで話を終わらせても良いが、
ポケモンは現在、全890種類もいる。
更に、リージョンフォーム・メガシンカなど、姿の違う者をあわせると、私の集計だと1056種類にもなる。

全てのポケモンについて、デザインの複雑さを調べてみなければ、最近のポケモンほど複雑かどうかはわからないはずだ。

そもそも我々が感じるデザインにおける複雑さとは何だろうか?
私は、以下のような手法で全ポケモンの複雑さ≒情報量として定量化した。


ポケモンの情報量=「描き込み量」の数値化

アンパンマンのデザインにおける情報量は、北斗の拳のケンシロウに比べれば少ないのは明らかだ。
ここからは、情報量=「描き込み量」として、各ポケモンを数値化していく。

1.グレースケールへの変換

import cv2
import numpy as np

def read_cv2(filename,method):
    #windowsでは日本語ファイルを開くにはこうしなきゃいけない
    stream = open(filename, "rb")
    bytes = bytearray(stream.read())
    numpyarray = np.asarray(bytes, dtype=np.uint8)
    bgrImage = cv2.imdecode(numpyarray, method)
    return bgrImage

filename = "フシギダネ.png"
img_gray = read_cv2(filename,cv2.IMREAD_GRAYSCALE)

2.白部分を膨張させる

kernel = np.ones((4,4),np.uint8)
dilation = cv2.dilate(img_gray,kernel,iterations = 1)

3.グレースケールとの差分を取る

diff = cv2.subtract(dilation, img)
negaposi = 255 - diff

このような処理で、結果として輪郭や色の境が残る。

最後に、抽出された線部分の全ピクセル数を、画像内でポケモンに使われている全ピクセル数で割って規格化する

#主線部分が残った画像の黒い部分のピクセル数を合計する
black_area= np.where(np.array(img_negaposi).flatten().reshape(-1)<250,1,0).sum()

# アルファチャンネルのわかる画像ファイルを使用
# 公式のポケモン図鑑の画像にはアルファチャンネルが使用されている。
alpha_img = Image.open("フシギダネ_アルファ.png")

alpha_array = 255-np.array(alpha_img)[:,:,3]
used_area=np.where(alpha_array<255,1,0).sum()

#これがポケモンの情報量となる
poke_entropy = black_area/used_area

#フシギダネの部分のピクセル数:48114
#主線部分のピクセル数:23366
#フシギダネの情報量: 23366/48114 = 0.4856

この処理でフシギダネの情報量=0.4853となる


ポケモン世代ごとの情報量の集計

同様に、全ポケモンの情報量を計算し、情報量の多いポケモン。少ないポケモンごとに集めたのがこちらである。

  • 情報量の少ないポケモン

  • 情報量の多いポケモン

こうして眺めてみると、前述した方法で求めた情報量が直感的にも間違いではないのがわかる。

  • 情報量多いポケモン:複雑。描き込みが多い。細長い。ゴツい。伝説のポケモン。
  • 情報量少ないポケモン:シンプル。丸い。かわいい。未進化ポケモン。

と、情報量多い・少ない組でそれぞれ明らかに特徴が表れている。

今回使用する画像は全てポケモンずかん公式サイトから入手した。
ポケモンずかん(公式)
https://zukan.pokemon.co.jp/


やっぱり最近のポケモンはデザインが複雑だった!?

「フシギダネの情報量は0.4853」と書いても、この数字が多いのか少ないのか直感的に分かりにくいので、各情報量から平均値を引き、標準偏差で割ることで、標準化を行った。

以降は標準化後の情報量を、改めて情報量として扱う。
情報量が0に近いほど、全ポケモン中平均的な情報量
プラスの値が大きいほど情報量が多く、
マイナスの値が大きいほど情報量が少ない。
と考えていただきたい。

なお、先の画像の2者は、最も情報量の少ないポケモン・多いポケモンである。
情報量が多い方も少ない方もだいたいプラマイ0.6くらいになれば、全ポケモン中で両極端にいると思っていただきたい。

こうして求めた情報量に基づいて、各世代ごとに集計した。(メガシンカ・キョダイマックスは除外)

たしかに1世代に比べて後の世代は情報量が多くなっているようだ。
1世代の情報量中央値-0.025に対し、最新作の8世代では0.0235まで増加している。

世代 中央値 最小値 最大値 25% 75%
1 -0.025 -0.667 0.420 -0.140 0.094
2 -0.053 -0.476 0.412 -0.148 0.069
3 -0.017 -0.508 0.519 -0.159 0.141
4 0.033 -0.452 0.495 -0.096 0.147
5 -0.002 -0.517 0.402 -0.149 0.126
6 -0.007 -0.563 0.543 -0.145 0.123
7 0.013 -0.497 0.544 -0.112 0.148
8 0.024 -0.455 0.560 -0.141 0.164

5世代以降は中央値
-0.002,
-0.007,
0.013,
0.024と増加を続け、

6世代以降は最大値を
0.543,
0.544,
0.56と更新している。

つまり、古参ポケモンファンが物申す際の
「最近のポケモンはデザインが複雑になった」
と言うのは、根拠の無いものではないということらしい。

「ほら!!最近のポケモンは複雑じゃないか!!!
俺は知っていたぞ!!だから俺は最近のポケモンは好きじゃなかったんだ!」

と思う古参の方々の気持ちをどうすることもできない。


話は変わるが、1世代のゲームボーイと、最新作のNintendo Switchでハードの解像度による表現力の差は著しいものである。

解像度が変わっただけではなく、色もゲームボーイの白黒4段階ドット絵から
256×256×256色の3Dモデルとなり、ポケモンの息づく表現も可能になった。
  

このようにハード性能が開放されることによって、より複雑なデザイン・よりシンプルなデザインをも表現が可能になった。

一方で、この著しいハード能力の向上にしては、ポケモンデザインの情報量を、ある程度の範囲にコントロールしようと努めているのかもしれない。

また、これは増やす時は意識して情報量を増やしている形跡でもある。

4世代以降のポケモンで、デザインが極めて特集な群がある。以下の性質を持つデザインだ。これらの要素は、各ポケモン世代を代表する要素と言っても過言ではない。

  • 4世代:追加進化(ドサイドン・モジャンボなど)
  • 6世代:メガシンカ
  • 7世代:ウルトラビースト・カプ
  • 8世代:キョダイマックス

我々は新しいポケモンが発表される度に、言葉に形容し難い「こいつらは何かが違うぞ!?!?!?」と思わせるモノがある!そう感じていたが、その一つが、情報量だったのだろう。

キョダイマックスのみこの方法ではむしろ情報量が低い分類となってしまった。
キョダイマックスポケモンは以下のように大幅にパースがついている。手前の部位で面積が増えている分、今回の手法では情報量が大きくならない


各世代のポジション別の情報量変動

古くからポケモンを嗜んできた方々はお気づきだろうが、毎世代、新しく登場するポケモンには、ある程度お決まりが存在する。
序盤の草むらにはほぼ確実に鳥ポケモンや小動物ポケモンが登場,少し進めば森に虫ポケモンが現れる。
毎回ストーリー終盤には600族と言われる、バトルで強いポケモンが捕まえられるようになる。
更に言えば、ゲームスタート直後に草・炎・水タイプから一匹を選べる言わゆる”御三家”といわれるポケモンも恒例だ。

それらポジション毎での世代別情報量の変化を見れば、何かがわかるのではないかと思い、調査してみた。
皆もそれぞれ思い当たる節があるだろうが、4つに絞って紹介する。


序盤鳥ポケモン枠(未進化)

赤い線は全ポケモンの平均である。

日本人が転載してバズっていた海外のTweetでも取り上げられていたポッポ・ヤヤコマ・ツツケラが含まれている。

(翼を広げている画像か、畳んでいるかで情報量が変化してしまうので一概には言えないが)ポッポからヤヤコマまで情報量が減少しているため、このことから「最近のポケモンはマスコット化している」という印象を受けているのかもしれない。


ピカチュウ枠

皆は何と呼んでいるかは知らないが、私は「ピカチュウ枠」と呼ぶ。私のカウントでは、毎世代必ずこういったカワイイポケモンが存在するのだ。

特にパチリス以降のピカチュウ枠は、ポケモンアニメでサトシの同行者、もしくはライバルの手持ちポケモンとなっているのもあり、このポケモンのグッズを売らなければいけない!!! という何らかの力を感じる。

「最近のポケモンはマスコット化している」という文言のマスコットとは何なのか改めて考えるとよくわからないが、ピカチュウ枠はマスコット的なのだろう。皆かわいらしい見た目であり、情報量も平均値を下回っている。丸い形状のトゲデマルを除けば、世界一有名なポケモンであるピカチュウが最も情報量が低いく、徐々に情報量が増えているのがわかる。
ひょっとすると、「最近のポケモンは複雑」というのは、情報量が低いはずのピカチュウ枠ですら、最近は情報量が多い。 ということかもしれない。


幻ポケモン枠(配布ポケモン)

幻ポケモンといえば、ポケモン映画の顔となることもあり、ポケモンのゲーム自体やったこと無くても名前や姿を知っている人も出てくるだろう。
初代・金銀くらいまでをポケモンだと思っている方々にとっては、後の世代のポケモンはあまりにも情報過多に思えるかもしれない。


パッケージの伝説ポケモン枠


第二世代以降はストーリーに関わってくる伝説のポケモンがパッケージを飾っている。ポケモンを買わなくなった方々はパッケージを見て「最近のポケモンってこうなってるんだ・・・」と思うのだろう。
ホウホウの情報量は比較的多い。しかし、主に羽の描き込みによるところが大きい。主観的な感想だが、ホウオウは基本的にはタダの派手な鳥である。数値上の情報量ほどにはホウオウ複雑なポケモンには見えないのかもしれない。
一方、カイオーガ以降は体に特別な模様のようなものがあり、情報量を増やす要因となっている。
新作タイトルのパッケージを飾るようなポケモンは、その世代の顔であるのと同時に「これは新しいポケモンだ!!!」と思わせなくてはいけない。情報量が増えてでも、新しく、特別なデザインに挑戦したのだろう。


種族値の高いポケモンほどデザインが複雑!!!???

多くのポケモンガチ勢にとっては、バトルで強いポケモンこそ愛すべきポケモンであり、デザインは二の次・三の次であろう。
だが、強いポケモンとは、

  • 武器
  • トゲ
  • ウロコ
  • 子供

など、より強力な武器を、時には多く持つことで、様々なライバルと戦えるポケモンではないだろうか?

つまり、「種族値の合計が多い=情報量が多い」 が成立しうるのではないか?と考えた。

(異論はあるだろう。本当はタイプや覚える技。特性やバトルでのメタれ具合なども考慮したいが、それだけで一つの研究になってしまう)

まず、特に条件を設けず、伝説・幻・進化前・メガシンカなど、全て引っくるめて情報量と種族値合計の相関を見てみる。

相関係数0.443と、それなりの相関が見て取れる。
「情報量が多い=種族値合計が大きい」という傾向はあるようだ。


公式大会のガチバトルに出すポケモンに絞ったらどうか?

さきほどの散布図には進化前や伝説のポケモン・メガシンカポケモンまで含まれているが、では、公式大会のバトルに出す選択肢となりうるポケモンに絞ったらどうなるだろう。

先程の相関から
- 進化前ポケモン
- 伝説・幻ポケモン

を除外したポケモンでの、情報量と種族値合計の相関がこちら。(斜めの赤い線は、相関図にフィットさせた回帰線である)

バトルに出すポケモンに絞っても、やはり情報量と種族値合計は相関があるということらしい。

また、条件を絞ったことで、ある程度どんなポケモンが図のどこに位置するのかが認知しやすくなった。

例えば、左下のピンク色の部分方には、ピカチュウ枠に属するポケモンが集まっている。
右下の緑色の部分には、序盤に捕まえられる虫ポケモンが固まっている。


「進化でポケモンは可愛くなくなる」が数値化できるか?

生き物の赤ちゃんは、親に世話してもらえるように普遍的にカワイく見えるように生まれる」みたいな話を聞いたことがあると思う。

説明はすっ飛ばすが、生き物の赤ちゃんの共通した特徴として、以下のようなものがあるらしい。
これをベビースキーマという。
ベビースキーマによると、あらゆる動物の赤ちゃんに共通する特徴として、以下のようなものがあるらしい

  • 手足が短い
  • 頭が丸い
  • 頭が大きい
  • 顔が平坦

いかにも情報量を減らしそうな要因が揃っているではないか?

そこで、ポケモンが、情報量も進化しているのかを確かめて見る。(ポケモンでは、生物学的な意味での『変態』のことも『進化』と言う)
2段階進化ポケモンと、1段階進化ポケモンそれぞれで集計した結果がこちら。

やはり、一段階進化・二段階進化共に、「情報量が増える(≒カワイくなくなる)」という傾向が表れている!!!!

  • ベイビィポケモンから0進化目

  • メガシンカ

メガシンカによる情報量増は、分散が広すぎてよくわからないが、ポケモンにとって基本的に進化するということは情報量が増えるということらしい。

ポケモンは生き物の体をなしているが、ワザを使って戦うモンスターである。そのため、進化において、より強くなるために要素を追加していくのは戦闘を生業とする生命として理に叶っている。

ちなみに、情報量の変化が激しかったポケモンはこちら。


ポケモンはこちらの想像を超える進化を見せるものだなあ。と改めて実感した。


まとめ

  • 「最近のポケモンは複雑になった」とか言われがちである
  • ポケモンのデザインの複雑さを定量化するために、openCVを用いてデザインの境界線部分を取得し、情報量 を計算した。
  • 最近のポケモンほど、情報量が増す傾向はある。
  • 種族値の高いポケモンほど、情報量が高い傾向もあった。
  • 進化によってポケモンは情報量を増やす。

課題

今回の情報量の算出法には欠点が多い。

例えば、エルレイド→メガエルレイドのように、
メガシンカでマントが追加されたにもかかわらず、情報量が大幅に下がっている。これはマントの追加によって描き込み量よりも分母の面積の方が大きく増えてしまったためだ。

この方法はフラクタル次元による画像の複雑度を使用することによって解決することが出来る。

参考にさせていただいたコード
https://gist.github.com/viveksck/1110dfca01e4ec2c608515f0d5a5b1d1

def boxcount(Z, k):
    # 2値化したZについて、サイズkのボックス化
    S = np.add.reduceat(
        np.add.reduceat(Z, np.arange(0, Z.shape[0], k), axis=0),
                           np.arange(0, Z.shape[1], k), axis=1)
    return S

threshold=0.9
image_file = image_files[0]
img = Image.open(image_file)
Z = np.array(img)[:,:,0]/256.0

# しきい値によって2値化
Z = (Z < threshold)

# 短い方の幅を使用
p = min(Z.shape)

#2のべき乗で、画像の幅を超えない最大値
n = 2**np.floor(np.log(p)/np.log(2))
n = int(np.log(n)/np.log(2))

# 2のべき乗の配列(256,128,,,,4)
sizes = 2**np.arange(n,1,-1)

# ボックスの数をカウント。
box_list = []
for size in sizes:
    box = boxcount(Z,size)
    size=box.shape[0]
    plt.figure(figsize=(size/12,size/12))
    plt.imshow(255-box,cmap="gray")

    box_list.append(box)

# ボックス内の点の数をカウント
counts=[len(np.where((box > 0) & (box < size*size))[0]) for box,size in zip(box_list,sizes)]




plt.plot(np.log(sizes),np.log(counts),label="黒点の数",marker="o")
plt.plot(np.log(sizes),coeffs[1] + np.log(sizes)*coeffs[0],label="近似式",ls="--")
plt.title("両対数軸")
plt.xlabel("log(ボックスの大きさ)")
plt.ylabel("log(点の数)")
plt.legend()

ボックスの大きさ・ボックスの数を対数にして近似線を作成した際の、傾きがフラクタル次元となる。

#両対数軸について、回帰線を作成
coeffs = np.polyfit(np.log(sizes), np.log(counts), 1)
print("フシギダネのフラクタル次元:{}".format(-coeffs[0]))

# フシギダネのフラクタル次元:1.4960451082147515

この手法では、エルレイドはメガシンカによって情報量が増加するので、今回使用した手法に比べれば、この点では優れているかもしれない。

しかし、全体的に見れば、解釈が難しかったため、採用に至れなかった。
フラクタル次元の小さいポケモンは比較的、今回の手法と一致するのと、直感的にも正しそうなのだが、
フラクタル次元の多いポケモンでは解釈が難しかったため、採用を断念した。なぜ、アローラニャースが最もフラクタル次元が大きいのか?なぜヤバチャ(最下端のティーカップのようなポケモン)がフラクタル次元が大きいのか?直感的にわかりにくい。

フラクタル次元の小さいポケモンの例

フラクタル次元の多いポケモンの例

また、今回の手法ではイラストでのポーズが情報量に大きく影響してしまうのも不完全である。より正確に行うには、3Dモデルによる分析が必要不可欠だろう。

mrok273
python.ポケモンなど
ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
この記事は以下の記事からリンクされています
コメント

『4世代以降のポケモンで、デザインが極めて特集な群がある。』誤字を見つけたのでお知らせまで。特集→特殊?

非常に面白い試みだと思いました。
質問なのですがここでいう情報量とは線画の割合という風に認識して良いのでしょうか?
一般に情報量というと

H(X)=i=1npilog2pi

のことを指すと思うので記事内に明確に情報量の定義を記載していただけるととても読みやすいかと思います。

読んでいてとても面白かったです。
マンダが割と強カワイイ方面のトップ面しているのに吹きました。

公式ポケモンずかんのイラストを用いられているということで、イラストが描かれた時期が計算に関与していないか気になります
(カントー地方のポケモンとホウエン地方のポケモンが最も古く、次いでジョウト地方のポケモンとシンオウ地方のポケモンのイラストが古いはずです)

(編集済み)

とても楽しく読ませてもらいました。
少し疑問なのですが、線画だけ取り出したあと、線として扱うのを256階帳分の250以下としてバイナリ扱いしていますが、これはフシギダネでいうところの、うっすら見えている模様の線をふくんでいるのでしょうか。これは実質的には影すなわち3Dで考えたときの凹凸に当たるのだと思いますがこれを含むか含まないかは結果に影響がありそうな気がします。トゲデマルとか色の切り替わり部分に線無いですけど、柄として認識されてるのかなぁと気になりました。
「白部分を膨張させる」というのがどういう処理になっているのかいまいちわからないのでなんともいえないのですけどね...

またそれに伴い、面積に対する線の量は、模様より外周の長さが大きく影響しているように感じました。細長いフォルムだったり、イボイボしている部分が多いと情報量が高いとされているように見えます。逆に円形に近いと低い。強そうなパーツが情報量を高めてるというのは頷けますね。

サービス利用規約に基づき、このコメントは削除されました。

非常に面白い試みだと思います。
キャラクターの複雑さという定量化しにくそうなところを定量化する手法というのは、
よくある手法なのか、それとも新規性のある手法なのでしょうか。

フラクタル次元

理論的なことはわからないけど、この計算方法だと
「解像度を落としてもある程度原型を維持しているほどフラクタル次元が低いと判定される」→ハードの解像度によるデザインの違いが反映されやすい
となるような気がします。

描き込み量よりも分母の面積の方が大きく増えてしまった

この傾向を完全に解決できるわけではありませんが、面積の平方根を分母にした方がより感覚的な複雑さに近い数字が得られたりするかもしれませんね。

記事面白かったです。
ゲームキューブをお願いしたら、金銀バージョンをクリスマスプレゼントでサンタさんから貰ったこと思い出しました。
見事ポケモンにハマったのでサンタさんに感謝です。

お疲れさまでした。
感覚に頼って比較するのではなく、データで客観的に比較する試みは素晴らしいと思います。
第2弾を期待しています。

あなたもコメントしてみませんか :)
すでにアカウントを持っている方は
ユーザーは見つかりませんでした