roombaの日記

読書・非線形科学・プログラミング・アート・etc...

国旗には何色がよく使われているのか? - Pythonで色相の頻度分布を調べてみる

概要

Wikipediaを見ると206カ国の国旗が掲載されていますが、国旗にはどのような色が使われる傾向にあるのでしょうか。
ぱっと見では原色系の派手な色が多いような…?
国旗の一覧 - Wikipedia

実際はどうなのか、画像処理によって調べてみました。
具体的には、

ということを行います。

目次:

f:id:roomba:20160629134035p:plain

方法・結果

基本的な方針

色相

知りたいのは「国旗には何色がよく使われているか」、つまり赤・黄・青・緑などのうちどのような色がよく使われているかということです。そこで、今回は国旗中の「色相」に注目することとします。
色相は、明るさや鮮やかさではなく「赤、黄、緑、青、紫といった色の様相の相違」を示す数値であり、下図のように数値と色味が対応しています。
HueScale
色相 - Wikipedia

頻度の定義

「国旗には何色がよく使われているか」と書きましたが、例えば「赤色がよく使われている」という言葉には以下のように複数の解釈が考えられます。

  • 多くの国旗で赤色が使われている(面積は無視、何カ国かに注目)
  • それぞれの国旗に使われている赤色の面積の合計が大きい

ここでは後者、すなわち面積の合計によって各色の人気を定義することにします。

Pythonによるスクレイピング

まずは、以下の手順により国旗画像をダウンロードします。

  1. 国旗の一覧 - WikipediaのHTMLファイルをPythonとBeautiful Soup(スクレイピング用ライブラリ)によって解析し、各国旗の画像URLを調べる
  2. 取得したURLから画像をダウンロードする

ソースコードは記事末尾においてあります(以下同様)。
以下のように画像をダウンロードできました。
f:id:roomba:20160629143025p:plain

OpenCVによる画像処理

  1. ダウンロードした画像それぞれをOpenCVによって読み込み、NumPyのArrayとして扱えるようにします。
  2. そのArrayには各ピクセルにおけるRGBの値が入っているので、HSVに変換して各ピクセルにおける色相の値をとってきます。
  3. 色相は0から179の整数値をとっている(実際の色相は0から360だが、半分になっている)ので、0-179それぞれの色相をもつピクセルの個数を数え上げる(頻度分布)
  4. 頻度分布をJSONとしてファイルに出力する

OpenCVによって読み込んだすべての国旗をmatplotlibで表示すると以下のようになります。
f:id:roomba:20160629134035p:plain

また、頻度分布を同じくmatplotlibでプロットすると以下のようになります。横軸が色相÷2、縦軸がその色相を取るピクセルの個数ですが、まだわかりにくいので、以下ではこれを分かりやすく可視化してゆきます。
f:id:roomba:20160629143138p:plain

OpenCVPythonで扱うには以下のURLが参考になります。
画像処理入門講座 : OpenCVとPythonで始める画像処理 | プログラミング | POSTD

Javascriptによる頻度の可視化

ここまでのPythonプログラムによって色相の頻度分布を記したファイルが生成されたことになります。

最後に、それをもとに「国旗には何色がよく使われているか」を分かりやすく可視化するグラフをJavascriptで描いてみます。
グラフ描画ライブラリの使い方を学ぶのが面倒なので、データをもとにCanvasで図形を描いてしまいました。詳細は後述のプログラムを参照してください。
f:id:roomba:20160629160556p:plain
グラフの見方は単純で、中心から大きく飛び出ている色ほど国旗によく使われていることを表しています。*1

考察

さきほどのグラフを再掲します。
f:id:roomba:20160629160556p:plain
いくつかのことに気が付きます。

  • 色系が圧倒的に多い ・・・膨張色だから威勢が良い感じなのでしょうか?
  • 原色系の色()が多い
  • 原色の間では、橙や黄緑・水色は若干あるものの、紫〜ピンク系が全然ない

ソースコード

PythonスクレイピングOpenCV・ファイル出力)

Jupyter Notebookを以下に公開しています。
notebook_flag.ipynb · GitHub

また、普通のソースコードも貼り付けておきます(内容は同じ)↓

このPythonプログラムを実行すると国旗画像がダウンロードされるほか、以下のように始まるファイル(色相の頻度分布を記したもの)を出力します(hue.js)。

data={"0": 1.0, "1": 0.047014447435875774, "2": 0.033367172513780123, ...

HTML, Javascript(可視化)

おわりに

国旗には原色っぽい派手な色が多いと感じていたのですが、可視化することによってそれが正しかったことが明らかになりました。
地域や気候による違いを調べてみてもおもしろいかもしれません。

暇があったら色でなく形についての特徴も考えてみたいところです。

ちなみにWikipediaに載っている国旗のサイズはそれぞれ微妙に異なるので、厳密にはそれを揃えた上で色相の頻度分布を求める必要があります。
今回は定性的な結果が知りたいだけなので無視しました。

関連





PythonによるWebスクレイピング

PythonによるWebスクレイピング

*1:じつは赤の割合がとても大きいのですが、そのせいで他の色の分布が見づらくなるので、平方根をかけて若干ならしています。