Автор оригинала: 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()
Главный компонентный анализ для сжатия данных изображения
Другое прохладное применение 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 основных компонентов.
Если мы увеличиваем количество основных компонентов. Выходное изображение будет понятно.
Используя первые 50 основных компонентов:
Теперь, используя 100 основных компонентов:
С первыми 100 основными компонентами наш выход был гораздо яснее. Теперь давайте нанесем PCA, используя первые 200 основных компонентов.
Вуаля! С 200 основными компонентами мы смогли создать резкое изображение, как оригинальный.
Количество компонентов для рассмотрения полностью произвольна. Начните с некоторого небольшого значения и постепенно увеличивайте его до тех пор, пока не будет достигнут желаемый выход. Не стесняйтесь экспериментировать с кодом.
Заключение
В этой статье мы изучили применение PCA в качестве метода восстановления размеров и применили его к данным изображения. Мы также видели, как PCA находит свое использование в сжатии изображений.
Счастливое обучение!