Hampir semua sensor kamera digital diatur dalam kotak sensor foto. Setiap sensor foto sensitif untuk salah satu warna utama : merah, hijau dan biru. Cara sensor-sensor foto tersebut diatur disebut filter Bayer , menurut penemunya, Bryce Bayer dari Eastman Kodak. Setelah gambar diambil, empat sensor foto menyusun nilai RGB satu piksel pada gambar yang dihasilkan. Tugas Anda adalah membalikkan proses itu dan mewarnai piksel yang dihasilkan sesuai dengan warna filternya. Demi kesederhanaan, kami akan mengabaikan koreksi gamma .
Misalnya: langkah-langkah filter maju Bayer "normal" adalah:
- sebuah lightray dengan warna Pantone Beeswax mengenai sensor;
- filter BGGR (Biru - Hijau / Hijau - Merah) menguraikan ini menjadi empat sinar.
- Keempat sinar itu mengenai sensor, yang berbunyi: 81 - 168/168 - 235 (nilai sensor berkisar dari 0 - 255);
- Filter Bayer menerjemahkan ini ke satu piksel RGB dengan warna (235, 168, 81).
Langkah-langkah filter Bayer terbalik adalah:
- Piksel RGB dengan warna (235, 168, 81) dibagi menjadi empat piksel dengan nilai RGB: (0,0,81) - (0,168,0) / (0,168,0) - (235,0,0).
Tantangan
Anda harus menulis fungsi atau program sesingkat mungkin yang melakukan hal berikut:
- Ambil nama file sebagai input dan output gambar DeBayered.
- Outputnya dapat ditulis ke file atau ditampilkan di layar.
- Output harus dua kali lebar dan dua kali tinggi gambar asli.
Setiap piksel dari gambar input harus dipetakan sesuai dengan pola filter BGGR (Biru - Hijau / Hijau - Merah) seperti yang dijelaskan secara grafis dalam gambar berikut:
Kita akan mengasumsikan bahwa kedua fotosensor hijau menerima sinyal yang sama, sehingga kedua nilai G dalam matriks Bayer sama dengan nilai G pada gambar RGB.
- Anda tidak dapat mengembalikan representasi array dari gambar yang dihasilkan. Output harus berupa gambar atau file (dalam format gambar apa pun yang sesuai ) yang dapat ditampilkan sebagai gambar.
Contoh
Diberikan file ini sebagai input:
Gambar yang dihasilkan harus:
Referensi implementasi 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")
Ingat: ini adalah kode-golf , jadi kode terpendek menang!
BGdi baris atas dan GRdi bawah, sedangkan contoh gambar ditampilkan RGdi atas dan GBdi bawah. Apakah itu berarti pengaturan apa pun yang menempatkan dua sel hijau pada diagonal dapat diterima? (yang lain akan menjadi GB / RG dan GR / BG.)







