我正在一组生成的图像之间实现PCA,并使用所选的主成分来抑制图像的背景。我已经在MATLAB中实现了这一点并且收到了我期望的结果。但是当我在Python中实现它时,我的结果却大不相同。过程如下,我首先生成我的图像数据集,在数据集上执行PCA,计算并从数据集中的图像中减去背景,然后重塑我的数据集并将我的结果与原始数据进行比较。下面是我在原始数据集上执行PCA的功能。
def pca_images(total_images, count, size, num_pcs):
flat_images = np.empty([count, size*size])
# unravel structure of the image
for i in range(0,count):
flat_images[i] = np.ravel(total_images[i])
# calculate covariance matrix
cov_mat = np.cov(flat_images.T)
# eigenvectors and eigenvalues of the covariance matrix
eig_val_cov, eig_vec_cov = np.linalg.eig(cov_mat)
# sort the (eigenvalue, eigenvector) lists from low to high
inds = eig_val_cov.argsort()
# flip around and sort eigenvectors high to low
eig_vec_cov = eig_vec_cov[inds[::-1]]
# take num_pcs number of eigenvectors
components = eig_vec_cov[:,0:num_pcs]
# create list to store background for each image
bg = []
# find principal components
for i in range(0,count):
bg.append(np.dot(np.dot(components.T,flat_images[i]),components.T))
# allocate array to hold filtered images
images_suppressed = []
# filter out background from each image and store
for i in range(0,count):
images_suppressed.append(flat_images[i] - bg[i])
return images_suppressed
当我将其与我的MATLAB代码进行比较时,差异似乎发生在bg
函数中的pca_images
矩阵中。在MATLAB中,此矩阵仅包含实数值,但在Python中,它包含实数和复数值。在MATLAB中,结果显示images_suppressed
像素都小于原始图像像素值,因为从原始图像中减去bg
值。然而在Python中,我的一些images_suppressed
值比原始图像像素值大,尽管减法并且这导致实际上将噪声添加到我的图像中。用于查找bg
矩阵的MATLAB代码如下:
%// CALCULATE THE COVARIANCE MATRIX BETWEEN ALL IMAGES
total_cov = cov(total);
%// FIND THE 6 LARGEST MAGNITUDE EIGENVALUES
[V,D] = eigs(total_cov);
%// FIND PRINCIPAL COMPONENTS AND REMOVE BACKGROUND
proc_total = total;
v = V(:,1:m)'; %'// TAKE TOP M EIGENVECTORS
for i=1:m
z = proc_total(i,:); %// TAKE ORIGINAL DATA
[size(v), size(z')] %'// VERIFY SIZES FOR MULTIPLICATION
bg = v * z'; %'// FIND PRINCIPAL COMPONENT
[size(bg'), size(v)] %'// VERIFY SIZES FOR MULTIPLICATION
bg = bg' * v; %'
proc_total(i,:) = proc_total(i,:) - bg; %// REMOVE BACKGROUND FROM ORIGINAL DATA
end
%// RESHAPE IMAGE 1
image_final = reshape(proc_total(1,:),n,n);
我知道这个问题与这个bg
矩阵有关,我还没有找到任何可以解释为什么我的特征向量与原始数据集的乘法在MATLAB中给出不同结果的原因和Python。任何人都可以向我解释为什么会发生这种情况吗?