Почти все датчики цифровых камер организованы в виде сетки фотодатчиков. Каждый фотодатчик чувствителен к одному из основных цветов : красному, зеленому и синему. Способ организации этих фотодатчиков называется фильтром Байера , в честь его изобретателя Брайса Байера из Eastman Kodak. После съемки изображения четыре фотодатчика составляют значение RGB одного пикселя в полученном изображении. Ваша задача - обратить вспять этот процесс и раскрасить получившиеся пиксели в соответствии с их цветом фильтра. Ради простоты мы будем игнорировать гамма-коррекцию .
Например: «нормальные» шаги прямого фильтра Байера:
- световой луч цвета пчелиного воска Pantone попадает на датчик;
- фильтр 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.
- Вы не можете вернуть представление массива результирующего изображения. Выходными данными должно быть изображение или файл (в любом подходящем формате изображения ), который может отображаться в виде изображения.
пример
Учитывая этот файл в качестве входных данных:
Полученное изображение должно быть:
Реализация ссылочного 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")
Помните: это Код-гольфтак выигрывает самый короткий код!
BG
верхней строкой иGR
снизу, а пример изображения показанRG
сверху иGB
снизу. Означает ли это, что любое расположение, которое ставит две зеленые ячейки по диагонали, является приемлемым? (остальные были бы GB / RG и GR / BG.)Ответы:
Pyth, 26 байт
Ожидает входное имя файла с кавычками на стандартном вводе и пишет в
o.png
. Пример вывода:источник
Матлаб,
10492 байтаЭто использует представление в виде матрицы / матрицы для изображений RGB в Matlab, а также продукт Kronecker, который является именно тем, что нам нужно для создания этого нового «метапикселя» 2x2 из каждого исходного пикселя. Выходные данные затем отображаются во всплывающем окне.
Изменен размер снимка экрана:
источник
[1:2;2:3]==n
умно! Вы не можете удалитьb=[a,a;a,a];
?Python 3,
259254 байтаИмя входного файла задается в стандартном вводе. Выходы в
o.png
.Пример использования:
источник
Mathematica
118127 байтовИсходное представление использовало фактическое изображение в качестве входных данных. Вместо этого используется имя файла.
Он применяет два правила замены к данным изображения указанного файла:
Затем
Riffle
(то есть чередование) матриц, полученных из 1 и 2.источник
J
1009690 байтЭто скрипт в J, который читает имя файла входного изображения из stdin и выводит результат в файл с именем
o
. Входные и выходные изображения будут оба вbmp
формате. Также ожидается, что будет введено только имя файла, что означает отсутствие начальных и конечных пробелов.Образец использования
объяснение
источник
Python 2,
256275 байтСначала я упростил оригинальный код:
Затем уменьшите до:
В результате на изображении
o.png
:источник