この記事を作ろうと思った背景
今回は気分で記事を投稿してみます。目的としては個人的なメモです。以前、「C++でのOpenCV&GitHubによるソース管理」に慣れるために以下に簡単な画像処理プログラムを作成しました。
ここでは、それの簡単な概略をメモって行こうと思います。
https://github.com/mimuro-lab/EditImage/wiki
他人が使用するほど大層なものではないのですが、万が一ご自身の環境で実行ファイルを実行する際は自己責任でお願いします。上記のプログラムが甘く、大きいサイズの画像を入力すると不具合が起きます。(私自身に必要性が出てこない限り、修正する予定はありません)
はじめに
もちろん!ご存じの方は多いと思いますが、
「画像はデータ(数字)の集合」
で表現されていますよね?
今回はそんなあたりまえな事を確かめるだけの記事です(笑)
画像の中身を見てみよう!
詳細は「この記事を作ろうと思った背景」で説明したWikiに書いてあるのですが、image2csvを使用して、画像処理でおなじみのLenaさん見てみましょう!
この画像をRGB(レッド、グリーン、ブルー)の3色で成り立っているとして、画像を成り立たせている数値の集合を出してみると。。。このようなCSVファイルで表現されました!
※すべての表はここ
今回は「R:G:B」の形で出力されるようにプログラムを作成しました。見えている画像は、lenaさんのだいたい左上部分のCSVファイルです。これらの数値一組一組がそれぞれの画像一点の色を表現しています!
例えば、一番左上の点の色はR:226、G:135、B:121の色を混ぜ合わせた色になっています。(8bitの深さなので、0から255で表されています)
肌色とか茶色に近い色ですね。表から見るに、その色を表現するにはR:G:Bが、おおよそ2:1:1ぐらいの割合でこの色が成り立っているみたいですね!
これが「画像の中身」です!すごいですねぇ~。ほんとに数値の集合で成り立っています!
でも、中身を見るだけではつまらないので、この数値の集合(上記のCSVファイル)をいじってみて、「画像を編集」してみましょう!
RGBの平均値の画像をつくってみよう!
さっき作ったCSVファイルはRGBの3つのデータである一点の色を表していました!それでは、RとGとBを足し合わせて3で割ったものにしてしまいましょう!
editCsvを使ってみると、、、こんな感じのCSVが作成できますね!
※すべての表はここ
本当にあってるのか?と思いますが、さっき例に出した一番左上の値を見てみましょう。確か、R:226、G:135、B:121だったので
(226 + 135 + 121) / 3 = 160.666666...
となるはずですね!今回、画像にする以上小数点切り捨てさせていただくと(int型にキャスティング)、ちゃんと平均値が取れていることが分かると思います!
そして!このCSVから画像を生成してみると、、、
こんな画像が作れました!灰色になってますね。これは、色の表現が
R:G:B → Gray
と、3つの数字の組み合わせから1つの数字で表現しなければならなくなった為、黒と白の濃淡で表現しているのです!でも、lenaさんの画像という事はちゃんとわかりますね!
次に、閾値で分けて画像を編集してみましょう!
閾値で分けて画像を編集してみよう!
閾値ってなんだ?って思う人がいるかもしれないのですが、閾値っていうのは、要するに「区切る数値」の事です。さっき作った平均値のCSVの値に対して、
※表はここ
上の表に従って、20飛ばしずつ数字を区切っていきます。例えば、
9 → 0
18 → 20
27 → 20
33 → 20
39 → 40
のように、数字を割り当てていきます(9は0に近いので0、18は20に近いので20と、区切りに近い数字に合わせます)。そうして出来上がったCSVが以下の感じになります!(同じくeditCsvを使います)
※すべての表はここ
さっきの「一番左上の一点」の近くの数字はおおよそ160に近い値でした(157とか167とか)。なので、閾値で分けた後は160に割り振られていますね。
そして、これを画像にしてみると、、、
こーんな画像になります!これは、「近い色をある一つの色」に合わせたため、色の変化が単純になったのです。
おわりに
今回、OpenCVを使って「画像の数字」を覗いてみたり、ちょっと編集してみたりしました!今まで、頭では「画像は数字の集合」なんて分かっていましたが、実際に数字を見る機会はありませんでした。
画像っておもしろいですね!それでは!