2016-04-10 24 views
0

2B Ayrık Kosinüs Dönüşümü'nü, DCT matrisi U kullanarak oluşturulmuş 8x8 piksel beyaz bir görüntüye uygulamak ve sonra görüntüyü kurtarmak ve çizim yapmak istiyorum. Matris Uimagesc kullanarak aralık hatası()

Hesaplama:

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

Resim X:

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

DCT 2D görüntü X Dönüşümü:

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

kazanılan Resim

Xr(:,:,1) = U'*Y(:,:,1)*U; 
Xr(:,:,2) = U'*Y(:,:,2)*U; 
Xr(:,:,3) = U'*Y(:,:,3)*U; 
Benim yapmaya çalıştığım Şimdi

:

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

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

aşağıdaki hatayı alıyorum:

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

Ve Xr olan matrisin değerlerini:

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 

Neden Neredeyim tüm değerler doğru aralıkta olduğunda bu hatayı aldınız mı? (0.0, 1.0)

+0

Kodunuz başarısız oluyor Y = U * X * U '; '' X' bir 3D matrisidir –

+0

Teşekkür ederim @ nirvana-msu, yazıyı düzelttim. – Kroka

+1

"fprintf ("%. 17g \ n ", max (Xr (:)))' nin sonucunun ne olduğunu söyleyebilir misiniz? – beaker

cevap

1

olarak doğru, yorum olarak bahsedilen bu, bazı Xr değerleri nedeniyle makine hassas sınırlamalara 1 daha büyük olduğu için geçerli:

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

Sadece komplo önce Xr değerleri Kapaklama:

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