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

数字图像处理实验七

(图像压缩编码)

实验内容:
  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压缩再解压后的图像

效果图:数字图像处理实验七--图像压缩编码_第2张图片

问题讨论:

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

你可能感兴趣的:(数字图像处理,matlab,图像处理)