国旗には何色がよく使われているのか? - Pythonで色相の頻度分布を調べてみる
概要
Wikipediaを見ると206カ国の国旗が掲載されていますが、国旗にはどのような色が使われる傾向にあるのでしょうか。
ぱっと見では原色系の派手な色が多いような…?
国旗の一覧 - Wikipedia
実際はどうなのか、画像処理によって調べてみました。
具体的には、
- Python + Beautiful Soupによるスクレイピングで国旗画像を取得
- Python + OpenCVによる画像処理で色相の頻度分布を計算
- Javascript + Canvasによって頻度分布を分かりやすく可視化
ということを行います。
目次:
方法・結果
基本的な方針
色相
知りたいのは「国旗には何色がよく使われているか」、つまり赤・黄・青・緑などのうちどのような色がよく使われているかということです。そこで、今回は国旗中の「色相」に注目することとします。
色相は、明るさや鮮やかさではなく「赤、黄、緑、青、紫といった色の様相の相違」を示す数値であり、下図のように数値と色味が対応しています。
色相 - Wikipedia
頻度の定義
「国旗には何色がよく使われているか」と書きましたが、例えば「赤色がよく使われている」という言葉には以下のように複数の解釈が考えられます。
- 多くの国旗で赤色が使われている(面積は無視、何カ国かに注目)
- それぞれの国旗に使われている赤色の面積の合計が大きい
ここでは後者、すなわち面積の合計によって各色の人気を定義することにします。
Pythonによるスクレイピング
まずは、以下の手順により国旗画像をダウンロードします。
- 国旗の一覧 - WikipediaのHTMLファイルをPythonとBeautiful Soup(スクレイピング用ライブラリ)によって解析し、各国旗の画像URLを調べる
- 取得したURLから画像をダウンロードする
ソースコードは記事末尾においてあります(以下同様)。
以下のように画像をダウンロードできました。
OpenCVによる画像処理
- ダウンロードした画像それぞれをOpenCVによって読み込み、NumPyのArrayとして扱えるようにします。
- そのArrayには各ピクセルにおけるRGBの値が入っているので、HSVに変換して各ピクセルにおける色相の値をとってきます。
- 色相は0から179の整数値をとっている(実際の色相は0から360だが、半分になっている)ので、0-179それぞれの色相をもつピクセルの個数を数え上げる(頻度分布)
- 頻度分布をJSONとしてファイルに出力する
OpenCVによって読み込んだすべての国旗をmatplotlibで表示すると以下のようになります。
また、頻度分布を同じくmatplotlibでプロットすると以下のようになります。横軸が色相÷2、縦軸がその色相を取るピクセルの個数ですが、まだわかりにくいので、以下ではこれを分かりやすく可視化してゆきます。
OpenCVをPythonで扱うには以下のURLが参考になります。
画像処理入門講座 : OpenCVとPythonで始める画像処理 | プログラミング | POSTD
Javascriptによる頻度の可視化
ここまでのPythonプログラムによって色相の頻度分布を記したファイルが生成されたことになります。
最後に、それをもとに「国旗には何色がよく使われているか」を分かりやすく可視化するグラフをJavascriptで描いてみます。
グラフ描画ライブラリの使い方を学ぶのが面倒なので、データをもとにCanvasで図形を描いてしまいました。詳細は後述のプログラムを参照してください。
グラフの見方は単純で、中心から大きく飛び出ている色ほど国旗によく使われていることを表しています。*1
考察
さきほどのグラフを再掲します。
いくつかのことに気が付きます。
- 赤色系が圧倒的に多い ・・・膨張色だから威勢が良い感じなのでしょうか?
- 原色系の色(赤・青・黄・緑)が多い
- 原色の間では、橙や黄緑・水色は若干あるものの、紫〜ピンク系が全然ない
ソースコード
Python(スクレイピング・OpenCV・ファイル出力)
Jupyter Notebookを以下に公開しています。
notebook_flag.ipynb · GitHub
また、普通のソースコードも貼り付けておきます(内容は同じ)↓
このPythonプログラムを実行すると国旗画像がダウンロードされるほか、以下のように始まるファイル(色相の頻度分布を記したもの)を出力します(hue.js)。
data={"0": 1.0, "1": 0.047014447435875774, "2": 0.033367172513780123, ...
HTML, Javascript(可視化)
おわりに
国旗には原色っぽい派手な色が多いと感じていたのですが、可視化することによってそれが正しかったことが明らかになりました。
地域や気候による違いを調べてみてもおもしろいかもしれません。
暇があったら色でなく形についての特徴も考えてみたいところです。
ちなみにWikipediaに載っている国旗のサイズはそれぞれ微妙に異なるので、厳密にはそれを揃えた上で色相の頻度分布を求める必要があります。
今回は定性的な結果が知りたいだけなので無視しました。
関連
IPythonデータサイエンスクックブック ―対話型コンピューティングと可視化のためのレシピ集
- 作者: Cyrille Rossant,菊池彰
- 出版社/メーカー: オライリージャパン
- 発売日: 2015/12/25
- メディア: 大型本
- この商品を含むブログ (1件) を見る
- 作者: Ryan Mitchell,嶋田健志,黒川利明
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/03/18
- メディア: 大型本
- この商品を含むブログ (2件) を見る