เซ็นเซอร์กล้องดิจิตอลเกือบทั้งหมดจะถูกจัดระเบียบในตารางของ 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 (สีน้ำเงิน - เขียว / เขียว - แดง) รูปแบบตัวกรองไบเออร์ตามที่อธิบายไว้กราฟิกในภาพต่อไปนี้:
เราจะสมมติว่าตัวรับแสงสีเขียวทั้งสองได้รับสัญญาณเดียวกันดังนั้นค่า G ในเมทริกซ์ไบเออร์จะเท่ากับค่า G ในภาพ RGB
- คุณไม่สามารถส่งคืนอาร์เรย์ที่เป็นตัวแทนของภาพผลลัพธ์ ผลลัพธ์จะต้องเป็นรูปภาพหรือไฟล์ (ในรูปแบบภาพที่เหมาะสม ) ที่สามารถแสดงเป็นรูปภาพได้
ตัวอย่าง
รับไฟล์นี้เป็นอินพุต:
ภาพที่ได้ควรเป็น:
การใช้งานหลามอ้างอิง:
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")
จำเอาไว้: นี่คือ รหัสกอล์ฟรหัสที่สั้นที่สุดจึงชนะ!
BG
แถวด้านบนและGR
ด้านล่างในขณะที่ภาพตัวอย่างแสดงRG
ที่ด้านบนและGB
ด้านล่าง นั่นหมายความว่าการจัดการใด ๆ ที่ทำให้ทั้งสองเซลล์สีเขียวในแนวทแยงนั้นเป็นที่ยอมรับได้หรือไม่? (ส่วนอื่น ๆ จะเป็น GB / RG และ GR / BG.)