ほとんどすべてのデジタルカメラセンサーは、フォトセンサーのグリッドに編成されています。各フォトセンサーは、赤、緑、青のいずれかの原色に敏感です。これらのフォトセンサーの構成は、発明者であるイーストマンコダックのブライスバイエルにちなんで、バイエルフィルターと呼ばれています。画像が撮影された後、4つのフォトセンサーが1つのピクセルのRGB値を結果の画像に構成します。あなたの仕事は、そのプロセスを逆にして、結果のピクセルをそれらのフィルターの色に従って色付けすることです。簡単にするために、ガンマ補正は無視します。
次に例を示します。「通常の」前向きベイヤフィルタの手順は次のとおりです。
- Pantone Beeswaxカラーの光線がセンサーに当たります。
- BGGR(青-緑/緑-赤)フィルターは、これを4つの光線に分解します。
- 4つの光線がセンサーに当たると、次のようになります。81-168/168-235(センサー値の範囲は0-255)。
- ベイヤーフィルターは、これを色付きの1つのRGBピクセル(235、168、81)に変換します。
逆Bayerフィルターの手順は次のとおりです。
- 色(235、168、81)のRGBピクセルは、RGB値(0,0,81)-(0,168,0)/(0,168,0)-(235,0,0)の4つのピクセルに分割されます。
チャレンジ
以下を実行する可能な限り短い関数またはプログラムを作成する必要があります。
- 入力と同じようにファイル名を取り、DeBayered画像を出力します。
- 出力はファイルに書き込まれるか、画面に表示されます。
- 出力は、元の画像の2倍の幅と2倍の高さでなければなりません。
入力画像の各ピクセルは、次の図でグラフィカルに説明されているように、BGGR(青-緑/緑-赤)ベイヤーフィルターパターンに従ってマッピングする必要があります。
両方の緑のフォトセンサーが同じ信号を受信すると仮定します。そのため、Bayer行列のG値は両方とも、RGB画像のG値に等しくなります。
- 結果の画像の配列表現を返すことはできません。出力は、イメージとして表示できるイメージまたはファイル(適切なイメージ形式のファイル)でなければなりません。
例
このファイルを入力として与えます:
結果の画像は次のようになります。
リファレンスPython実装:
from PIL import Image
import numpy
import sys
if len(sys.argv) == 1:
print "Usage: python DeByer.py <<image_filename>>"
sys.exit()
# Open image and put it in a numpy array
srcArray = numpy.array(Image.open(sys.argv[1]), dtype=numpy.uint8)
w, h, _ = srcArray.shape
# Create target array, twice the size of the original image
resArray = numpy.zeros((2*w, 2*h, 3), dtype=numpy.uint8)
# Map the RGB values in the original picture according to the BGGR pattern#
# Blue
resArray[::2, ::2, 2] = srcArray[:, :, 2]
# Green (top row of the Bayer matrix)
resArray[1::2, ::2, 1] = srcArray[:, :, 1]
# Green (bottom row of the Bayer matrix)
resArray[::2, 1::2, 1] = srcArray[:, :, 1]
# Red
resArray[1::2, 1::2, 0] = srcArray[:, :, 0]
# Save the imgage
Image.fromarray(resArray, "RGB").save("output.png")
覚えておいてください:これはコードゴルフなので、最短のコードが勝ちます!
BG
は、上の行とGR
下にセルが表示されていますが、サンプル画像は上と下に表示RG
さGB
れています。これは、2つの緑色のセルを対角線上に配置する配置が受け入れられることを意味しますか?(その他はGB / RGとGR / BGです。)