Обработка изображений при помощи библиотеки Pillow

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

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

Результат необходимо записать в файл output.tiff в формате tiff, то есть вы обязаны указать при вызове метода save второй параметр "tiff".

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

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: Удаление шумов

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

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

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

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

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

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

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

Края изображения: это пискели, в которых меняются цвета областей, то есть соседние с ним пиксели будут иметь большое изменение цвета. Будем рассматривать соседние пиксели только в одном направлении изменения координаты \(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)}.\]

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

H: Контраст

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

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

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

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

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

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

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

J: Увеличение изображения

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

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

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

K: Поворот изображения

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

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

При сдаче задачи в тестирующую систему значение угла поворота \(\alpha\) в градусах определяется, как сумма всех цветовых каналов всех пикселей исходного изображения. Например, для примера из условия эта сумма равна 15839671, а её остаток от деления на 360 равен 31.

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

L: Градиентная заливка

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

В данном изображении цвет пикселей должен изменяться на 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).

M: Правильный многоугольник

Во входном файле input.png записано одноканальное чёрно-белое изображение. Это означает, что каждый пиксель изображения явлется одним числом типа int от 0 до 255.

Данное изображение представляет собой белый фон (пиксели имеют значение 255), на котором в каком-то месте нарисован правильный чёрный \(n\)-угольник (пиксели имеют значение 0), \(3\le n \le 6\). Многоугольник повёрнут на случайный угол.

Многоугольник не касается сторон изображения. Описанная вокруг многоугольника окружность имеет радиус не меньше 20 пикселей.

Выведите количество вершин в многоугольнике (число от 3 до 6).

Тесты к этой задаче сгененированы при помощи следующей программы.

Входной файл Вывод программы
5