2013年12月15日日曜日

漫画カメラの画像処理のしくみを勝手に推測する件。

【漫画カメラ】っていうのがありまして。
ちょっと前に、輪郭抽出+アルファという記事で、
『どーゆーロジックなんだろ?』
と書きまして、その後、推測してみたわけですが、
今回は、この検証です。

●元画像がこれです。

●最終的にモノクロ画像なので、まずこれをグレイスケールにします。
グレイスケールはですね、R,G,Bに係数をかけて足し合わせて求めます。
Gray = R * 0.3 + G * 0.59 + B * 0.11;
こんな感じです。アバウトな計算でよいときは、整数計算にします。
即ち、GRAY=((R * 19660 + G * 38666 + B * 7209) >> 16) & 0xff; です。
まぁこれだと、絶対に出現しない階調が出現しちゃいますけどねー。
で、結果がこれです。
この画像のなかで、黒っぽい部分と、そのグレイだけど黒っぽい部分を抽出します。
それが、以下です。
この例では、0x38以下を黒にして表示しています。
この例では、0x70以下を黒にして表示しています
次に、斜線の画像を用意します。
まぁ画像と同じ大きさにすればよいです。
それがこれ。
そしてこの画像を、さっきのグレイっぽい画像でマスクをします。
そうすると、こうなります。
次は、輪郭の抽出です。
これは、ソーベルフィルタってやつを使います。
もちろん、これで抽出した値をどう使うかが問題となりますが、
簡単に言えば、『閾値を設定して、黒か白かにしてしまう』
ということです。

実際に抽出してみたのが、これです。

ということで、全部出揃いました。
ここで、
(1)黒抽出画像
(2)グレイ抽出マスク斜線画像
(3)輪郭抽出画像。
この3つを合成したのが、これです。
もちろん、【漫画カメラ】とまったく同じにはなりませんが、
そこらへんは、前処理とか、ヒストグラムを平均化するとか、閾値のとりかたとか、いくつかのパラメータの違いだと思われます。

もちろん、実際のプログラムでは、わざわざ画像を作ってから処理するわけではなく、
メモリやCPUコストを小さく抑えるべく、ひとつのLOOPの中で全て処理します。

まぁ、あたりまえですが\( ̄(エ) ̄ )/\( ̄(エ) ̄ )/

0 件のコメント:

コメントを投稿