如何将新图像投影到ICA空间?

时间:2016-12-13 08:02:02

标签: matlab image-processing computer-vision signal-processing

我正在使用FastICA MATLAB toolbox

我的训练图像位于tImage,其中每行是一个观察点。矩阵是30x35200,30个面部图像,具有35200个特征长度(像素)。

当我运行[icasig, A, W] = fastICA(tImage)时,输出icasig为30x35200,A为30x30,W为30x30。我所学到的是icasig是投影图像,因此无需进一步处理。

现在我正在尝试准备测试图像并将其投影到W。我的难点在于尺寸。我的测试图像是1x35200(一个图像有35200个功能)。如何在W上投影30x30?

1 个答案:

答案 0 :(得分:0)

我认为你误解了icasig矩阵是什么。

有什么输出? icasigtImage的估计独立成分, tImage的预计行数。这些类似于新投影空间的基础向量(它们不是真正的基础向量,因为它们不是正交的,但它们的行为类似于基础向量)。我们可以通过几个实验证实这一点。

首先,让我们使用A重建第一张图片。 A tImage的预计行,通常称为混合矩阵。 A列指定每个组件对每个图像的贡献量。

(我使用Face Recognition Project图片作为我的代码示例)

figure;
subplot(1, 3, 1);
imshow(reshape(tImage(1, :), 128, 128));
title('First Image');

reconstruction = A(1, :)* icasig;
subplot(1, 3, 2);
imshow(reshape(reconstruction, 128, 128));
title('Reconstructed Image');

subplot(1, 3, 3);
imagesc(reshape(abs(tImage(1, :) - reconstruction), 128, 128));
title('Difference');
colorbar;

Comparison of Reconstruction to Original

您可以在差异图像中看到重建是原始的近似版本,但对于人眼来说,两个图像看起来完全相同。

因此,您可以使用A作为tImage的低维立场。

ICA for Basis Faces

当您将icasig的行可视化为图像时,您可以看到组件。您可能已经看过Eigenface个可视化。这些图像可以被认为是ICAfaces。

这是前9的图像

ICAfaces

这些面部代表图像变化最大的特征。

投影测试图像

对于新测试图像,我们想要计算每个组件在投影中混合多少。基本上,我们想知道A矩阵中的行是什么样的。

要从A重建第一张图片,我们执行了以下操作

reconstruction = A(1, :) * icasig;

现在,测试图像的A未知,但如果我们用测试图像替换重建,我们可以使用线性求解器求解A

A_test = icasig' \ testImage'; %I had to transpose things so that the dimensions matched

figure;
subplot(1, 3, 1);
imshow(reshape(testImage, 128, 128));
title('Test Image');

reconstruction = A_test' * icasig;
subplot(1, 3, 2);
imshow(reshape(reconstruction, 128, 128));
title('Reconstructed Image');

subplot(1, 3, 3);
imagesc(reshape(abs(testImage - reconstruction), 128, 128));
title('Difference');
colorbar;

结果看起来很像原始重建结果

Test image reconstruction

我使用了mldivide线性求解器,但您也可以使用linsolve,或者您最喜欢的线性求解器。

为什么不使用简单投影?

在我的回答的第一稿中,我建议将测试图像投影到icasig。我在考虑如何做reprojection with PCA,但我不确定是否可以将相同的技术转移到ICA,因为组件不是正交的。

在一个小型实验中,结果不如使用线性求解器。这是我使用的投影代码。

A_test = icasig * testImage';
A_test = A_test ./ sqrt(sum(icasig.^2, 2));

Projection comparison

那是什么W?

我相信这用于盲源分离。这是ICA的一个非常不同的应用。我不是这种技术的专家,所以我建议在Wikipedia上阅读。在本文中,他们还使用W来指代分离或解混矩阵。

术语令人困惑,因为in PCA W经常用于组件,此处使用icasig