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!
sumber
BG
di baris atas danGR
di bawah, sedangkan contoh gambar ditampilkanRG
di atas danGB
di 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.)Jawaban:
Pyth, 26 byte
Mengharapkan nama file input dengan tanda kutip di stdin, dan menulis ke
o.png
. Contoh output:sumber
Matlab,
10492 byteIni memanfaatkan representasi 3d-array / matriks dari gambar RGB di Matlab, serta produk Kronecker yang persis apa yang kita butuhkan untuk membuat 2x2 "metapixel" baru ini dari setiap piksel sumber. Outputnya kemudian ditampilkan di jendela sembulan.
Screencapture yang diubah ukurannya:
sumber
[1:2;2:3]==n
pintar! Tidak bisakah kamu menghapusb=[a,a;a,a];
?Python 3,
259254 byteNama file input diberikan dalam input standar. Output ke
o.png
.Contoh penggunaan:
sumber
Mathematica
118127 bytePengiriman asli menggunakan gambar aktual sebagai input. Ini menggunakan nama file sebagai gantinya.
Ini menerapkan dua aturan penggantian pada data gambar dari file yang direferensikan:
Kemudian
Riffle
(yaitu interleave) matriks yang dihasilkan dari 1 dan 2.sumber
J,
1009690 byteIni adalah skrip dalam J yang membaca nama file dari gambar input dari stdin dan menampilkan hasilnya ke file bernama
o
. Gambar input dan output keduanya akan dalambmp
format. Itu juga mengharapkan hanya nama file yang akan menjadi input, yang berarti bahwa spasi putih depan dan belakang tidak boleh ada.Contoh Penggunaan
Penjelasan
sumber
Python 2,
256275 bytePertama saya menyederhanakan kode aslinya:
Kemudian minify ke:
Menghasilkan gambar
o.png
:sumber