Визуализация цветовых пространств изображений с помощью Python и MatPlotLib

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

В частности, мы будем использовать Python для разделения цветов, присутствующих в изображении, и визуализировать это цветовое пространство с помощью MatPlotLib.


Сначала поговорим о том, как можно представить цвет в трехмерном пространстве. Программное обеспечение, как правило, разбивает цвета на значения RGB: Смесь красного, зеленого и синего цветов, из которых состоит цвет. Если вы хотите получить представление о том, как различные цвета разбиваются таким образом, посмотрите эту ссылку:

https://www.rapidtables.com/web/color/RGB_Color.html

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

В нашем примере красное значение цвета определяет его координату x, зеленое — координату y, а синее — координату z. Как видите, когда x и z равны 255, мы получаем фиолетовый цвет, а когда все три параметра цвета равны 0, мы получаем сплошной черный цвет. Мы можем представить любой цвет в цветовой модели RGB через координаты x, y и z.


Хорошо, теперь давайте начнем работать с python. Сначала мы установим необходимые библиотеки. Выполните следующую команду для установки MatPlotLib, библиотеки, которую мы будем использовать для построения графиков цветов.

python -m pip install -U matplotlib

Далее нам нужно установить Pillow, библиотеку Python, которая позволяет нам декомпозировать изображения.

pip install Pillow

Теперь давайте импортируем все необходимое в начало нашего файла python:

import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d
from PIL import Image
Вход в полноэкранный режим Выйти из полноэкранного режима

Теперь давайте загрузим изображение, которое вы хотите разложить с помощью Pillow.

im = Image.open("PUT YOUR IMAGE PATH HERE")

Для этого примера я буду использовать эту красивую фотографию:

Далее мы создадим двумерный массив всех пикселей изображения

px = im.load()

im.load() возвращает нам двумерный массив, хранящий каждый пиксель. Каждый объект пикселя — это массив из 3 целых чисел, представляющих значения RGB конкретного пикселя. Я рекомендую вам поиграть с этим значением px, чтобы лучше понять, как он хранит пиксели.

Далее, давайте настроим наше 3D пространство. MatPlotLib делает это невероятно просто. Сначала мы создадим оси нашего графика, которые мы укажем как 3D.

ax = plt.axes(projection = '3d')

Для построения цветовых точек MatPlotLib требует, чтобы мы задали ему 4 массива, представляющих координаты x,y,z всех наших точек, а также цвет для каждой из них. Давайте создадим эти массивы, которые пока будут пустыми.

x = []
y = []
z = []
c = []
Вход в полноэкранный режим Выход из полноэкранного режима

Теперь давайте заполним эти массивы. Для этого нам нужно пройтись по всем пикселям, добавляя соответствующие значения в массивы x,y,z и цвет.

for rw in range(0,im.height):
       for col in range(0, im.width):
            pix = px[col,row]
            x.append(pix[0])
            y.append(pix[1])
            z.append(pix[2])
            c.append((pix[0] / 255, pix[1] / 255, pix[2] / 255))
Вход в полноэкранный режим Выход из полноэкранного режима

Обратите внимание, что MatPlotLib требует, чтобы мы нормализовали значения RGB между 0 и 1 при предоставлении цветов, поэтому мы делим каждое значение RGB на 255. Также, обратите внимание, что этот код часто приводит к тому, что массивы будут содержать дубликаты, что заставит MatPlotLib делать больше работы, чем необходимо.

Чтобы остановить это, мы можем добавить оператор if, чтобы он добавлял цвет только в том случае, если его еще нет в массиве.

for row n range(0,im.height):
     for col in range(0, im.width):
         pix = px[col,row]
         newCol = (pix[0] / 255, pix[1] / 255, pix[2] / 255)

         if(not newCol in c):
            x.append(pix[0])
            y.append(pix[1])
            z.append(pix[2])
            c.append(newCol)

Вход в полноэкранный режим Выход из полноэкранного режима

Наконец, нам просто нужно построить график этих точек, что мы можем сделать с помощью MatPlotLib:

ax.scatter(x,y,z, c = c)
plt.show()

Запустив этот скрипт python со следующим изображением:

Мы получим следующий график:

Вот так! Теперь для обзора наш окончательный код:

import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d
from PIL import Image

im = Image.open("YOUR IMAGE PATH")
px = im.load()

ax = plt.axes(projection = '3d')
x = []
y = []
z = []
c = []

for row in range(0,im.height):
     for col in range(0, im.width):
         pix = px[col,row]
         newCol = (pix[0] / 255, pix[1] / 255, pix[2] / 255)

         if(not NewCol in c):
            x.append(pix[0])
            y.append(pix[1])
            z.append(pix[2])
            c.append(newCol)

ax.scatter(x,y,z, c = c)
plt.show()
Войти в полноэкранный режим Выход из полноэкранного режима

Надеюсь, вам понравился этот проект! Я рекомендую поиграть с разными изображениями и посмотреть, какие закономерности возникают среди этих цветовых графиков.

Вот несколько других графиков, которые я построил на основе различных изображений:

Счастливого кодинга от ваших друзей из Codesphere — универсальной платформы разработки!

Оцените статью
Procodings.ru
Добавить комментарий