이미지의 역 바이어 필터

거의 모든 디지털 카메라 센서는 포토 센서 그리드로 구성됩니다. 각 포토 센서는 기본 색상 중 하나 인 빨간색, 녹색 및 파란색에 민감합니다. 이러한 포토 센서가 구성되는 방식을 발명자 인 Bryce Bayer a의 이름을 따서 Bayer 필터 라고합니다. > Eastman Kodak. 이미지를 찍은 후 4 개의 포토 센서가 결과 이미지에서 1 픽셀의 RGB 값을 구성합니다. 당신의 임무는 그 과정을 되돌리고 필터 색상에 따라 결과 픽셀을 채색하는 것입니다. 단순화를 위해 감마 보정 을 무시합니다.

예 : “일반”포워드 Bayer 필터 단계는 다음과 같습니다.

  • Pantone Beeswax 색상 의 광선이 센서에 닿습니다.
  • BGGR (파란색-녹색 / 녹색 -빨간색) 필터는 이것을 4 개의 광선으로 분해합니다.
  • 4 개의 광선이 센서에 도달하여 다음과 같이 표시됩니다. 81-168/168-235 (센서 값 범위는 0-255);
  • Bayer 필터는 이것을 컬러 (235, 168, 81)의 RGB 픽셀 1 개로 변환합니다.

역 Bayer 필터 단계는 다음과 같습니다.

  • RGB 픽셀 색상 (235, 168, 81)은 RGB 값 ((0,0,81)-(0,168,0) / (0,168,0)-(235,0,0))을 사용하여 4 개의 픽셀로 분할됩니다.

도전

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

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

    Bayer 필터-BGGR-그래픽 설명

  • 두 녹색 광 센서가 동일한 신호를 수신하므로 Bayer 매트릭스의 두 G 값이 RGB 이미지의 G 값과 같다고 가정합니다.

  • p>

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

이 파일을 입력으로 제공 :

Mona Lisa

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

DeBayered Mona Lisa

참조 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") 

참고 : 이것은 , 그래서 가장 짧은 코드가 이깁니다!

댓글

  • 스크롤 할 때 거의 발작이 생겼습니다.
  • @Fatalize 죄송합니다! 😉 이상한 효과, 그렇지 않나요? ‘
  • 안내에는 상단에 BG가있는 셀이 표시됩니다. 행과 하단에 GR가있는 반면, 예제 이미지는 상단에 RG, GB에 표시됩니다. 바닥에. 두 개의 녹색 셀을 대각선으로 배치하는 배열이 허용된다는 의미입니까? (다른 것은 GB / RG 및 GR / BG입니다.)
  • @LevelRiverSt 제 의도는 BGGR을 준수하는 것이 었습니다 (네 번째 도전 항목에 명시된대로). 실제 예제 이미지가 RGGB 인 경우 내 실수입니다. 노트북을 사용하는 즉시 ‘ ‘ 수정하겠습니다.
  • ‘ 예시 이미지가 정확하지 않다고 생각합니다. 하나는 이상한 파란색 색조를 나타냅니다.

답변

Pyth, 26 바이트

[email protected],U2tU3" 

stdin에 인용 부호가있는 입력 파일 이름을 예상하고 o.png. 출력 예 :

댓글

  • 지금까지 답변이 가장 짧습니다. 나는 그것을 받아들이는 경향이 있지만 프로그램이 어떻게 작동하는지 설명을 추가 할 수 있다면 좋을 것입니다.
  • 이전 질문의 답변을 사용하여 방금 Kronecker 제품을 사용했습니다. codegolf.stackexchange.com/questions/78797/ … .

답변

Matlab, 104 92 바이트

이것은 Matlab에서 RGB 이미지의 3d 배열 / 행렬 표현을 사용합니다. 뿐만 아니라 Kronecker 제품 은 각 소스 픽셀에서이 새로운 2×2 “메타 픽셀”을 만드는 데 필요한 제품입니다. 그러면 출력이 팝업 창에 표시됩니다.

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 Thanks =) 실제로 작동합니다. id = “0969724ddf”>

예상하지 않습니다!

답변

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 필터가 적용된 모나리자

댓글

  • PPCG에 오신 것을 환영합니다. 좋은 첫 번째 답변입니다!

답변

Mathematica 118 127 바이트

원본 제출에서는 실제 사진을 입력으로 사용했습니다. 대신 파일 이름을 사용합니다.

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

  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, 이제 입력으로 이미지 대신 파일 이름을 사용합니다.

답변

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 :

o.png 처리 후 이미지

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다