画像の逆ベイヤーフィルター


9

ほとんどすべてのデジタルカメラセンサーは、フォトセンサーのグリッドに編成されています。各フォトセンサーは、赤、緑、青のいずれかの原色に敏感です。これらのフォトセンサーの構成は、発明者であるイーストマンコダックのブライスバイエルにちなんで、バイエルフィルターと呼ばれています。画像が撮影された後、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(青-緑/緑-赤)ベイヤーフィルターパターンに従ってマッピングする必要があります。

    バイエルフィルター-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")

覚えておいてください:これはので、最短のコードが勝ちます!


5
私がスクロールしたときにほぼ発作を起こした
Fatalize

1
@Fatalize申し訳ありません!;-)奇妙な効果ですね。
agtoever

手順でBGは、上の行とGR下にセルが表示されていますが、サンプル画像は上と下に表示RGGBれています。これは、2つの緑色のセルを対角線上に配置する配置が受け入れられることを意味しますか?(その他はGB / RGとGR / BGです。)
Level River St

@LevelRiverSt私の意図はBGGRを遵守することでした(4番目のチャレンジの箇条書きで指定)。実際のサンプル画像がRGGBにある場合の間違い。私は自分のラップトップにいるとすぐにそれを修正します。
agtoever

私は1つのために、それは奇妙な青の色合いを持っている、あなたの例の画像が正しいとは思わない
orlp

回答:


6

Pyth、26バイト

MXm03H@GH.wsMsgLRRR,U2tU3'

stdinに引用符を含む入力ファイル名を想定し、に書き込みますo.png。出力例:


あなたの答えはこれまでのところ最短です。私はそれを受け入れる傾向がありますが、あなたのプログラムがどのように機能するかについての説明を追加できればいいのですが。
agtoever

前の質問の答えを使用して、クロネッカー製品を使用しました:codegolf.stackexchange.com/questions/78797/…
orlp

6

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];か?
Luis Mendo 2016

@LuisMendoありがとう=)それは確かに機能します、私はそれを期待していませんでした!
2016

5

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

逆Bayerフィルターが適用されたMona Lisa


2
PPCGへようこそ。最初の回答がいいですね。
Leaky Nun

4

Mathematicaの118 127のバイト

最初の提出では、実際の写真を入力として使用しました。代わりにファイル名を使用します。

参照ファイルの画像データに2つの置換ルールを適用します。

  1. 画像データマトリックスの各行について、各ピクセル{r、b、g}を青のピクセル{0,0、b}に置き換え、その後に緑のピクセル{0、g、0}を続けます。
  2. 個別に、画像データマトリックスの各行について、各ピクセル{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"]

逆バイヤー


確かではありませんが、これは「入力のようにファイル名を
取得

agtoever、画像ではなくファイル名を入力として使用するようになりました。
DavidC 2016

3

J、100 96 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'

0

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

処理後のo.png画像

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.