Hemen hemen tüm dijital kamera sensörleri bir fotosensör ızgarasında düzenlenmiştir. Her fotoğraf sensörü ana renklerden birine duyarlıdır : kırmızı, yeşil ve mavi. Bu fotoğraf sensörlerinin düzenlenme şekline , mucidi Eastman Kodak'tan Bryce Bayer'den sonra Bayer filtresi denir . Bir görüntü çekildikten sonra, dört fotoğraf sensörü ortaya çıkan görüntüdeki bir pikselin RGB değerini oluşturur. Göreviniz bu işlemi tersine çevirmek ve elde edilen pikselleri filtre renklerine göre renklendirmektir. Basitlik uğruna gama düzeltmesini görmezden geleceğiz .
Örneğin: "normal" ileri Bayer filtre adımları:
- Pantone Balmumu rengine sahip bir lightray sensöre çarpar;
- BGGR (Mavi - Yeşil / Yeşil - Kırmızı) filtresi bunu dört ışına ayırır.
- Dört ışın sensöre çarpar ve bu sensör: 81 - 168/168 - 235 (sensör değerleri 0 - 255 arasındadır);
- Bayer filtresi bunu renkli bir RGB piksele çevirir (235, 168, 81).
Ters Bayer filtre adımları:
- Renkli RGB piksel (235, 168, 81) RGB değerleriyle dört piksele bölünür: (0,0,81) - (0,168,0) / (0,168,0) - (235,0,0).
Meydan okuma
Aşağıdakileri yapan mümkün olan en kısa işlevi veya programı yazmalısınız:
- Girdi gibi bir dosya adı alın ve DeBayered görüntüsünü çıkarın.
- Çıktı bir dosyaya yazılabilir veya ekranda görüntülenebilir.
- Çıktı, orijinal görüntünün iki katı ve yüksekliğinin iki katı olmalıdır.
Giriş görüntüsünün her pikseli, aşağıdaki resimde grafik olarak açıklandığı şekilde BGGR (Mavi - Yeşil / Yeşil - Kırmızı) Bayer filtre modeline göre eşlenmelidir:
Her iki yeşil fotosensörün de aynı sinyali aldığını varsayacağız, bu nedenle Bayer matrisindeki G değerlerinin her ikisi de RGB görüntüsündeki G değerine eşittir.
- Sen olabilir değil Oluşan görüntünün bir dizi gösterimini döndürür. Çıktı, resim olarak görüntülenebilecek bir resim veya bir dosya ( uygun herhangi bir resim biçiminde ) olmalıdır.
Misal
Bu dosya girdi olarak verildiğinde:
Ortaya çıkan görüntü şöyle olmalıdır:
Referans python uygulaması:
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")
Unutmayın: bu bir kod golf, çok kısa kod kazanır!
BG
üst satırda ve GR
altta olan bir hücreyi gösterirken örnek görüntü RG
üstte ve GB
altta gösterilir. Bu, iki yeşil hücreyi diyagonal yerleştiren herhangi bir düzenleme kabul edilebilir mi? (diğerleri GB / RG ve GR / BG olacaktır.)