ย้อนกลับตัวกรองไบเออร์ของภาพ


9

เซ็นเซอร์กล้องดิจิตอลเกือบทั้งหมดจะถูกจัดระเบียบในตารางของ photosensors เซ็นเซอร์ภาพแต่ละภาพมีความอ่อนไหวต่อสีหลักอย่างใดอย่างหนึ่ง: สีแดงสีเขียวและสีน้ำเงิน วิธีการจัดระเบียบเซ็นเซอร์ภาพถ่ายเหล่านี้เรียกว่าตัวกรองไบเออร์หลังจากผู้คิดค้นไบรซ์ไบเออร์แห่งอีสต์แมนโกดัก หลังจากถ่ายภาพแล้วเซ็นเซอร์ภาพถ่ายสี่ตัวจะประกอบด้วยค่า RGB ของหนึ่งพิกเซลในภาพที่ได้ งานของคุณคือการย้อนกลับกระบวนการนั้นและกำหนดค่าพิกเซลของผลลัพธ์ตามสีของฟิลเตอร์ เพื่อประโยชน์ของความเรียบง่ายที่เราจะไม่สนใจการแก้ไขแกมมา

ตัวอย่างเช่น: ขั้นตอนการกรอง "ปกติ" ไปข้างหน้าไบเออร์คือ:

  • Lightray ที่มีสี Pantone Beeswaxกระทบเซ็นเซอร์
  • ตัวกรอง BGGR (สีน้ำเงิน - เขียว / เขียว - แดง) จะแยกตัวออกเป็นสี่รังสี
  • รังสีทั้งสี่ชนกับเซ็นเซอร์ซึ่งอ่านได้: 81 - 168/168 - 235 (ค่าเซ็นเซอร์อยู่ในช่วงตั้งแต่ 0 - 255)
  • ตัวกรองไบเออร์แปลสิ่งนี้เป็นพิกเซล RGB หนึ่งสี (235, 168, 81)

ขั้นตอนการกรองแบบย้อนกลับของไบเออร์คือ:

  • พิกเซล RGB ที่มีสี (235, 168, 81) แบ่งออกเป็นสี่พิกเซลพร้อมค่า RGB: (0,0,81) - (0,168,0) / (0,168,0) - (235,0,0)

ท้าทาย

คุณควรเขียนฟังก์ชันหรือโปรแกรมที่สั้นที่สุดเท่าที่จะทำได้ดังนี้

  • ใช้ชื่อไฟล์ในการป้อนข้อมูลและส่งออกภาพ DeBayered
  • ผลลัพธ์อาจถูกเขียนไปยังไฟล์หรือแสดงบนหน้าจอ
  • เอาต์พุตจะต้องมีความกว้างเป็นสองเท่าและสูงเป็นสองเท่าของภาพต้นฉบับ
  • แต่ละพิกเซลของภาพอินพุตจะต้องมีการแมปตามรูปแบบตัวกรอง BGGR (สีน้ำเงิน - เขียว / เขียว - แดง) รูปแบบตัวกรองไบเออร์ตามที่อธิบายไว้กราฟิกในภาพต่อไปนี้:

    ตัวกรองไบเออร์ - BGGR - คำอธิบายแบบกราฟิก

  • เราจะสมมติว่าตัวรับแสงสีเขียวทั้งสองได้รับสัญญาณเดียวกันดังนั้นค่า G ในเมทริกซ์ไบเออร์จะเท่ากับค่า G ในภาพ RGB

  • คุณไม่สามารถส่งคืนอาร์เรย์ที่เป็นตัวแทนของภาพผลลัพธ์ ผลลัพธ์จะต้องเป็นรูปภาพหรือไฟล์ (ในรูปแบบภาพที่เหมาะสม ) ที่สามารถแสดงเป็นรูปภาพได้

ตัวอย่าง

รับไฟล์นี้เป็นอินพุต:

Mona Lisa

ภาพที่ได้ควรเป็น:

DeBayered Mona Lisa

