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

3 ビュー (過去 30 日間)
Kwang-Eun Kim
Kwang-Eun Kim 2024 年 1 月 5 日
コメント済み: Kwang-Eun Kim 2024 年 1 月 8 日
아래와 같이 했을 때 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 Center および File Exchange초분광 영상 처리 についてさらに検索

Community Treasure Hunt

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

Start Hunting!