我尝试对图像执行PCA,然后输出基于其在PCA中落入的群集的彩色像素的图像。我正在做无监督的PCA。最终目标可见于此链接:Forward PC rotation
我目前正在使用pandas库(如果人们还有其他更优雅的解决方案,我很耳熟),并且愿意进行图像处理。
我正在尝试加载b,g,r波段作为我的列,索引是一个像素,该像素给出一个表,其中包含图像中所有像素的行(每个列都有一个色带列)。
当填充数据时,我最终在图像中拥有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())
答案 0 :(得分:1)
是的,在那里的for循环可能需要很长时间。
使用np.ravel(用于1D视图)或np.flatten(用于1D副本)或np.flat(用于1D迭代器)将2d数组转换为序列。
此外,创建编码为x y的字符串索引也可能很昂贵。我要么将行号用作索引,然后将x,y
计算为row_num/row, row_num%col
,要么使用x,y的多重索引,具体取决于您在计算中使用x,y的频率。