使用imagesc()的范围错误

时间:2016-04-10 18:41:10

标签: image matlab matrix signals

我想使用DCT矩阵U将2D离散余弦变换应用于生成的8x8像素白色图像,然后恢复并绘制图像。

矩阵U的计算:

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');

图像X的DCT 2D变换:

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)

1 个答案:

答案 0 :(得分:1)

正如评论中正确提到的那样,这是因为由于机器精度限制,某些Xr值大于1

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

您可以在绘制之前简单地限制Xr值:

Xr_capped = min(Xr,1);
imagesc(Xr_capped);