Майже всі датчики цифрової камери організовані в сітку фотосенсорів. Кожен фотодатчик чутливий до одного з основних кольорів : червоного, зеленого та синього. Те, як організовані фотосенсори, називається фільтром Байєра , після його винахідника Брайса Байєра з Істмена Кодака. Після зйомки зображення чотири фотосенсори складають значення RGB одного пікселя в отриманому зображенні. Ваше завдання - повернути цей процес і розфарбувати отримані пікселі відповідно до їх кольору фільтра. Заради простоти ми будемо ігнорувати корекцію гамми .
Наприклад: "нормальні" кроки фільтра вперед Bayer:
- світловий промінь із кольором бджолиного воску Pantone потрапляє на датчик;
- фільтр BGGR (синій - зелений / зелений - червоний) розкладає це на чотири промені.
- Чотири промені потрапляють на датчик, який читає: 81 - 168/168 - 235 (значення датчика коливаються від 0 - 255);
- Фільтр Bayer переводить це в один піксель 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.)