转换图像数组以用于 pandas 库中的 PCA

Convert an Image array to be used for PCA in pandas library

我正在尝试对图像执行 PCA,然后输出一个图像,其像素根据 PCA 中的聚类进行着色。我正在做无监督的 PCA。最终目标可见于此link:Forward PC rotation

我目前正在使用 pandas 库(如果人们有其他更优雅的解决方案,我会洗耳恭听)并开放图像处理。

我正在尝试加载 b、g、r 波段作为我的列,索引是一个像素,给出 table 图像中所有像素的行(每行都有一个色带列).

填充数据时,我的图像中最终有超过 300 万像素,我填充了它,但是每个像素都需要大约 5 秒的时间,所以无法判断我是否正确地进行了填充。有没有更好的办法?另外,如果人们了解如何对图像使用 PCA,我将不胜感激。

代码:

import pandas as pd 
import numpy as np 
import random as rd
from sklearn.decomposition import PCA
from sklearn import preprocessing
import matplotlib.pyplot as plt
import cv2 

#read in image
img = cv2.imread('/Volumes/EXTERNAL/Stitched-Photos-for-Chris/p7_0015_20161005-949am-75m-pass-1.jpg.png',1)
row,col = img.shape[:2]
print(row , col)

#get a unique pixel ID for each pixel

pixel = ['pixel-' + str(i) for i in range(0,row*col)]
bBand = ['bBand']
gBand = ['gBand']
rBand = ['rBand']
data = pd.DataFrame(columns=[bBand,gBand,rBand],index = pixel)

#populate data for each band
b,g,r = cv2.split(img)

#each index value
indexCount = row*col
for index in range(indexCount):
    i = int(index/row)
    j = index%row
    data.loc[pixel,'bBand'] = b[i,j]
    data.loc[pixel,'gBand'] = g[i,j]
    data.loc[pixel,'rBand'] = r[i,j]

print(data.head())

是的,您那里的 for 循环可能需要很长时间。

使用 np.ravel (for a 1D view) or np.flatten (for a 1D copy) or np.flat(对于一维迭代器)将二维数组转换为序列。

此外,使用 x y 编码创建字符串索引也可能很昂贵。我会使用行号作为索引并将 x,y 计算为 row_num/row, row_num%col 或使用 x,y 的多索引,具体取决于您在计算中使用 x,y 的频率。