Рубрики
Без рубрики

Главный компонентный анализ для данных изображения в Python

Мы уже работали на PCA в предыдущей статье. В этой статье давайте будем работать над основным компонентным анализом для данных изображения. PCA – знаменитый неповторимый

Автор оригинала: Pankaj Kumar.

Главный компонентный анализ для данных изображения в Python

Мы уже работали на PCA в предыдущей статье. В этой статье давайте будем работать над основным компонентным анализом для данных изображения. PCA – это известная неподременная техника уменьшения размерности, которая приходит к нашему спасению, когда проклятие размерности преследует нас.

Работа с изображениями изображения немного отличается от обычных наборов данных. Типичное цветное изображение состоит из крошечных пикселей («элемент изображения» для коротких), многие пиксели объединяются в массиве, чтобы сформировать цифровое изображение.

Типичное цифровое изображение производится путем укладки красных синих и зеленых массивов пикселей интенсивностей от 0 до 255.

РГБ массивы в сочетании, чтобы сделать изображение

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

Применение PCA для цифр набора данных

Цифры DataSet – это набор данных из серого изображения рукописной цифры, имеющего 1797 8 × 8 изображений.

#importing the dataset
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits

digits = load_digits()
data = digits.data
data.shape

kklearn.datasets Модуль делает его быстро импортировать цифры данных, импортируя load_digits класс от него. Форма данных цифры составляет (1797, 64). 8 × 8 пикселей сплющены для создания вектора длины 64 для каждого изображения.

Давайте посмотрим, как выглядит наши данные.

#taking a sample image to view
#Remember image is in the form of numpy array.
image_sample = data[0,:].reshape(8,8)
plt.imshow(image_sample)
Образец изображения из цифрового набора данных

1. Уменьшить измерения изображения

Теперь, используя PCA, давайте уменьшим измерения изображения от 64 до 2, чтобы мы могли визуализировать набор данных, используя ScatterPlot.

Sklearn Предоставляет нам очень простую реализацию PCA.

#Import required modules
from sklearn.decomposition import PCA

pca = PCA(2) # we need 2 principal components.
converted_data = pca.fit_transform(digits.data)

converted_data.shape

Данные снижаются с (1797, 64) до (1797, 2).

2. Визуализируйте полученный набор данных

Мы будем использовать Sklearn.DeComposition Предоставляет PCA () Класс для реализации основного алгоритма анализа компонентов.

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

Мы также можем пройти значение поплавка менее 1 вместо целочисленного числа. I.E. PCA (0,90) Это означает, что алгоритм найдет основные компоненты, которые объясняют 90% дисперсии в данных.

Давайте визуализируем результат.

plt.style.use('seaborn-whitegrid')
plt.figure(figsize = (10,6))
c_map = plt.cm.get_cmap('jet', 10)
plt.scatter(converted_data[:, 0], converted_data[:, 1], s = 15,
            cmap = c_map , c = digits.target)
plt.colorbar()
plt.xlabel('PC-1') , plt.ylabel('PC-2')
plt.show()
Визуализация цифр данных в 2 измерениях 2

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

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

# Importing required libraries
import cv2
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA

1. Загрузка изображения

Мы будем использовать Opencv (Библиотека компьютерного видения с открытым исходным кодом). Opencv это компьютерное зрение с открытым исходным кодом и библиотека обучения машины.

# Loading the image 
img = cv2.imread('my_doggo_sample.jpg') #you can use any image you want.
plt.imshow(img)
Образец исходного вывода изображения

2. Разделение изображения в R, G, B массивы

Как мы знаем, цифровое цветное изображение – это комбинация массивов R, G, и B, сложенных друг с другом. Здесь мы должны разделить каждый канал из изображения и извлекать основные компоненты каждого из них.

# Splitting the image in R,G,B arrays.

blue,green,red = cv2.split(img) 
#it will split the original image into Blue, Green and Red arrays.

Важной точкой здесь следует отметить, OpenCV разделится на синие, зеленые и красные каналы вместо красных, синих и зеленых. Будьте очень осторожны на последовательности здесь.

3. Нанесите основные компоненты к отдельным массивам

Теперь, нанесите PCA на каждый массив.

#initialize PCA with first 20 principal components
pca = PCA(20)

#Applying to red channel and then applying inverse transform to transformed array.
red_transformed = pca.fit_transform(red)
red_inverted = pca.inverse_transform(red_transformed)

#Applying to Green channel and then applying inverse transform to transformed array.
green_transformed = pca.fit_transform(green)
green_inverted = pca.inverse_transform(green_transformed)

#Applying to Blue channel and then applying inverse transform to transformed array.
blue_transformed = pca.fit_transform(blue)
blue_inverted = pca.inverse_transform(blue_transformed)

Здесь мы применили PCA, хранящие только первые 20 основных компонентов и применили его к массивам RGB соответственно.

4. Сжатие изображения

Обратная трансформация необходима для воссоздания оригинальных размеров базового изображения.

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

img_compressed = (np.dstack((red_inverted, red_inverted, red_inverted))).astype(np.uint8)

Укладка инвертированных массивов с использованием DSTACK функция. Здесь важно указать тип данных наших массивов, так как большинство изображений имеют 8 бит. Каждый пиксель представлен одним 8-битным байтом.

#viewing the compressed image
plt.imshow(img_compressed)
Сжатое изображение с первыми 20 основными компонентами 2

Выход выше, что мы получаем при рассмотрении всего 20 основных компонентов.

Если мы увеличиваем количество основных компонентов. Выходное изображение будет понятно.

Используя первые 50 основных компонентов:

Сжатое изображение с первыми 50 основными компонентами

Теперь, используя 100 основных компонентов:

Сжатое изображение с первыми 100 основными компонентами

С первыми 100 основными компонентами наш выход был гораздо яснее. Теперь давайте нанесем PCA, используя первые 200 основных компонентов.

Сжатое изображение с первыми 200 основными компонентами

Вуаля! С 200 основными компонентами мы смогли создать резкое изображение, как оригинальный.

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

Заключение

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

Счастливое обучение!