转换图像数组以用于 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 的频率。
我正在尝试对图像执行 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 的频率。