イメージセンサーといえば、ほとんどがベイヤー配列の色フィルタが使用されています。
使用していないのはFoveon X3とX-Trans、あとライカ等のモノクロ専用センサーでしょうか。
機種別でもほとんどベイヤーですが、生産数流通数でいえば99%以上だと思います(スマホや監視カメラとかもあるし)。
そんなベイヤーに欠かせない色補間、そんなこと手作りでできるのか??という疑問と、アルゴリズム的な処理もなく超単純なやり方でどこまでそれっぽくなるの?とか、そんな疑問がよぎったのでやってみました。
Photoshop CCを使ってます。
元画像
秋頃撮った葉っぱ画像を200×200に縮小しました。
この画像にしたのは適当に目に止まった中でもRGBがしっかり含まれてるような画像だったからです。
フィルタ
普通の田んぼの田フィルタを作りました。1pxを鉛筆で4マス書いて倍々ゲームのコピペ。実に手作り。
拡大しておきます
RGB成分に分解
それぞれ1:2:1に分解されました。
なんかいい方法無いか考えたけど結局フィルタの色域選択→範囲反転削除→RGBそれぞれだけ表示という、これまた泥臭い方法で作りました。
そのまま合成
こうなります。G成分が多く緑寄りにはなってますが、けっこう味があって好きです。
こういうフィルタ効果も面白そう。
一応拡大しておきます
こんなですね。G多めのディスプレイを近くで見てるような気分です。ブラウン管とか。
RGB毎に色補間
いよいよ補間処理を行います。
どん
こんなんなりました。
さて今回行った超適当な補間はこうです。
G
- 上下左右に1pxずつずらした画像4枚を平均的に合成
- 元画像と合成
R,B
- 上下左右に1pxずつずらした画像4枚を平均的に合成
- 「右上」「右下」「左上」「左下」に1px+1pxずつずらした画像4枚を平均的に合成
- 元画像と上2枚を合成
で行いました。合計23枚になりました。相変わらず手作業です。
ただし”平均的に合成”というのが平均的にできている自信がありません。2枚なら簡単なんだけど4枚だとややこしい。ただしオンオフを切り替えて、それなりに全部の画像が反映されているのは確認しました。でもRとBが汚いなあ…
RGB画像を合成
こんなです。おお、単純に合成しただけとは全然違う!それっぽくなった!
元画像と並べてみます。
左:元画像 右:合成画像
拡大してみます。
こんな感じです。
コントラストの高い部分に偽色が目立ちます。ジャギジャギ感もあります。やっぱRとBのやり方が雑すぎたのかもしれません。元々情報量が1/4なので辛いところではありますが。
あと全体的にシャープネスは落ちてます。まあ元画像に対して1px膨らむようにぼかしをかけたようなものなので当然ですね。
対してボケ部分はなかなか良い感じです。ボケ、つまりグラデーション部分はほぼ再現できています。
結果
適当な色補間処理を試してみることで、よく言われる「ベイヤーフィルタだとこんな弊害が起きるよ」的な要素が極端に表現できました。適当でもそこそこ復元できました。補完処理前のデータ量で考えると1/3に圧縮した計算になります(1/3*1/4 + 1/3*1/2 + 1/3*1/4 = 3/12 = 1/3)。
…と、今思い付きましたが、ついでに解像度を1/3に落とした画像と比較してみます。
シャープネス感が近くなりました笑
しかしpng保存だと
元画像:78.4KB
補間画像:84.2KB
縮小画像:30.5KB
です。偽色で変にエッジが立って圧縮度が下がっているのでしょうか。まあ補間画像は補間前のファイルを更に不要部分を消した状態で保存していればファイルサイズは圧縮されるでしょう。リアルタイムに表示時に変換的な。
さいごに
今回のテストはベイヤーが悪いとか云々ではなくて、あくまで単純に実験をしてみたかっただけです。
実際は2ピクセル間の中間を機械的に作るだけでは絶対ダメなのは容易に想像がつきます。その周辺からの情報や、他色との関係性などを見て適切に重み付けしないといけないんだろうと思います。それによって今回起きたような「いかにも」な現象は多分ほとんど起こらなくなってるんだろうなあと想像します。
しかし当然アルゴリズム的な処理は「そうなるであろう」の推理力を高めて99%、99.9%近づけるという手法なので、例外的に生まれる1%,0.1%を補間するのはとても大変です。そこはFoveonやX-Transなどで簡単に解決できる部分だったりしますが、それらは他の弱点があり、また開発人口の少なさから、別の部分の弱点補間のため80%,90%と努力しているんじゃないかなあと思います(X-TransはFoveonほどベイヤーとかけ離れているものではないですが)。
これはレシプロエンジン対ロータリーエンジンにホントそっくりだなあと思います。
今度はX-Trans配列での雑補間と比較もしてみたいなあ。
これももちろん良し悪しではなく、「単純に処理しただけではどれだけ違いが出るのか」を見たいだけです。
この良し悪しでは真面目に処理した時の限界値は測れません。
おしまい
日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)