Обработка изображений

Контест 1408

Сдавайте только свои функции без строки #include "lodelib.h", библиотека подгрузится автоматически.

Во всех задачах файлом с исходным изображением является input.png, результат нужно записать в файл output.png. Формат всех файлов — PNG.

A: Всё зелёное!

Программа должна считать исходный файл и оставить в этом файле только зелёный канал (значения красного и синего канала обнуляются).

Результат необходимо записать в файл output.png.

Входной файл Выходной файл

B: Зеркальное отражение

Сделайте зеркальное отображение входного файла относительно вертикальной оси.

Входной файл Выходной файл

C: Изменение яркости

Если ко всем пикселям изображения прибавить одно и то же число \(C\), то изображение станет светлее (если \(C\gt 0\)) или темнее (если \(C\lt 0\)).

Нормализуйте яркость данного изображения. Посчитайте среднее арифметическое всех пикселей, вычтите из него 128, это и будет значение \(C\), которое нужно вычесть из значения каждого пикселя. Учтите, что значения пикселей должны быть целыми числами от 0 до 255.

Входной файл Выходной файл

D: Баланс белого

Посмотрите на изображения из примеров: они выглядят, как будто сняты через цветной фильтр. У них завышены (или занижены) значения в каких-то цветовых каналах: в этих каналах значения пикселей больше (или меньше), чем в других каналах. Необходимо преобразовать эти изображения так, чтобы исправить баланс белого в этих изображениях. Будем считать, что это означает, что средние значения пикселей во всех каналах должны быть равны.

Требования к решению следующие.

Исправление баланса белого осуществляется преобразованиям вида \(r'=r+c_r\), \(g'=g+c_g\), \(b'=b+c_b\), где \(r\), \(g\), \(b\) — значения пикселя исходного изображения, а \(r'\), \(g'\), \(b'\) — новые значения того же пикселя, то есть все значения красного канала изменяются на \(c_r\), зелёного канала изменяются на \(c_g\), синего канала меняются на \(c_b\).

После выполения этого преобразования средние значения пикселей по каждому из трёх каналов равны, а среднее значение пикселей суммарно по всем трём каналам (т.е. средняя яркость изображения) не изменилось.

При выполнении расчётов не нужно учитывать проблемы обрезания значения пикселей ниже 0 или выше 255, но это нужно учитывать при выполнении преобразования.

Входной файл Выходной файл

E: Blur

Для каждого пикселя изображения рассмотрим квадрат размером \(3\times3\) с центром в данном пикселе. Посчитаем среднее значение (по каждому каналу) пикселей в этом квадрате и запишем результат в данный пиксель.

Это приводит к размыванию изображения, такой фильтр называется blur. Обычно его применяют к фону, например, чтобы размыть фон и сделать акцент на переднем плане. Вам необходимо применить фильтр ко всему изображению.

С пикселями на краю изображения можно сделать что угодно разумное, например, не менять их.

Входной файл Выходной файл

F: Градиент

Вам необходимо создать изображение размером 256×256 и записать его в файл output.png.

В данном изображении цвет пикселей должен изменяться на 1 при переходе к соседнему пикселю, в результате получается градиентная заливка всего изображения. Для каждого из трёх цветов значение пикселей по данному каналу может быть следующим:

В данной задаче программа получает на вход строку из трёх символов, каждый символ соответствует изменению цветового канала в изображении для красного, зелёного и синего цветов соответственно.

Символ 0 означает, что значение данного канала равно 0 для всех пикселей.

Символ 1 означает, что значение данного канала равно 255 для всех пикселей.

Символ x означает, что значение данного канала изменяется от 0 до 255 при изменении значения x от 0 до 255.

Символ X означает, что значение данного канала изменяется от 255 до 0 при изменении значения x от 0 до 255.

Символ y означает, что значение данного канала изменяется от 0 до 255 при изменении значения y от 0 до 255.

Символ Y означает, что значение данного канала изменяется от 255 до 0 при изменении значения y от 0 до 255.

Входные данные Выходной файл Пояснение
0xy

Цветовой канал Red везде равен 0, цветовой канал Green увеличивается от 0 до 255 по оси X, цветовой канал Blue увеличивается по оси Y. В левом верхнем углу — чёрный цвет, в правом верхнем (двигаемся по X)  зелёный, в левом нижнем (двигаемся по Y) — синий, в правом нижнем — cyan (смесь зелёного и синего).

YY1

По оси X изменений нет. По оси Y цвет меняется от белого (все компоненты максимальны) до синего (синий везде равен 255, а остальные каналы уменьшают значение до 0 при движении по оси Y).

G: Удаление шумов

При съёмке изображения на реальную камеру, на изображении появляются шумы: значения отдельных пикселей могут отличаться от окружающих. Фильтры, удаляющие шумы, убирают пиксели, значения которых сильно отличаются от значений окружающих пикселей.

Одной из возможных идей построения такого фильтра является медианная фильтрация. Возьмём для каждого пикселя 9 соседних с ним (включая его самого) пикселей, упорядочим их и возьмём медианный элемент в качестве значения данного пикселя. Выполним эту операцию по каждому цветовому каналу.

В этой задаче вам необходимо реализовать похожую версию этого алгоритма, разработанную компанией Kodak. Алгоритм работает отдельно для каждого пикселя и каждого цветового канала.

Для каждого пикселя изображения рассмотрим квадрат размером \(3\times3\) с центром в данном пикселе. Полученные 9 значений запишем в массив \(a=[a_0, ..., a_8]\) и упорядочим.

Если значение в данном пикселе совпадает с \(a_0\), то заменим его значение на \(a_1\). Если значение в данном пикселе совпадает с \(a_8\), то заменим его на \(a_7\). Во всех остальных случаях сохраним исходное значение.

Входной файл Выходной файл

H: Выделение краёв

Края изображения: это пиксели, в которых меняются цвета областей, то есть соседние с ним пиксели будут иметь большое изменение цвета. Будем рассматривать соседние пиксели только в одном направлении изменения координаты \(x\) и \(y\).

Вычислим изменения цвета по осях OX и OY: \[d_x = p_{x+1, y} - p_{x,y} ,\] \[d_y = p_{x, y+1} - p_{x,y}.\]

Возьмём среднее квадратическое: \[p'_{x, y}=\sqrt{\frac{1}{2}\left(d_x^2+d_y^2\right)}.\]

Входной файл Выходной файл

I: Контраст

Идея алгоритма повышения контраста изображения следующая. В каждом из каналов изменим значение цвета так, чтобы 5% самых тёмных точек перешло в 0, 5% самых светлых точек перешло в 255, остальные значения были распределены равномерно между 0 и 255.

Для каждого канала выберем такое минимальное значение \(a\), что количество пикселей, имеющих значение \(a\) или меньше составляет не менее 5% от общего числа пикселей. Выберем такое максимальное значение \(b\), что количество пикселей, имеющих значение \(b\) или больше составляет не менее 5% от общего числа пикселей.

Пиксели, значение которых меньше или равны \(a\), переводятся в 0. Пиксели, значения которых больше или равны \(b\), переводятся в 255. Пиксели, значение которых равны \(x\), где \(a\lt x \lt b\), переводятся в значения между 0 и 255 линейной функцией.

Входной файл Выходной файл

J: Уменьшение изображения

Дано изображение, необходимо уменьшить его в 2 раза. Реализуйте более сложный алгоритм, нежели метод ближайшей точки.

Входной файл Выходной файл