การใช้งานหลามอ้างอิง:

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
@ ขอให้ขอโทษสำหรับสิ่งนั้น! ;-) เอฟเฟกแปลก ๆ ใช่มั้ย
ตลอดไป

คำแนะนำแสดงเซลล์ที่มีBGแถวด้านบนและGRด้านล่างในขณะที่ภาพตัวอย่างแสดงRGที่ด้านบนและGBด้านล่าง นั่นหมายความว่าการจัดการใด ๆ ที่ทำให้ทั้งสองเซลล์สีเขียวในแนวทแยงนั้นเป็นที่ยอมรับได้หรือไม่? (ส่วนอื่น ๆ จะเป็น GB / RG และ GR / BG.)
เลเวลริเวอร์เซนต์

@LevelRiverSt ความตั้งใจของฉันคือการปฏิบัติตาม BGGR (ตามที่ระบุใน bullet การท้าทายที่สี่) ความผิดพลาดของฉันถ้าภาพตัวอย่างที่แท้จริงอยู่ใน RGGB ฉันจะแก้ไขให้ถูกต้องทันทีที่ฉันใช้แล็ปท็อป
ตลอดไป

ฉันไม่คิดว่าภาพตัวอย่างของคุณถูกต้องเพราะมีสีฟ้าแปลก ๆ
orlp

คำตอบ:


6

Pyth, 26 ไบต์

MXm03H@GH.wsMsgLRRR,U2tU3'

คาดว่าชื่อไฟล์การป้อนข้อมูลด้วยเครื่องหมายคำพูดใน stdin o.pngและเขียนไป ตัวอย่างผลลัพธ์:


คำตอบของคุณสั้นที่สุด ฉันมักจะยอมรับมัน แต่มันจะดีถ้าคุณสามารถเพิ่มคำอธิบายวิธีการทำงานของโปรแกรม
ตลอดไป

ฉันเพียงแค่ใช้ผลิตภัณฑ์ Kronecker ใช้คำตอบจากคำถามก่อนหน้านี้: codegolf.stackexchange.com/questions/78797/...
orlp

6

Matlab, 104 92 ไบต์

สิ่งนี้ใช้ประโยชน์จากการเป็นตัวแทน 3d-array / matrix ของภาพ RGB ใน Matlab เช่นเดียวกับผลิตภัณฑ์ Kroneckerซึ่งเป็นสิ่งที่เราต้องการในการสร้าง 2x2 "metapixel" รูปแบบใหม่นี้ในแต่ละพิกเซลต้นทาง ผลลัพธ์จะปรากฏขึ้นในหน้าต่างป๊อปอัพ

a=double(imread(input('')));for n=1:3;b(:,:,n)=kron(a(:,:,n),[1:2;2:3]==n)/255;end;imshow(b)

ปรับขนาด screencapture:


นั่น[1:2;2:3]==nคือฉลาด! คุณลบb=[a,a;a,a];ไม่ได้ใช่ไหม
Luis Mendo

@LuisMendo ขอบคุณ =) มันใช้งานได้จริงฉันไม่ได้คาดหวัง!
ข้อบกพร่อง

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

Mona Lisa ที่ใช้ตัวกรองแบบย้อนกลับของไบเออร์


2
ยินดีต้อนรับสู่ PPCG คำตอบแรกที่ดี!
Leun Nun

4

Mathematica 118 127 bytes

การส่งต้นฉบับใช้รูปภาพจริงเป็นอินพุต ใช้ชื่อไฟล์แทน

มันใช้กฎการแทนที่สองข้อกับข้อมูลภาพของไฟล์อ้างอิง:

  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"]

ย้อนกลับไบเออร์


ไม่แน่ใจ แต่สิ่งนี้ดูเหมือนจะไม่ตอบสนอง " ใช้ชื่อไฟล์เหมือนในอินพุท "
2559

ตอนนี้มันใช้เป็นอินพุตชื่อไฟล์แทนภาพ
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''

นี่คือสคริปต์ใน J ที่อ่านชื่อไฟล์ของภาพที่นำเข้าจาก stdin 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.