Преобразование изображений RGB в оттенки серого с помощью Matplotlib: пошаговое руководство
Изображения являются неотъемлемой частью нашего окружения, и способность манипулировать ими или изменять их внешний вид — ценный навык. Обработка изображений находит свое применение в широком спектре областей, включая визуализацию данных и машинное обучение, где автоматизированные системы обрабатывают тысячи изображений одновременно.
В этой статье мы рассмотрим базовый метод обработки изображений, который включает преобразование изображений RGB (красный, зеленый, синий) в изображения в оттенках серого (черно-белые). Для этого мы воспользуемся Matplotlib, популярной библиотекой Python, известной своими возможностями создания графиков и визуализации данных. Кроме того, мы рассмотрим несколько практических примеров преобразования изображений RGB в оттенки серого с помощью Matplotlib.
Зачем конвертировать цветное изображение в монохромное?
Вам может быть интересно, зачем мы вообще конвертируем красивые и красочные изображения в скучные изображения в оттенках серого. Преобразование из RGB в оттенки серого широко применяется по следующим причинам:
- Уменьшение сложности вычислений при обработке изображений: цветные изображения имеют большее количество каналов данных по сравнению с изображениями в оттенках серого, которые имеют только один канал данных. Это может сократить время и количество вычислений, необходимых для обработки изображения.
- Меньший размер: изображения в оттенках серого меньше по размеру по сравнению с цветными изображениями. Для сравнения, один пиксель изображения RGB имеет размер 24 бита (8 бит на цвет), тогда как в оттенках серого каждый пиксель будет иметь длину всего 8 бит, что приведет к уменьшению общего размера изображения на 1/3.
- Лучший анализ изображений: поскольку они содержат только информацию о яркости изображения и не содержат дополнительных цветов, полностью устраняются сложности, возникающие из-за таких факторов, как насыщенность и оттенок изображений.
Теперь мы поняли, почему преобразования в оттенках серого более выгодны. Давайте посмотрим, как выполнить преобразование.
Преобразование изображений RGB в оттенки серого с использованием Matplotlib
Важным шагом перед тем, как перейти к примеру, будет установка библиотек Matplotlib и NumPy в нашей системе. Numpy — широко используемая библиотека Python для выполнения математических вычислений над числовыми массивами. Здесь мы в основном будем использовать Numpy для хранения весов цветовых каналов RGB в виде массива, который позже будет использоваться для расчета яркости каждого красного, зеленого и синего пикселя на изображении.
Команда для одновременной установки обоих пакетов выглядит следующим образом:
pip install matplotlib numpy
Теперь мы можем рассмотреть пример и пошаговую процедуру. Изображение, которое мы будем использовать в этом уроке, будет следующим изображением, сохраненным как test_img.png
в том же каталоге, что и наша программа.
В этом примере мы сначала загрузим изображение RGB, а затем воспользуемся формулой преобразования яркости, чтобы преобразовать каждое из значений пикселей цветного изображения в оттенки серого. Давайте рассмотрим пошаговую процедуру реализации этого.
Шаг 1: Импортируйте необходимые библиотеки и зависимости
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
Шаг 2: Загрузите изображение RGB в программу
Изображение, присутствующее в нашем каталоге, должно быть загружено в нашу программу, чтобы можно было манипулировать им. Это можно сделать с помощью зависимости изображения Matplotlib, которая предоставляет множество функций для работы с изображениями. Здесь мы будем использовать функцию imread(), которая принимает путь к изображению в качестве входных данных и загружает его в нашу программу.
rgb_image = mpimg.imread('test_img.png')
Обратите внимание, что test_img.png
следует заменить именем используемого вами изображения или путем к выбранному вами изображению.
imread()
возвращает пиксели изображения в виде многомерного массива, содержащего интенсивности красного, зеленого и синего компонентов соответственно. Значение интенсивности каждого компонента может варьироваться от 0 до 255. Этот массив хранится в rgb_image
.
Шаг 3: Преобразуйте изображение RGB в оттенки серого
Это делается с помощью функции dot()
библиотеки Numpy, которая используется для вычисления скалярного произведения двух массивов. Чтобы преобразовать RGB в оттенки серого, мы используем формулу:
0.2989 * R + 0.5870 * G + 0.1140 * B
Здесь 0,2989, 0,5870 и 0,1140 — значения постоянного веса, присвоенные красному, зеленому и синему соответственно. Они были научно рассчитаны на основе того, как человеческий глаз воспринимает разные цвета. Наша цель здесь — умножить значение RGB каждого пикселя на соответствующие им значения веса. Значения пикселей можно получить из массива rgb_image
.
Мы можем хранить веса в списке весов для облегчения вычислений.
weights = [0.2989, 0.5870, 0.1140]
gray_image = np.dot(rgb_image[..., :3], weights)
rgb_image[…, :3]
указывает, что для первых двух измерений мы выбираем все элементы (обозначаемые операцией ...
), а для последнего измерения мы используем операцию среза :
, чтобы выбрать только первые три элемента, то есть значения красного, зеленого и синего каналов.
Шаг 4: Визуализация изображений с помощью Matplotlib
Чтобы увидеть результаты нашего преобразования, мы используем Matplotlib для построения графика наших изображений. Мы делим наш график на два подграфика с помощью функции subplots()
. subplots(1,2)
указывают, что мы делим наш график на 2 по горизонтали. Левая часть будет содержать исходное изображение RGB. Мы можем построить левую часть следующим образом:
figure, (left,right) = plt.subplots(1,2,figsize=(12, 6))
left.imshow(rgb_image)
left.set_title('Original RGB Image')
Здесь у нас есть общий участок размером 1200х600. Мы используем функцию imshow()
в левом подграфике для отображения изображения RGB. Мы используем set_title()
, чтобы дать ему заголовок.
Мы можем сделать то же самое с правым подграфиком, чтобы отобразить изображение в оттенках серого.
right.imshow(gray_image, cmap='gray')
right.set_title('Grayscale Image')
Здесь мы используем параметр cmap
в imshow()
, чтобы установить значение карты цветов для изображения в оттенках серого.
Шаг 5: Отображение графика
Вышеуказанные шаги можно объединить в единый код следующим образом:
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
rgb_image = mpimg.imread('test_img.png')
weights = [0.2989, 0.5870, 0.1140]
gray_image = np.dot(rgb_image[..., :3], weights)
figure, (left,right) = plt.subplots(1,2,figsize=(12, 6))
left.imshow(rgb_image)
left.set_title('Original RGB Image')
right.imshow(gray_image, cmap='gray')
right.set_title('Grayscale Image')
plt.show()
Используя plt.show()
, мы можем отобразить наш график.
Заключение
Преобразование изображений RGB в оттенки серого может притупить их визуальную привлекательность, но оно дает значительные преимущества для обработки изображений. В этой статье мы подробно рассмотрели эти преимущества, а также практическую демонстрацию того, как выполнить это преобразование с помощью простых операций и функций массива NumPy. Кроме того, мы изучили метод отображения исходных изображений и изображений в оттенках серого рядом с использованием подграфиков Matplotlib.