DevGang
Авторизоваться

Преобразование изображений 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.

Источники:

#Python #Matplotlib
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В этом месте могла бы быть ваша реклама

Разместить рекламу