matlab里这段程序,dct逆变换重构图像,为啥会有横条纹出现呢?拜托各位大佬了!
程序清单:
filename = 'D:/Program Files/MATLAB/R2016b/bin/tuxiangshiyan/lena.img';
data = img_display(filename);
parameters(data);
cal_PSNR(data);
function [data]=img_display(filename) %显示图片程序
fid = fopen(filename,'r');
data = (fread(fid,[256,256],'uint8'))';
imagesc(data,[0 255]);
colormap(gray);
axis image
end
function parameters(data) %计算相关参数
[M,N] = size(data) %图像的大小
data = uint8(data);
ave = mean(mean(data)) %灰度平均值
g = imnoise(data,'salt & pepper',0.05);
imagesc(g,[0 255]);
colormap(gray);
axis image
ave2 = mean(mean(g));
I = (data-ave).*(g-ave2);
I2 = (data-ave).*(data-ave);
Cfg = mean(mean(I)) %协方差值
Cff = mean(mean(I2)) %图像的方差
SD = sqrt(Cff) %灰度标准差
Cgg = mean(mean((g-ave2).*(g-ave2)));
rfg = Cfg/sqrt(Cff*Cgg) %相关系数
end
function cal_PSNR(data)
[M,N] = size(data);
T = dctmtx(4);
data1 = im2double(data);
B = blkproc (data1,[4 4],'P1*x*P2',T,T');
mask = [1 1 1 1
1 1 1 0
1 0 0 0
0 0 0 0];
B2 = blkproc(B, [4 4], 'P1.*x',mask);
data2= blkproc(B2,[4 4],'P1.*x*P2',T',T);
figure(2);
%imshow(data2);
imagesc(data2);
colormap(gray);
axis image
PSNR = 10*log10((M*N*(255^2))/sum(sum(data2-data1)))
end