hypermnf, hyperpca 실행시 리턴된 coeff 값으로 입력행렬을 변환해보면 함께 리턴된 변환 행렬값이 나오지 않음.

2 次查看(过去 30 天)
아래와 같이 했을 때 image_MNF와 data_MNF가 완전히 서로 다른 값이 됨. hyperpca도 마찬가지임.
[image_MNF, coeff_MNF] = hypermnf(image, nBand);
Data_2D = reshape(image, nSample, nBand); %nSample = nRow*nCol
data_MNF = coeff_MNF*data_2D;
data_MNF = reshape(data_MNF, nRow, nCol, nBand);

采纳的回答

Angelo Yeo
Angelo Yeo 2024-1-6
안녕하세요.
아래와 같은 과정에서 hypermnf 함수를 통해 얻은 일부 PC만으로부터 복원 할 수 있는 것으로 확인됩니다. 다만 PCA에서와 마찬가지로 일부 PC로 복원한 데이터는 데이터 손실이 있을 수 밖에 없습니다.
% Ran in R2023b
clear
hcube = hypercube('indian_pines.dat');
nBand = 10;
[outputDataCube,coeff] = hypermnf(hcube,nBand);
nWavelength = length(hcube.Wavelength);
[nRow, nCol, ~] = size(outputDataCube);
outputDataCube_r = reshape(outputDataCube, nRow * nCol, nBand);
DataCube_r = reshape(coeff*outputDataCube_r', nWavelength, nRow, nCol);
DataCube_r = permute(DataCube_r, [2,3,1]);
figure
montage(hcube.DataCube(:,:,1:10),'BorderSize',[10 10],'Size',[2 5],'DisplayRange',[]);
title('First 10 Spectral Band Images (Original)')
figure
montage(DataCube_r(:,:,1:10),'BorderSize',[10 10],'Size',[2 5],'DisplayRange',[]);
title('First 10 Spectral Band Images (Reconstructed)')
아래는 original data 입니다.
아래는 10개 PC 만으로부터 복원한 데이터입니다.
만약 위와 같은 답변으로 문제를 해결할 수 없다고 판단하신다면 정확한 원인 및 해결책을 찾기 위해서 아래와 같은 추가 정보가 필요할 것으로 생각됩니다. 아래의 정보를 추가해주신다면 저를 포함한 다른 분들께서 더 효과적으로 도움드릴 수 있을 것이라 생각합니다.
1) 문제 상황에 대한 자세한 기술
2) 문제 재현이 가능한 예제 파일과 데이터 파일 (MATLAB Answers의 페이퍼 클립 버튼을 이용해 파일을 첨부할 수 있습니다.)
3) 보내주신 파일로 동일한 문제를 재현하기 위한 정확한 과정
4) 문제 발생 시 매트랩 창의 에러 메시지를 포함하여 나타나는 모든 에러 메시지
  6 个评论
Angelo Yeo
Angelo Yeo 2024-1-8
제가 Hyper MNF와 Hyper PCA에 대해서는 잘 모르지만 PCA 의 과정을 생각해보면 PCA 과정에서는 covariance 계산을 위해 원래 행렬의 열 평균값들을 모든 열에서 빼줍니다. 여기서도 마찬가지인 것으로 보입니다. 220개의 모든 밴드에서 hypermnf를 수행하여 얻은 결과에 모든 열의 평균값들을 다시 더해 복원해주면 원래의 행렬과 거의 유사한 행렬의 값을 얻을 수 있습니다.
clear
hcube = hypercube('indian_pines.dat');
nBand = 220;
[outputDataCube,coeff] = hypermnf(hcube,nBand);
nWavelength = length(hcube.Wavelength);
[nRow, nCol, ~] = size(outputDataCube);
outputDataCube_r = reshape(outputDataCube, nRow * nCol, nBand);
DataCube_r = reshape(coeff*outputDataCube_r', nWavelength, nRow, nCol);
DataCube_r = permute(DataCube_r, [2,3,1]);
figure
montage(hcube.DataCube(:,:,1:10),'BorderSize',[10 10],'Size',[2 5],'DisplayRange',[]);
title('First 10 Spectral Band Images (Original)')
figure
montage(DataCube_r(:,:,1:10),'BorderSize',[10 10],'Size',[2 5],'DisplayRange',[]);
title('First 10 Spectral Band Images (Reconstructed)')
%% Comparison
A = hcube.DataCube(:,:,1);
B = DataCube_r(:,:,1) + repmat(mean(A, 1), 145, 1);
figure;
plot(A(:,1));
hold on;
plot(B(:,1));
legend('Original Band#1', 'Reconstructed Band#1')
grid on;
Kwang-Eun Kim
Kwang-Eun Kim 2024-1-8
감사합니다! zero-mean이 아니라는 것을 깜빡했네요. 해결되었습니다~

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 초분광 영상 처리 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!