matlab对图像进行dct,基于DCT的图像压缩及Matlab实现 | 学步园

RGB=imread('C:\Users\lenovo\Desktop\1.jpg');%读取图片

RGB=imresize(RGB,[168,224]);%因为1.jpg大小为169*220,所以我改为168*224

imwrite(RGB,'C:\Users\lenovo\Desktop\start.jpg'); %保存压缩前图像

%下面是对RGB三个分量进行分离,此时他们依然为整数

R=RGB(:,:,1);

G=RGB(:,:,2);

B=RGB(:,:,3);

figure,imshow(RGB),title('原来的RGB图像');

%下面是进行测试:由压缩前.jpg,压缩后.jpg,压缩后后.jpg,压缩后后后.jpg的大小可以知道,matlab自身对图像有着压缩功能

imwrite(RGB,'C:\Users\lenovo\Desktop\压缩前.jpg'); %保存压缩前图像

%由于1.jpg和压缩前.jpg大小差距很大,从中可以看出matlab对图像进行了压缩

RGB=imread('C:\Users\lenovo\Desktop\压缩前.jpg');%读取图片

imwrite(RGB,'C:\Users\lenovo\Desktop\压缩后.jpg'); %保存压缩前图像

RGB=imread('C:\Users\lenovo\Desktop\压缩后.jpg');%读取图片

imwrite(RGB,'C:\Users\lenovo\Desktop\压缩后后.jpg'); %保存压缩前图像

RGB=imread('C:\Users\lenovo\Desktop\压缩后后.jpg');%读取图片

imwrite(RGB,'C:\Users\lenovo\Desktop\压缩后后后.jpg'); %保存压缩前图像

%测试结束

%RGB->YUV

Y=0.299*double(R)+0.587*double(G)+0.114*double(B);

U=-0.169*double(R)-0.3316*double(G)+0.5*double(B);

V=0.5*double(R)-0.4186*double(G)-0.0813*double(B);

YUV=cat(3,Y,U,V);%YUV图像

figure,imshow(uint8(YUV)),title('通过计算得到的YUV图像')

T=dctmtx(8);%产生一个8*8的DCT变换举证

%进行DCT变换 BY BU BV是double类型

BY=blkproc(Y,[8 8],'P1*x*P2',T,T');

BU=blkproc(U,[8 8],'P1*x*P2',T,T');

BV=blkproc(V,[8 8],'P1*x*P2',T,T');

a=[16 11 10 16 24 40 51 61;

12 12 14 19 26 58 60 55;

14 13 16 24 40 57 69 55;

14 17 22 29 51 87 80 62;

18 22 37 56 68 109 103 77;

24 35 55 64 81 104 113 92;

49 64 78 87 103 121 120 101;

72 92 95 98 112 100 103 99;]; %量化值

b=[17 18 24 47 99 99 99 99;

18 21 26 66 99 99 99 99;

24 26 56 99 99 99 99 99;

47 66 99 99 99 99 99 99;

99 99 99 99 99 99 99 99;

99 99 99 99 99 99 99 99;

99 99 99 99 99 99 99 99;

99 99 99 99 99 99 99 99;];

%BY2 BU2 BV2是double类型

BY2=blkproc(BY,[8 8],'x./P1',a);

BU2=blkproc(BU,[8 8],'x./P1',b);

BV2=blkproc(BV,[8 8],'x./P1',b);

%这里进行取整量化,BY3 BU3 BV3是uint8类型

BY3=int8(BY2);

BU3=int8(BU2);

BV3=int8(BV2);

%BY4 BU4 BV4是double类型

BY4=blkproc(double(BY3),[8 8],'x.*P1',a);

BU4=blkproc(double(BU3),[8 8],'x.*P1',b);

BV4=blkproc(double(BV3),[8 8],'x.*P1',b);

%测试代码

%BY4=blkproc(BY2,[8 8],'x.*P1',a);

%BU4=blkproc(BU2,[8 8],'x.*P1',b);

%BV4=blkproc(BV2,[8 8],'x.*P1',b);

mask=[

1 1 1 1 1 1 1 1;

1 1 1 1 1 1 1 1;

1 1 1 1 1 1 1 1;

1 1 1 1 1 1 1 1;

1 1 1 1 1 1 1 1;

1 1 1 1 1 1 1 1;

1 1 1 1 1 1 1 1;

1 1 1 1 1 1 1 1;];

%BY5 BU5 BV5是double类型

BY5=blkproc(BY4,[8 8],'P1.*x',mask);

BU5=blkproc(BU4,[8 8],'P1.*x',mask);

BV5=blkproc(BV4,[8 8],'P1.*x',mask);

%YI UI VI是double类型

YI=blkproc(double(BY5),[8 8],'P1*x*P2',T',T);

UI=blkproc(double(BU5),[8 8],'P1*x*P2',T',T);

VI=blkproc(double(BV5),[8 8],'P1*x*P2',T',T);

%YUVI是double类型

YUVI=cat(3,uint8(YI),uint8(UI),uint8(VI));%经过DCT变换和量化后的YUV图像

figure,imshow(YUVI),title('经过DCT变换和量化后的YUV图像');

RI=YI-0.001*UI+1.402*VI;

GI=YI-0.344*UI-0.714*VI;

BI=YI+1.772*UI+0.001*VI;

RGBI=cat(3,RI,GI,BI);%经过DCT变换和量化后的YUV图像

RGBI=uint8(RGBI);

figure,imshow(RGBI),title('经过DCT变换和量化后的RGB图像');

imwrite(RGBI,'C:\Users\lenovo\Desktop\end.jpg'); %保存压缩图像

注意:matlab本身对图像有着压缩

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以回答这个问题。DCT(离散余弦变换)是一种常用的图像压缩技术,它可以将图像转化为一组系数,通过保留其中的主要系数来实现压缩。下面是基于DCT图像压缩步骤及MATLAB实现: 1. 将图像分成8x8的块。 2. 对每个块进行DCT变换。 3. 保留每个块中重要的系数,可以通过设置一个阈值来实现。 4. 将其余系数设置为0。 5. 对每个块进行IDCT(逆离散余弦变换)。 6. 将所有块拼接成压缩后的图像。 下面是MATLAB代码实现: ```matlab % 读取图像 img = imread('lena.png'); % 将图像转化为灰度图 if size(img,3)==3 img = rgb2gray(img); end % 将图像分割成8x8的块 blocks = mat2cell(img, 8*ones(1,size(img,1)/8), 8*ones(1,size(img,2)/8)); % 对每个块进行DCT dct_blocks = cellfun(@(block) dct2(block), blocks, 'UniformOutput', false); % 保留每个块中重要的系数,将其余系数设置为0 threshold = 0.1; % 阈值 quantization_matrix = floor((1:8)./threshold); % 量化矩阵 quantization_matrix(quantization_matrix==0) = 1; % 避免除以0 quantized_blocks = cellfun(@(block) round(block./quantization_matrix), dct_blocks, 'UniformOutput', false); quantized_blocks = cellfun(@(block) block.*quantization_matrix, quantized_blocks, 'UniformOutput', false); % 对每个块进行IDCT idct_blocks = cellfun(@(block) idct2(block), quantized_blocks, 'UniformOutput', false); % 将所有块拼接成压缩后的图像 compressed_img = cell2mat(idct_blocks); % 显示压缩前后的图像 figure; subplot(1,2,1), imshow(img), title('原图像'); subplot(1,2,2), imshow(uint8(compressed_img)), title('压缩后的图像'); ``` 希望能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值