数字图像处理实验七--图像压缩编码

数字图像处理实验七

(图像压缩编码)

实验内容:
  1. 基于游程编码的图像压缩
  2. 基于离散余弦变换的图像压缩
实验步骤:
  1. 使用给定的图像lena做实验,采用im2bw把灰度图像转换为二值图像,试计算二值化时阈值分别取0.2,0.4,0.6的压缩比是多少?
//以二值化时阈值去0.4为例
I = imread('lena.jpg');
BW = im2bw(I,0.4);%将图像二值化
[zipped,info] = RLEencode(BW);%调用RLEencode对BW进行游程编码
unzipped = RLEdecode(zipped,info);%调用RLEencode函数对zipped进行游程解码
figure();
subplot(1,3,1);imshow(I);
xlabel("原始图像");
subplot(1,3,2);imshow(BW);xlabel("二值化(阈值0.4)后的图像");
subplot(1,3,3);imshow(uint8(unzipped)*255);
xlabel("二值图像经编解码之后的图像");
cr = info.ratio %显示压缩比
fprintf('cr = %8.5f\n',cr)%打印压缩比
whos BW unzipped zipped %显示二值图像,压缩解压图像、压缩图像的信息

function [zipped,info] = RLEencode(vector)
[m,n] = size(vector);%获取图像的高度和宽度
vector = uint8(vector(:));%转换成整型
L = length(vector)%获得元素个数
c = vector(1);
e(1,1)=double(c);%游程矩阵第一列为值
e(1,2)=0;%游程矩阵第二列为游程长度
t1 = 1;%游程矩阵行下标变量
for j=1:L %对图像所有元素进行循环处理
    if (vector(j)==c)%如果值不变
        e(t1,2)=double(e(t1,2))+1;%将游程长度加1
    else
        c = vector(j);%记录新的值
        t1 = t1+1;%游程矩阵行下标变量+1
        e(t1,1)=double(c);%游程矩阵新一行第一列的值
        e(t1,2)=1;%游程矩阵新一行第二列的值
    end
end
zipped=e;
info.rows = m;info.cols = n;
[m,n] = size(e);%获取游程矩阵的高度和宽度
info.ratio = (info.rows*info.cols)/(m*n);%显示压缩比
end

function unzipped = RLEdecode(zip,info)
[m,n] = size(zip);
unzipped=[];
for i = 1:m
    section = repmat(uint8(zip(i,1)),1,zip(i,2));%将第i行复制还原
    unzipped=[unzipped section];%与矩阵前面部分进行拼接
end
unzipped=reshape(unzipped,info.rows,info.cols);%按原始图像形式重排矩阵
end

效果图:1
2.以所给lena图像为例,采用dct进行图像压缩编码,参考教材159页的程序,其中模板矩阵mask分别设置为

mask = [1 1 1 1 1 0 0 0;1 1 1 1 0 0 0 0;1 1 1 0 0 0 0 0;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],

mask = [1 1 1 1 0 0 0 0;1 1 1 0 0 0 0 0;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],

mask = [1 1 1 0 0 0 0 0;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],

可以得到不同的压缩编码图像,

根据公式公式
,编写程序计算原图像和上述三种模板下得到不同的压缩编码图像之间的均方误差。

//mask = [1 1 1 1 1 0 0 0;1 1 1 1 0 0 0 0;1 1 1 0 0 0 0 0;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],为例
I = imread("lena.jpg")%读取图像
I = im2double(I); %转换成double型
T = dctmtx(8);
B = blkproc(I,[8 8],'P1*x*P2',T,T');%对原始图像分块进行DCT变换
mask = [1 1 1 1 1 0 0 0;
    1 1 1 1 0 0 0 0;
    1 1 1 0 0 0 0 0;
    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]
B2=blkproc(B,[8 8],'P1.*x',mask);%数据压缩,丢弃右下角高频数据
I2=blkproc(B2,[8 8],'P1*x*P2',T',T);%进行DCT反变换,得到压缩后的图像
figure();
subplot(1,2,1);imshow(I);%显示原始图像
title("实验人-谷傲雷");xlabel('原始图像');
subplot(1,2,2);
imshow(I2)
xlabel('经过压缩解压后的图像');%显示经过DCT压缩再解压后的图像

mask = [1 1 1 1 0 0 0 0;1 1 1 0 0 0 0 0;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],
I = imread("lena.jpg")%读取图像
I = im2double(I); %转换成double型
T = dctmtx(8);
B = blkproc(I,[8 8],'P1*x*P2',T,T');%对原始图像分块进行DCT变换
mask = [1 1 1 1 0 0 0 0;
    1 1 1 0 0 0 0 0;
    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]
B2=blkproc(B,[8 8],'P1.*x',mask);%数据压缩,丢弃右下角高频数据
I2=blkproc(B2,[8 8],'P1*x*P2',T',T);%进行DCT反变换,得到压缩后的图像
figure();
subplot(1,2,1);imshow(I);%显示原始图像
xlabel('原始图像');
subplot(1,2,2);
imshow(I2)
xlabel('经过压缩解压后的图像');%显示经过DCT压缩再解压后的图像

效果图:在这里插入图片描述

问题讨论:

图像中具有相同颜色的横向色块越大、图像块数目越多,压缩比就越大,反之就越小。如果图像中有大量纵向色块,则可以先把图像旋转90°,再用RLC压缩,也可以得到较大的压缩比。

  • 9
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值