ほとんどすべてのデジタルカメラセンサーは、フォトセンサーのグリッドに編成されています。各写真センサーは原色:赤、緑、青のいずれかに敏感である。これらのフォトセンサーの構成方法は、発明者であるブライスバイヤー aにちなんでベイヤーフィルターと呼ばれています。 >イーストマンコダックの。画像が撮影された後、4つのフォトセンサーがその結果の画像の1ピクセルのRGB値を構成する。あなたの仕事は、そのプロセスを逆にして、結果のピクセルをフィルタの色に従って色付けすることです。簡単にするために、ガンマ補正は無視します。
例:「通常の」前方ベイヤーフィルターステップは次のとおりです。
- パントンビーワックスカラーの光線がセンサーに当たる;
- BGGR(青-緑/緑) -赤)フィルターはこれを4つの光線に分解します。
- 4つの光線がセンサーに当たり、次のようになります。81-168/ 168-235(センサー値の範囲は0から255)。
- ベイヤーフィルターはこれをカラー(235、168、81)の1つのRGBピクセルに変換します。
ベイヤーフィルターの逆の手順は次のとおりです。
- RGBピクセル色付き(235、168、81)は、RGB値を持つ4つのピクセルに分割されます:(0,0,81)-(0,168,0)/(0,168,0)-(235,0,0)。
課題
次のことを行う最短の関数またはプログラムを作成する必要があります。
- 入力と同じようにファイル名を取得し、DeBayeredイメージを出力します。 。
- 出力はファイルに書き込まれるか、画面に表示されます。
- T出力は、元の画像の幅の2倍、高さの2倍である必要があります。
-
入力画像の各ピクセルは、BGGR(青-緑/緑-赤)ベイヤーフィルターに従ってマッピングする必要があります。次の図でグラフィカルに説明されているパターン:
-
両方の緑色のフォトセンサーが同じ信号を受信すると仮定するため、ベイヤー行列の両方の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")
注意:これは code-golf なので、最短のコードが優先されます!
コメント
回答
Pyth、26バイト
[email protected],U2tU3"
stdinに引用符が付いた入力ファイル名を期待し、o.png
。出力例:
コメント
- あなたの答えはこれまでで最短です。私はそれを受け入れる傾向がありますが、プログラムがどのように機能するかについての説明を追加していただければ幸いです。
- 前の質問の回答を使用して、クロネッカー積を使用しました: codegolf.stackexchange.com/questions/78797/ … 。
回答
Matlab、 104 92バイト
これは、MatlabのRGB画像の3d配列/行列表現を利用します。また、クロネッカー積も、各ソースピクセルからこの新しい2x2「メタピクセル」を作成するために必要なものです。次に、出力がポップアップウィンドウに表示されます。
a=double(imread(input("")));for n=1:3;b(:,:,n)=kron(a(:,:,n),[1:2;2:3]==n)/255;end;imshow(b)
サイズ変更されたスクリーンキャプチャ:
コメント
- その
[1:2;2:3]==n
は賢いです!’削除できませんかb=[a,a;a,a];
? - @LuisMendoありがとうございます=)実際に機能しますが、’期待しないでください!
回答
Python 3、 259 254バイト
from PIL.Image import* o=open(input()) w,h=o.size n=new("RGB",(2*w,2*h)) P=Image.putpixel for b in range(w*h):x=b//h;y=b%h;r,g,b=o.getpixel((x,y));c=2*x;d=2*y;G=0,g,0;P(n,(c,d),(0,0,b));P(n,(c+1,d),G);P(n,(c,d+1),G);P(n,(c+1,d+1),(r,0,0)) n.save("o.png")
入力ファイル名は標準入力。 o.png
への出力。
使用例:
$ echo mona-lisa.jpg | python bayer.py
コメント
- PPCGへようこそ、最初の答えがいいです!
回答
Mathematica 118 127バイト
元の送信では、実際の画像を入力として使用していました。これは代わりにファイル名を使用します。
参照ファイルの画像データに2つの置換ルールを適用します。
- 画像データマトリックスの各行について、各ピクセルを置換します{ r、b、g}、青色のピクセル{0,0、b}、続いて緑色のピクセル{0、g、0};
- 個別に、画像データマトリックスの各行に対して、各ピクセル{r、b、g}を緑のピクセル{0、g、0}に置き換え、続いて赤のピクセル{r、0,0};
次にRiffle
(つまり、インターリーブ)1と2の結果の行列。
Image[Riffle[#/.{{_,g_,b_}:>(s=Sequence)[{0,0,b},{0,g,0}]}&/@(m=Import[#,"Data"]/255),#/.{{r_,g_,_}:>s[{0,g,0},{r,0,0}]}&/@m]]&
Image[Riffle[#/.{{_,g_,b_}:>(s=Sequence)[{0,0,b},{0,g,0}]}&/@(m=Import[#,"Data"]/255),#/.{{r_,g_,_}:>s[{0,g,0},{r,0,0}]}&/@m]]&["mona.jpg"]
コメント
- わかりませんが、これは’を満たしていないようです” ファイル名を次のように入力します入力では ”
- かつて、画像の代わりにファイル名を入力として使用するようになりました。
回答
J、 100 9 6 90バイト
load"bmp" "o"writebmp~,./,./($a)$2 1 1 0(_2]\(2^0 8 8 16)*{)"1(3#256)#:,a=:readbmp]stdin""
これは、stdinから入力画像のファイル名を読み取り、その結果を次の名前のファイルに出力するJのスクリプトです。 o
。入力と出力の画像はどちらもbmp
形式になる。また、ファイル名のみが入力されることを想定しています。つまり、先頭と末尾の空白は存在しないはずです。
使用例
$ echo -n mona.bmp | jconsole reversebayer.ijs
説明
A=:readbmp]stdin"" Store the image in A as a 2d array of 24-bit rgb ints , Flatten it into a list (3#256) #: Convert each 24-bit int to a tuple of 8-bit r/g/b ints 2 1 1 0 {"1 Select each column in BGGR order (2^0 8 8 16) * Shift each color to make it a 24-bit rgb value _2 ]\ Convert each row from dimensions 1x4 to 2x2 ($A) $ Reshape the list of 2x2 matrices into a matrix of 2x2 matrices with dimensions matching A ,./ Append the 2x2 matrices by column ,./ Append the 2x2 matrices by row - This is now a matrix of 24-bit rgb values with twice the dimensions of A "o"writebmp~ Write the image array to a bmp file named "o"
回答
Python 2、 256 275バイト
最初に元のコードを簡略化しました:
from PIL import Image from numpy import* import sys # Open image and put it in a numpy array srcArray = array(Image.open(sys.argv[1]), dtype=uint8) w, h, _ = srcArray.shape # Create target array, twice the size of the original image resArray = zeros((2*w, 2*h, 3), dtype=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("o.png")
次に、次のように縮小します。
from PIL import Image from numpy import* import sys a=array(Image.open(sys.argv[1]),dtype=uint8) w,h,_=a.shape b=zeros((2*w,2*h,3),dtype=uint8) b[::2,::2,2]=a[:,:,2] b[1::2,::2,1]=a[:,:,1] b[::2,1::2,1]=a[:,:,1] b[1::2,1::2,0]=a[:,:,0] Image.fromarray(b,"RGB").save("o.png")
結果は画像o.png
:
BG
が付いたセルが表示されます。行と下部にGR
があり、画像の例では上部にRG
、上部にGB
が表示されています。底部に。これは、2つの緑色のセルを対角線上に置くあらゆる配置が許容されることを意味するか? (他はGB / RGとGR / BGになります。)