2016-04-10 10 views
0

DCTマトリックスUを使用して、生成された8x8ピクセルの白い画像に2D離散コサイン変換を適用して、画像を復元してプロットします。行列Uのimagesc()を使用したレンジエラー

計算:

N = 8; 
k = 0:N-1; 
u = 0:N-1; 
U = cos(u'*pi*(k+0.5)/N)*sqrt(2/N); 
U (1,1:N) = U(1,1:N)/sqrt(2); 

イメージX:

X = ones(8, 8, 3, 'double'); 

DCT 2D画像Xの変換:

Y(:,:,1) = U*X(:,:,1)*U'; 
Y(:,:,2) = U*X(:,:,2)*U'; 
Y(:,:,3) = U*X(:,:,3)*U'; 

復元画像:

Xr(:,:,1) = U'*Y(:,:,1)*U; 
Xr(:,:,2) = U'*Y(:,:,2)*U; 
Xr(:,:,3) = U'*Y(:,:,3)*U; 

、私がやろう:

figure; 
subplot(2, 1, 1); 
imagesc(X); 
axis off; 
title('Original image'); 

subplot(2, 1, 2); 
imagesc(Xr); 
axis off; 
title('Recovered image'); 

私は次のエラーを取得する:

Error using image 
TrueColor CData contains element out of range 0.0 <= value <= 1.0 

Error in imagesc (line 18) 
hh = image(varargin{1},'CDataMapping','scaled'); 

Error in Ejercicio1_3 (line 32) 
imagesc(Xr); 

XRをがある行列の値:

Xr(:,:,1) = 

1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 
1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 
1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 
1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 
1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 
1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 
1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 
1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 


Xr(:,:,2) = 

1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 
1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 
1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 
1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 
1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 
1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 
1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 
1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 


Xr(:,:,3) = 

1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 
1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 
1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 
1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 
1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 
1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 
1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 
1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 

なぜ私はすべての値が正しい範囲にあるときにこのエラーが発生しますか? (0.0、1.0)

+0

あなたのコードは 'Y = U * X * U 'で失敗します;' X'は3D行列です –

+0

ありがとうございます@ nirvana-msu、私は投稿を修正しました。 – Kroka

+1

fprintf( "%。17g \ n"、max(Xr(:))) 'の結果がどのようなものか教えてください。 – beaker

答えて

1

として正しく、コメントで述べた、これは、いくつかのXr値が原因機械精度の限界に1よりも大きいためである。

>> num2str(max(Xr(:)), 17) 
ans = 
1.0000000000000013 

あなたは単にプロットする前Xr値をキャップすることができます

Xr_capped = min(Xr,1); 
imagesc(Xr_capped); 
関連する問題