Что делает материал про фотографию на канале про программирование? Не спешите с выводами, это реально программистская тема.
"A это цветной или чёрно-белый фотоаппарат?"
Ещё в детстве задавал такой вопрос. Он был смешной, потому что цвет фотографии зависел не от фотоаппарата, а от плёнки, которая в него заряжалась.
И кто бы знал, что пройдёт много лет, и этот вопрос перестанет быть смешным.
Сейчас цифровой фотоаппарат может быть или чёрно-белым, или цветным. Это зависит от того, какая матрица в нём стоит. Можно сравнить матрицу с плёнкой, но её нельзя менять, она является частью фотоаппарата и поэтому какая она, такой и весь фотоаппарат.
Значит, бывают чёрно-белые и цветные матрицы? Да. Но есть нюанс.
На самом деле они все чёрно-белые.
Матрица покрыта пикселами – маленькими фотоэлементами, которые улавливают свет и накапливают электрический заряд. Но по сути они улавливают только лишь энергию. Они не знают, какой свет на них светит – красный, жёлтый, фиолетовый? Им всё равно. Свет это просто энергия, и они регистрируют количество этой энергии.
Поэтому с чёрно-белой (точнее, монохромной) матрицей всё понятно. Нет энергии – это чёрный цвет. Максимальная энергия – это белый цвет.
Но как быть с цветной?
По интернету с давних времён гуляет подборка фотографий, и я уверен, что вы её видели. Достаточно набрать в поиске "Цветные фотографии начала века".
Эти фотографии делались на стеклянные пластины с монохромной эмульсией. Секрет в том, что каждое фото делалось три раза. Сначала на камеру ставился красный фильтр, и делался снимок. Пластину доставали, ставили новую. Затем ставился зелёный фильтр, делался ещё снимок. Пластину доставали, ставили новую. И затем ставился синий фильтр, и делался ещё снимок.
Что получалось в результате: красный фильтр пропускал только красную часть света, и значит, на монохромной пластине сохранялась информация только о красном цвете. С зелёным фильтром сохранялась информация только о зелёном цвете, и с синим – только о синем.
Как выглядит эта информация, вы можете понять с помощью Фотошопа или аналогичной программы, где можно включать и выключать красный, зелёный и синий слои изображения.
С помощью трёх проекторов, которые в свою очередь светили красным, зелёным и синим светом, изображения с трёх пластин проецировались на стену, совмещаясь друг с другом. И совмещаясь, они воссоздавали изначальный цвет, который состоит из трёх компонент – красной, зелёной и синей.
И вот эта 100-летняя технология внезапно оказалась применимой и к электронным матрицам.
То есть, если поставить перед матрицей красный фильтр, сделать снимок, затем зелёный фильтр, ... да-да-да, можно сделать именно так, но это очень сложно и долго. Чтобы делать такие фотографии, нужно, чтобы ни фотокамера, ни изображаемые объекты не сдвигались с места. Что современным людям категорически не подходит.
А что, если...
А если разместить фильтр не перед всей матрицей, а перед каждым пикселом? Если вы посмотрите на экран своего монитора под увеличением, то увидите, что каждый пиксел состоит из трех светящихся точек - красной, зелёной и синей. То есть из трёх субпикселов. И в фотоматрице можно было бы сделать так, чтобы вместо одного пиксела было три, и над каждым стоял бы фильтр своего цвета.
Но возникла проблема. На тот момент матрица размером три мегапиксела считалась супер-передовой. Но если вместо одного монохромного пиксела держать три цветных, получится девять мегапикселов. Это было слишком дорого. Нужно было искать какой-то компромисс. И он был найден.
Над каждым пикселом поставили фильтр своего цвета. И расположили фильтры в таком порядке:
Теперь каждый пиксел матрицы мог быть только красным, только зелёным или только синим. Вся остальная информация о цвете просто выбрасывалась. Да-да, те цветные цифровые фото, которые мы видим – это на самом деле меньше чем половина той информации, которая попала на матрицу.
Вот так выглядит изображение с потерянной информацией, которое "видит" матрица фотоаппарата:
Как тогда получаются нормальные цветные фотографии?
Потерянную информацию можно восстановить, а точнее говоря – выдумать с помощью интерполяции между соседними пикселами. Допустим, мы берём синий пиксел. Он окружён четырьмя зелёными и четырьмя красными пикселами. Значит, мы можем взять эти зелёные и красные пикселы и усреднить их, и добавить в наш синий пиксел. То же самое сделаем для красного. А зелёный пиксел окружён двумя синими и двумя красными.
Если внимательно посмотреть на порядок расположения цветных фильтров, можно заметить, что зелёный цвет повторяется в два раза чаще. Это не случайно. Человеческий глаз наиболее чувствителен к перепаду яркостей, а информация о яркости по большей части находится в зелёном цвете. Поэтому его сохранили побольше, а красный и синий – поменьше.
В общем, выяснилось, что интерполяция цветов достаточно достоверно восстанавливает отсутствующую цветовую информацию.
Хотя у неё были и есть свои недостатки: падение чёткости изображения, цветовой муар (алиасинг), и вообще говоря, это обман, ненастоящий цвет, но плюсы перевесили минусы: более дешёвые матрицы, меньший объем данных (нужно хранить только 1/3 всей информации).
Алгоритмы интерполяции за все эти годы не раз совершенствовались, в них уже включают элементы машинного обучения, так что результаты становятся всё лучше и лучше. Кроме того, производители экспериментируют с альтернативными схемами расположения фильтров и с дополнительными пикселами.
Есть и два совершенно других подхода к цвету: матрицы Foveon и 3CCD. Если захотите, расскажу и про них.