报告目录
实验四、图像复原
实验五、图像压缩及编码
一、实验目的
二、实验环境
MATLAB 2014以上版本、Win 8\10\11 系统
三、实验原理
图像的退化及复原可视作如下过程:
图像复原的目的是利用退化过程的先验知识,恢复图像原本的面目。图像复原模型可以用连续数学和离散数学处理,处理项的实现可在空间域卷积,或在频域相乘以模拟图像降质的过程,并且逆向处理退化过程以复原图像。
涉及函数:imread、figure、imshow、subplot、rgb2gray、fspecial、ifft2、abs、uint8、imfilter、
四、实验内容
(1)新建一个m文件,从桌面示例图像文件夹中读取一张彩色图像,转换为灰度图,使用fspecial函数对图像进行退化处理,结果展示在同一界面,标题分别为“原图”、“灰度图”、“退化图像”。
clc;clear;close all
I=imread('V.jpg');
subplot(131),imshow(I),title('原图')
A=rgb2gray(I);
subplot(132),imshow(A),title('灰度图')
PSF=fspecial('motion',10,20);
Blurred=imfilter(A,PSF,'circular','conv');
subplot(133),imshow(Blurred),title('退化图像')
(2)读取一张彩色图像,转换为灰度图,fspecial及imfilter函数实现多种模糊,包括运动模糊、圆盘状模糊、钝化模糊,并在一个figure窗口同时展示,标题分别为“原图”、“运动模糊”、“圆盘状模糊”、“钝化模糊”。观察模糊前后图像,及对应图像矩阵的变化。
clc;clear;close all
I=imread('V.jpg');
subplot(221),imshow(I),title('原图')
A=rgb2gray(I);
H1=fspecial('motion',10,20);
MotionBlur=imfilter(A,H1);
subplot(222),imshow(MotionBlur),title('运动模糊图像')
H2=fspecial('disk',10);
bulrred=imfilter(A,H2);
subplot(223),imshow(bulrred),title('圆盘模糊图像')
H3=fspecial('unsharp');
Sharpened=imfilter(A,H3);
subplot(224),imshow(Sharpened),title('钝化模糊图像')
(3)读取一张彩色图像并转换为灰度图,先进行一次退化,增加高斯或椒盐噪声,接着对图像进行逆滤波复原,对比变换前后图像特征。同一个figure窗口中输出,标题分别为“原图”、“退化图像”,“加噪图像”,“逆滤波复原”。
clc;clear;close all
I=imread('V.jpg');
subplot(221),imshow(I),title('原图')
A=rgb2gray(I);
[m,n]=size(A);
F=fftshift(fft2(A));
k=0.0001;
H=[];
for u =1:m
for v=1:n
q=((u-m/2)^2+(v-n/2)^2)^(5/6);
H(u,v)=exp((-k)*q);
end
end
G=F.*H;
A0=abs(ifft2(fftshift(G)));
subplot(222),imshow(uint8(A0)),title('退化图像')
B=imnoise(uint8(A0),'salt & pepper',0.04);
subplot(223),imshow(B),title('加噪图像')
F0=fftshift(fft2(B));
F1=F0./H;
A2=ifft(fftshift(F1));
subplot(224),imshow(uint8(A2)),title('逆滤波图像')
(4)读取一张彩色图像并转换为灰度图,先进行图像退化处理,接着使用deconvwnr函数进行维纳滤波复原。上述结果在同一figure中显示,标题分别为“原图”、“模糊后图像”、“恢复后图像”。
clc;clear;close all
I=imread('V.jpg');
subplot(131),imshow(I),title('原图')
A=rgb2gray(I);
PSF=fspecial('motion',10,20);
MF=imfilter(A,PSF,'circular','conv');
subplot(132),imshow(MF),title('退化图像')
wnr=deconvwnr(MF,PSF);
subplot(133),imshow(wnr),title('修复后图像')
(5)读取一张彩色图像并转换为灰度图,先进行一种模糊处理,接着使用deconvblind函数对图像进行盲去卷积滤波复原,在相同figure中输出,标题分别为“原图”、“模糊后图像”、“恢复后图像”。
clc;clear;close all
I=imread('V.jpg');
subplot(131),imshow(I),title('原图')
A=rgb2gray(I);
PSF=fspecial('motion',10,20);
Blurred=imfilter(A,PSF,'circular','conv');
INITPSF=ones(size(PSF));
subplot(132),imshow(Blurred),title('退化图像')
[J P]=deconvblind(Blurred,INITPSF,20);
subplot(133),imshow(J),title('修复后图像')
一、实验目的
二、实验环境
MATLAB 2014以上版本、Win 8\10\11 系统
三、实验原理
1.图像压缩原理
图像压缩主要目的是为了节省存储空间,增加传输速度。图像压缩的理想标准是信息丢失最少,压缩比例最大。不损失图像质量的压缩称为无损压缩,无损压缩不可能达到很高的压缩比;损失图像质量的压缩称为有损压缩,高的压缩比是以牺牲图像质量为代价的。压缩的实现方法是对图像重新进行编码,希望用更少的数据表示图像。信息的冗余量有许多种,如空间冗余,时间冗余,结构冗余,知识冗余,视觉冗余等,数据压缩实质上是减少这些冗余量。高效编码的主要方法是尽可能去除图像中的冗余成分,从而以最小的码元包含最大的图像信息。
应用在多媒体中的图像压缩编码方法,从压缩编码算法原理上可以分为以下3类:
(1)无损压缩编码种类
哈夫曼(Huffman)编码,算术编码,行程(RLE)编码,Lempel zev编码。
(2)有损压缩编码种类
预测编码,DPCM,运动补偿;
频率域方法:正交变换编码(如DCT),子带编码;
空间域方法:统计分块编码;
模型方法:分形编码,模型基编码;
基于重要性:滤波,子采样,比特分配,向量量化;
混合编码。
有JBIG,H261,JPEG,MPEG等技术标准。
涉及函数:imread、figure、imshow、subplot、rgb2gray、imwrite、imfinfo、huffmandeco、dctmtx、uint8、wcodemat
四、实验内容
(1)新建一个m文件,从桌面示例图像文件夹中读取一张彩色图像,转换为灰度图,使用imfinfo函数对读取图像属性信息,并计算图像的压缩比。
clc;clear;clear all;
% 读取图像并转换为灰度图像
img = imread('V.jpg');
gray_img = rgb2gray(img);
% 使用 imfinfo 函数获取图像属性信息
info = imfinfo('V.jpg');
width = info.Width;
height = info.Height;
bit_depth = info.BitDepth;
% 计算图像的压缩比
original_size = width * height * bit_depth;
compressed_size = numel(gray_img) * 8;
compression_ratio = original_size / compressed_size;
% 显示压缩比
fprintf('压缩比: %.2f\n', compression_ratio);
(2)读取一张彩色图像,转换为灰度图,使用dct2函数执行二维DCT变换,接着使用idct2重构图像,定义归一化标准K将重构结果进行归一化,上述结果在一个figure窗口同时展示,标题分别为“原图”、“灰度图像”、“二维DCT变换”、“重构图像”。观察二维DCT变换及归一化前后图像,及对应图像矩阵的变化。
clc;clear;close all;
I=imread('V.jpg');
figure
subplot(221),imshow(I),title('原图像')
J=rgb2gray(I);
subplot(222),imshow(J),title('灰度图')
K=dct2(J);
subplot(223),imshow(log(abs(K)),[]),colormap(jet(64)),colorbar
title('二维DCT变换')
K(abs(K)<10)=0;
L=idct2(K);
subplot(224),imshow(L,[0,255]),title('重构图像')
(3)读取一张彩色图像并转换为灰度图,使用dctmtx函数先产生二维DCT变换矩阵,后利用DCT变换对图像进行压缩,结果在同一个figure窗口中输出,标题分别为“原图”、“压缩图像”,对比压缩前后的图像矩阵变化。
clear
close all
clc%清理Matlab窗口
A=imread('V.jpg');%读取图像x.jpg(引号内是图像在计算机内的存储路径)
I=rgb2gray(A);%RGB图像转灰度图像
I=im2double(I);
T=dctmtx(8);%得到一个8*8的离散余弦变化矩阵
B=blkproc(I,[8 8],'P1*x*P2',T,T');
%x是每一个分成的8*8大小的块
%P1*x*P2相当于像素块的处理函数
%p1=T,p2=T’,fun=p1*x*p2'=T*x*T'是进行离散余弦变换
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个系数
B2=blkproc(B,[8 8],'P1.*x',m);%舍弃每个块中的高频系数,达到图像压缩的目的
I2=blkproc(B2,[8 8],'P1*x*P2',T',T);%进行反余弦变换,得到压缩后的图象
miss=abs(I-I2);
figure(1);
subplot(1,2,1);
imshow(I),title('原始图像');
subplot(1,2,2);
imshow(I2),title('压缩(解压缩)图像(3个系数)');
(4)读取一张彩色图像并转换为灰度图,使用huffmandict函数进行Huffman编码。上述结果在同一figure中显示,标题分别为“原图”、“Huffman处理后图像”。
clc;clear;close all
I=imread('V.jpg');
GrayI=rgb2gray(I);
[M,N]=size(GrayI);
subplot(121),imshow(I),title('原图像')
GrayI=GrayI(:);
s=0:255;
for i=0:255
p(i+1)=length(find(GrayI==i))/(M*N);
end
dict=huffmandict(s,p);
enco=huffmanenco(GrayI,dict);
deco=huffmandeco(enco,dict);
deco=col2im(deco,[M,N],[M,N],'distinct');
subplot(122),imshow(uint8(deco)),title('哈夫曼处理后的图像')
(5)读取一张彩色图像并转换为灰度图,利用小波变化的时频局部化特性对图形进行压缩。(拓展:利用该思路加水印)
clc; clear;close all;
data =imread('V.jpg');
data=rgb2gray(data); whos('data');
figure; imshow(data);
title('原始图像');
% 小波分解
[c,s]=wavedec2(data,2,'sym3');
cA1=appcoef2(c,s,'sym3',1);%尺度1的低频系数
cA2=appcoef2(c,s,'sym3',2);%尺度2的低频系数
[cH1,cV1,cD1]=detcoef2('all',c,s,1);%尺度1的所有方向的高频系数H水平,V垂直,D对角
[cH2,cV2,cD2]=detcoef2('all',c,s,2);%尺度2的所有方向的高频系数
% wrcoef2 Reconstruct single branch from 2-D wavelet coefficients.
figure;
subplot(3,3,1); imshow(uint8(cA1));title('尺度1的低频系数图像'); %uint8的范围是0-255,转换
subplot(3,3,2); imshow(uint8(cA2));title('尺度2的低频系数图像');
subplot(3,3,4); imshow(uint8(cH1));title('尺度1水平方向高频系数图');
subplot(3,3,5); imshow(uint8(cV1));title('尺度1垂直方向');
subplot(3,3,6); imshow(uint8(cD1));title('尺度1斜线方向');
subplot(3,3,7); imshow(uint8(cH2));title('尺度2水平方向高频系数图');
subplot(3,3,8); imshow(uint8(cV2));title('尺度2垂直方向');
subplot(3,3,9); imshow(uint8(cD2));title('尺度2斜线方向');
%进行图像压缩
%第一层
cA1=wcodemat(cA1,192,'mat',0); %对矩阵进行量化编码
figure; subplot(121);
imshow(cA1,[]); %将指定范围的灰度值变换到0-255区间显示
title('第一次压缩图像');
%第二层
cA2=wcodemat(cA2,192,'mat',0);
subplot(122); imshow(cA2,[]);
title('第二次压缩图像');
cA1=uint8(cA1);
cA2=uint8(cA2);
disp('第一次压缩后图像的大小:'); whos('cA1');
disp('第二次压缩后图像的大小:'); whos('cA2');