이미지의 역 바이어 필터


9

거의 모든 디지털 카메라 센서는 광 센서 그리드로 구성됩니다. 각 포토 센서는 기본 색상 중 하나 ( 빨강, 녹색 및 파랑) 중 하나에 민감합니다 . 이러한 포토 센서의 구성 방식을 발명가 인 Eastman Kodak의 Bryce Bayer 에 이어 Bayer 필터 라고합니다 . 이미지를 촬영 한 후 4 개의 포토 센서가 결과 이미지에서 1 픽셀의 RGB 값을 구성합니다. 귀하의 작업은 해당 프로세스를 취소하고 결과 색상을 필터 색상에 따라 색상을 지정하는 것입니다. 간단하게하기 위해 감마 보정 을 무시 합니다.

예를 들어 : "정상"순방향 바이어 필터 단계는 다음과 같습니다.

  • 팬톤 밀랍 색 의 광선 이 센서에 부딪 칩니다 .
  • BGGR (청색-녹색 / 녹색-적색) 필터는이를 4 개의 광선으로 분해합니다.
  • 4 개의 광선이 센서에 닿으면 다음과 같이 읽습니다. 81-168 / 168-235 (센서 값 범위는 0-255)
  • Bayer 필터는 이것을 컬러 (235, 168, 81)의 RGB 픽셀 하나로 변환합니다.

역 바이엘 필터 단계는 다음과 같습니다.

  • 색상이있는 RGB 픽셀 (235, 168, 81)은 RGB 값을 가진 4 개의 픽셀로 분할됩니다 : (0,0,81)-(0,168,0) / (0,168,0)-(235,0,0).

도전

다음을 수행하는 가장 짧은 기능 또는 프로그램을 작성해야합니다.

  • 입력에서와 같이 파일 이름을 사용하여 DeBayered 이미지를 출력하십시오.
  • 출력은 파일에 기록되거나 화면에 표시 될 수 있습니다.
  • 출력은 원본 이미지의 너비와 높이의 두 배 여야합니다.
  • 입력 이미지의 각 픽셀은 다음 그림에서 그래픽으로 설명 된대로 BGGR (파랑-녹색 / 녹색-빨강) 바이어 필터 패턴에 따라 매핑되어야합니다.

    바이엘 필터-BGGR-그래픽 설명

  • 우리는 두 개의 녹색 포토 센서가 동일한 신호를 수신한다고 가정하므로 Bayer 매트릭스의 G 값은 RGB 이미지의 G 값과 같습니다.

  • 결과 이미지의 배열 표현을 반환 할 수 없습니다 . 출력은 이미지 또는 이미지 로 표시 될 수 있는 파일 ( 적절한 이미지 형식 )이어야합니다.

이 파일을 입력으로 지정하십시오.

모나리자

결과 이미지는 다음과 같아야합니다.

드바 예르 모나리자

참조 파이썬 구현 :

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
내가 스크롤했을 때 거의 발작을
일으켰다

1
@Fatalize 미안합니다! ;-) 이상한 효과, 그렇지 않습니까?
agtoever

지시 사항 BG은 맨 위와 맨 GR아래 에 셀이 표시되는 반면 예제 이미지는 RG맨 위와 GB맨 아래에 표시됩니다. 그것은 두 개의 녹색 셀을 대각선에 놓는 배열이 허용되는 것을 의미합니까? (다른 것들은 GB / RG와 GR / BG입니다.)
Level River St

@LevelRiverSt 내 의도는 BGGR을 준수하는 것이 었습니다 (네 번째 챌린지 글 머리표에 명시 됨). 실제 예제 이미지가 RGGB 인 경우 실수입니다. 랩톱에있는 즉시 수정하겠습니다.
agtoever

나는 당신의 예제 이미지가 맞지 않다고 생각합니다. 하나는 이상한 푸른 색조를 가지고 있습니다
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 "메타 픽셀"을 만드는 데 필요한 Kronecker 제품 을 사용합니다. 그러면 출력이 팝업 창에 표시됩니다.

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

@LuisMendo Thanks =) 그것은 실제로 작동하지만, 나는 그것을 기대하지 않았습니다!
flawr

5

파이썬 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

리버스 바이어 필터가 적용된 모나리자


2
PPCG에 오신 것을 환영합니다. 좋은 첫 답변입니다!
Leaky Nun

4

매쓰 118 127 바이트

원래 제출물은 실제 그림을 입력으로 사용했습니다. 대신 파일 이름을 사용합니다.

참조 된 파일의 이미지 데이터에 두 가지 대체 규칙을 적용합니다.

  1. 이미지 데이터 행렬의 각 행에 대해 각 픽셀 {r, b, g}를 파란색 픽셀 {0,0, b}로 바꾸고 녹색 픽셀 {0, g, 0}로 바꾸십시오.
  2. 별도로, 이미지 데이터 매트릭스의 각 행에 대해, 각각의 픽셀 {r, b, g}을 녹색 픽셀 {0, g, 0}으로 대체하고이어서 적색 픽셀 {r, 0,0}을 대체하고;

그런 다음 Riffle1과 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

agtoever, 이제 이미지 대신 파일 이름을 입력으로 사용합니다.
DavidC

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

파이썬 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.