人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

はてなフォトライフの色別写真のように画像から特長のある色を抽出する方法を教えてください。
このような機能をPerlで実現させたいと思っています。よろしくお願いします。

●質問者: wekenny
●カテゴリ:コンピュータ 芸術・文化・歴史
✍キーワード:Perl はてなフォトライフ 抽出 画像
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● chaobun
●100ポイント ベストアンサー

Perlでの画像処理をしたことがないので実装方法まではわかりませんが、特長のある色の抽出方法ならば、いくつか思いつきます。

一番簡単だと思われるものは画像内の画素を白、黒、灰色と赤、青、緑…といった色クラスに振り分け、多数決をとって画像がどの色クラスに所属するか決める処理です。

画像の色を全てHSV(or HSI)表色系にいったん変換し、色相、彩度、輝度を得ます。

全体に占める割合の大きい色を得るのなら色相をn段階に分けて、そのヒストグラムが最大になるような色を選択すればよいでしょう。その際、白と黒に関しては色相が定義されないので彩度が閾値より低いものを上記のヒストグラムを得る処理からはずし、輝度によって白、黒、灰色にわけてカウントするのが直感的だと思います…ただし、カウントの仕方が別のカラーとは違うので多数決でこの彩度が低い三色と他の色を直接比較するのは出来ません。

あとは、こうやって投票された色のクラスのうち、上位2組を選べば特長ある2色が一応選べます。

アルゴリズムがややこしいので簡単にCでコードを書くと(すみません…perlは慣れていないので…)

#define HUE 0 // 色相を呼ぶインデックス (hsv[HUE]は色相値)
#define SAT 1 // hsv[SAT]は彩度
#define VAL 2 // hsv[VAL]は輝度
#define COLNUM 8 //彩度の十分高い色をCOLNUM色=8色に分ける
#define GRAYNUM 3 //グレイスケールをGRAYNUM色=3色に分ける
#define SATTHR 30 //色味があるかない(灰色)かを判断する閾値

int getSpecificColor(unsinged short *imageBuff[3], int imageWidth, int imageHeight, int* output[2]){
 int colorCls[COLNUM+GRAYNUM]; // 色クラスの数(ヒストグラム)をカウントするための入れ物
 int pxNum = imageWidth * imageHeight; //画像のピクセル数

 for(int i=0;i<pxNum;i++){
 double hsv[3] = convertRGB2HSV(imageBuff+i); //RGB値をHSVに変換する
 if(hsv[SAT]>SATTHR){ //彩度が閾値よりも高いものの処理
 colorCls[(int)(hsv[HUE]/COLNUM)]++;
 }
 else{ //彩度が低いものは灰色とみなして輝度で分類
 colorCls[COLNUM+(int)(hsv[SAT]/GRAYNUM)]++;
 }
 } //ヒストグラムの獲得完了
 selectSpecificColor(colorCls, output); //ヒストグラムから、なんらかの基準で2色を選んでoutputに色クラス番号を入れる
 return;
}

といった感じです、但し実装はしてないのでミスはあるかも…

この中でselectSpecificColorの作り方が一番みそになると思います。

単なる多数決だと直感にあわないでしょうし、第一、グレイスケールとカラーのカウントの仕方が違うので、それらは必ず別々に処理しなければなりません。

全体に占める割合がよっぽど高いときのみグレイスケールの色も採用して、それ以外の時は彩度の高い色クラスから選ぶのがいいと思います。

それで、一色が他の色に比べて圧倒的に多いときにだけoutput[0]と[1]の両方に同じ色を入れるとかすれば完璧かと…。


参考

HSV, RGBなどの表色系について

http://ja.wikipedia.org/wiki/%E8%89%B2%E7%A9%BA%E9%96%93

ヒストグラム(ここでは、いわゆる輝度分布のことのみを指し示す言葉ではないので注意)

http://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%A9%E3%83%95#.E6.9F....


perlって指定されているのに、申し訳ありません…

◎質問者からの返答

いやいやとんでもないです。詳しい回答ありがとうございました。

コードまで書いていただきすごいうれしいです。

HSV表色系っていうのがあるんですね?知りませんでした。

週末にいろいろ試してみます。ありがとうございました!

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