*この記事について [#f8b18a9c]
-この記事は[[Computer Vision Advent Calendar 2013>http://partake.in/events/955b47cc-82d5-4305-ad1a-ef1c2d168b79]]の1日目(?)の担当記事です。
*「Bayer さんに敬意を表して」 [#lb8b0ebd]
-現在販売されているCCDカメラのうち、多くはBayerパターンというものを使っています。
-高い業務用のカメラは3CCDと、RGBそれぞれにCCDセンサを持っているのですが、それだと値段が全然違います。
-そこで考案されたのが、Bayerパターンです。
-この方法だと、各ピクセルごとに、RGBのそれぞれの色が割り当てられます。格子状に並んでるので、緑を2回使って、格子状に並べます。
|BGCOLOR(red):|BGCOLOR(green):|BGCOLOR(red):|BGCOLOR(green):|BGCOLOR(red):|BGCOLOR(green):|
|BGCOLOR(green):|BGCOLOR(blue):|BGCOLOR(green):|BGCOLOR(blue):|BGCOLOR(green):|BGCOLOR(blue):|
|BGCOLOR(red):|BGCOLOR(green):|BGCOLOR(red):|BGCOLOR(green):|BGCOLOR(red):|BGCOLOR(green):|
|BGCOLOR(green):|BGCOLOR(blue):|BGCOLOR(green):|BGCOLOR(blue):|BGCOLOR(green):|BGCOLOR(blue):|
|BGCOLOR(red):|BGCOLOR(green):|BGCOLOR(red):|BGCOLOR(green):|BGCOLOR(red):|BGCOLOR(green):|
|BGCOLOR(green):|BGCOLOR(blue):|BGCOLOR(green):|BGCOLOR(blue):|BGCOLOR(green):|BGCOLOR(blue):|
-こんな具合に並べます。
-この状態の画像をBayer画像、もしくはRAWフォーマットと呼びます。
-RAW(=生)と呼ばれるのは、センサに一番近い状態の生の情報だからでしょう。(未調査)
*Bayerからカラー画像へ [#s84eb50e]
-このBayer画像、見てみるとこんな感じです。
#ref(bayer.png)
-拡大してみるとこんな感じです
#ref(BayerEnlarge.png)
-言葉で表すと「ポツポツと斑点がある感じのグレースケール画像」です。
-そう。CCD1枚で得られた光の強度を記録した画像なので、グレースケール画像です。
-OpenCV風に言うと、CV_8UC1です((ちなみに、真面目な話をすると、RAWフォーマットでは、10bitや12bitなど、もう少し高階調のフォーマットだったりするので、8U=8bitでは収まらなかったりします))
-しかも、技術者や開発者ならともかく、Bayerの画像をもらって喜ぶユーザはまずいません。なので、これをRGBに変換する必要があります。
-OpenCVで言えば、cv::cvtColor という関数があります。これの引数の中に、ちゃんと宣言されています。(宣言はimgproc.hpp内)
#geshi(c++,number){{
// Demosaicing
COLOR_BayerBG2BGR = 46,
COLOR_BayerGB2BGR = 47,
COLOR_BayerRG2BGR = 48,
COLOR_BayerGR2BGR = 49,
COLOR_BayerBG2RGB = COLOR_BayerRG2BGR,
COLOR_BayerGB2RGB = COLOR_BayerGR2BGR,
COLOR_BayerRG2RGB = COLOR_BayerBG2BGR,
COLOR_BayerGR2RGB = COLOR_BayerGB2BGR,
COLOR_BayerBG2GRAY = 86,
COLOR_BayerGB2GRAY = 87,
COLOR_BayerRG2GRAY = 88,
COLOR_BayerGR2GRAY = 89,
// Demosaicing using Variable Number of Gradients
COLOR_BayerBG2BGR_VNG = 62,
COLOR_BayerGB2BGR_VNG = 63,
COLOR_BayerRG2BGR_VNG = 64,
COLOR_BayerGR2BGR_VNG = 65,
COLOR_BayerBG2RGB_VNG = COLOR_BayerRG2BGR_VNG,
COLOR_BayerGB2RGB_VNG = COLOR_BayerGR2BGR_VNG,
COLOR_BayerRG2RGB_VNG = COLOR_BayerBG2BGR_VNG,
COLOR_BayerGR2RGB_VNG = COLOR_BayerGB2BGR_VNG,
// Edge-Aware Demosaicing
COLOR_BayerBG2BGR_EA = 135,
COLOR_BayerGB2BGR_EA = 136,
COLOR_BayerRG2BGR_EA = 137,
COLOR_BayerGR2BGR_EA = 138,
COLOR_BayerBG2RGB_EA = COLOR_BayerRG2BGR_EA,
COLOR_BayerGB2RGB_EA = COLOR_BayerGR2BGR_EA,
COLOR_BayerRG2RGB_EA = COLOR_BayerBG2BGR_EA,
COLOR_BayerGR2RGB_EA = COLOR_BayerGB2BGR_EA,
}}
-こいつらを使うことで、BayerパターンをRGBの3レイヤ画像、CV_8UC3に変換してくれます
-この変換の方法はそれこそ色々あるのですが、一番簡単な方法は、近傍の画素から補完する方法です。
<画像TBW>
-これでそこそこの性能が出ますし、画質に特化したのでなければこれでとりあえずRGB画像に復元できます。
-当然エッジ近辺でモザイク状にノイズが出ますが、最近はセンサの目も細かくなったので、結構気にならないレベルで復元してくれたりします。
-ちなみにOpenCVの実装では、Edge AwareなBayer補完が実装されています。(詳細は知らん)
*RGBからBayerへの逆変換 [#c6af2e8e]
-OpenCVの色変換は、大体可逆変換です。
#geshi(C++,number){{
COLOR_BGR2HSV = 40,
COLOR_HSV2BGR = 54,
}}
-こんな感じに、BGR2***←→***2BGRと大体対になって定義されています。
-しかし、Bayerだけは逆変換が実装されていません。
-まぁ、上記の理由を考えれば、大体分かりますよね。
-ただ、Bayer画像は、元のBayerパターンがわかれば、大体Bayer画像に復元できます。
-ちなみに、Bayerパターンは、以下の 4種類あります。
-Bayer(RG)
|BGCOLOR(red):|BGCOLOR(green):|BGCOLOR(red):|BGCOLOR(green):|BGCOLOR(red):|BGCOLOR(green):|
|BGCOLOR(green):|BGCOLOR(blue):|BGCOLOR(green):|BGCOLOR(blue):|BGCOLOR(green):|BGCOLOR(blue):|
|BGCOLOR(red):|BGCOLOR(green):|BGCOLOR(red):|BGCOLOR(green):|BGCOLOR(red):|BGCOLOR(green):|
|BGCOLOR(green):|BGCOLOR(blue):|BGCOLOR(green):|BGCOLOR(blue):|BGCOLOR(green):|BGCOLOR(blue):|
|BGCOLOR(red):|BGCOLOR(green):|BGCOLOR(red):|BGCOLOR(green):|BGCOLOR(red):|BGCOLOR(green):|
|BGCOLOR(green):|BGCOLOR(blue):|BGCOLOR(green):|BGCOLOR(blue):|BGCOLOR(green):|BGCOLOR(blue):|
-Bayer(GB)
|BGCOLOR(green):|BGCOLOR(blue):|BGCOLOR(green):|BGCOLOR(blue):|BGCOLOR(green):|BGCOLOR(blue):|
|BGCOLOR(red):|BGCOLOR(green):|BGCOLOR(red):|BGCOLOR(green):|BGCOLOR(red):|BGCOLOR(green):|
|BGCOLOR(green):|BGCOLOR(blue):|BGCOLOR(green):|BGCOLOR(blue):|BGCOLOR(green):|BGCOLOR(blue):|
|BGCOLOR(red):|BGCOLOR(green):|BGCOLOR(red):|BGCOLOR(green):|BGCOLOR(red):|BGCOLOR(green):|
|BGCOLOR(green):|BGCOLOR(blue):|BGCOLOR(green):|BGCOLOR(blue):|BGCOLOR(green):|BGCOLOR(blue):|
|BGCOLOR(red):|BGCOLOR(green):|BGCOLOR(red):|BGCOLOR(green):|BGCOLOR(red):|BGCOLOR(green):|
-Bayer(GR)
|BGCOLOR(green):|BGCOLOR(red):|BGCOLOR(green):|BGCOLOR(red):|BGCOLOR(green):|BGCOLOR(red):|
|BGCOLOR(blue):|BGCOLOR(green):|BGCOLOR(blue):|BGCOLOR(green):|BGCOLOR(blue):|BGCOLOR(green):|
|BGCOLOR(green):|BGCOLOR(red):|BGCOLOR(green):|BGCOLOR(red):|BGCOLOR(green):|BGCOLOR(red):|
|BGCOLOR(blue):|BGCOLOR(green):|BGCOLOR(blue):|BGCOLOR(green):|BGCOLOR(blue):|BGCOLOR(green):|
|BGCOLOR(green):|BGCOLOR(red):|BGCOLOR(green):|BGCOLOR(red):|BGCOLOR(green):|BGCOLOR(red):|
|BGCOLOR(blue):|BGCOLOR(green):|BGCOLOR(blue):|BGCOLOR(green):|BGCOLOR(blue):|BGCOLOR(green):|
-Bayer(BG)
|BGCOLOR(blue):|BGCOLOR(green):|BGCOLOR(blue):|BGCOLOR(green):|BGCOLOR(blue):|BGCOLOR(green):|
|BGCOLOR(green):|BGCOLOR(red):|BGCOLOR(green):|BGCOLOR(red):|BGCOLOR(green):|BGCOLOR(red):|
|BGCOLOR(blue):|BGCOLOR(green):|BGCOLOR(blue):|BGCOLOR(green):|BGCOLOR(blue):|BGCOLOR(green):|
|BGCOLOR(green):|BGCOLOR(red):|BGCOLOR(green):|BGCOLOR(red):|BGCOLOR(green):|BGCOLOR(red):|
|BGCOLOR(blue):|BGCOLOR(green):|BGCOLOR(blue):|BGCOLOR(green):|BGCOLOR(blue):|BGCOLOR(green):|
|BGCOLOR(green):|BGCOLOR(red):|BGCOLOR(green):|BGCOLOR(red):|BGCOLOR(green):|BGCOLOR(red):|
-例えば、赤の画素。Bayer(RG)の一番左上の画素は、赤の画素ですが、この座標のR成分は、そのままBayer画像の値を代入していたりします。
-同様に、GとBの画素に関しても同じことを繰り返すだけで戻せます。
-なので、適切なBayerパターンを選んで上げれば、それだけでBayerパターンに戻せます。
-実は最初に掲載した画像は、lenaを無理やりBayerパターンに変換したものです。
-lenaのBayer画像がもし現存してたら、かなりレアだったんでしょうが、よく考えたら当時はまだアナログだったかな?
*Bayerさんに敬意を表して [#p15116d5]
-さて、このBayerパターンは実はBayerさんが考案されて、そこから名前を取ってます。
-Bryce E. Bayerさん、1929年8月15日-2012年11月13日。そう。実は昨年の暮れに亡くなられたのです。
-ご冥福をお祈りすると同時に、Bayerパターンについて何か書かなきゃ!と思って、この記事を書いています。
-あと、CVAdventCalendarの先陣を切らなきゃ!と思ってこの記事を書いています。
-そのBayerパターンに関して知ったことがあったので、書いてみました。
*最後に [#a76188ad]
-12月1日が動きがなかったのは、ちょっと残念でしたが、Computer Vision Advenct Calendar 2013はここから頑張っていきましょう!
[[Computer Vision Advent Calendar 2012]]