DCT压缩图片代码错误

close all
clc
clear
A=imread('tupian.jpg');%读取图像x.jpg
I=rgb2gray(A);%RGB图像转灰度图像
I=im2double(I);
T=dctmtx(8);%得到一个8*8的离散余弦变化矩阵
m=[1 1 0 0 0 0 0 0
   1 0 0 0 0 0 0 0
   0 0 0 0 0 0 0 0
   0 0 0 0 0 0 0 0
   0 0 0 0 0 0 0 0
   0 0 0 0 0 0 0 0
   0 0 0 0 0 0 0 0
   0 0 0 0 0 0 0 0];%保留左上角3个系数
fun = @(blk_struct) T*blk_struct.data*T.*m';
B=blockproc(I,[8 8],fun);
fun2 = @(block_struct) T'*block_struct.data*T;
I2=blockproc(B0,[8 8],fun2);%进行反余弦变换,得到压缩后的图象
figure;
subplot(1,2,1)
imshow(I),title('原始图像','Fontsize',18);
subplot(1,2,2);
imshow(I2),title('压缩还原图像(3个系数)','Fontsize',18);

这串代码应该怎么改?显示我的矩阵乘法的维度不正确

19行的B0应该是B,写错了

【以下回答由 GPT 生成】

代码中有几个错误导致无法成功使用DCT压缩图像。首先,变量B0在进行反余弦变换时未定义。应该将其更正为B。其次,在反余弦变换的代码中,应该将I2 = blockproc(B0,[8 8],fun2);更正为I2 = blockproc(B,[8 8],fun2);。此外,还可以添加一些改进来提高代码的性能和可读性。例如,在定义funfun2的匿名函数时,可以使用元素乘法运算符.,并使用blk_struct.data替代block_struct.data

修正后的代码如下所示:

close all
clc
clear
A = imread('tupian.jpg');%读取图像x.jpg
I = rgb2gray(A);%RGB图像转灰度图像
I = im2double(I);
T = dctmtx(8);%得到一个8*8的离散余弦变化矩阵
m = [1 1 0 0 0 0 0 0
   1 0 0 0 0 0 0 0
   0 0 0 0 0 0 0 0
   0 0 0 0 0 0 0 0
   0 0 0 0 0 0 0 0
   0 0 0 0 0 0 0 0
   0 0 0 0 0 0 0 0
   0 0 0 0 0 0 0 0];%保留左上角3个系数
fun = @(blk_struct) T * blk_struct.data * T .* m;
B = blockproc(I, [8 8], fun);
fun2 = @(block_struct) T' * block_struct.data * T;
I2 = blockproc(B, [8 8], fun2);%进行反余弦变换,得到压缩后的图像
figure;
subplot(1,2,1)
imshow(I), title('原始图像', 'Fontsize', 18);
subplot(1,2,2)
imshow(I2), title('压缩后的图像', 'Fontsize', 18);

这些改进将有助于修复问题并提高代码的可读性和性能。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^