南京邮电大学管理信息系统实验报告



 

第二篇:南邮08级图像实验报告

通信与信息工程学院

20##/20##学年第一学期

实 验 报 告

实验课程名称   数字图像处理与图像通信实验

专       业      电子信息工程   

学 生 学 号        B08020425   

学 生 姓 名         席与曦      

指 导 教 师         刘  瑜      

指 导 单 位    图像与广播电视系 

日 期: 20## 年9 月 6 日

==============================================================================

实验名称:图像的锐化处理

一、实验目的:

学习用锐化处理技术来加强图像的目标边界和图像细节。对图像进行梯度算子、Roberts算子、Sobel算子边缘检测处理和Laplace算子边缘增强处理,是图像的某些特征(如边缘、轮廓等)得以进一步的增强及突出。

二、实验内容:

(1) 编写梯度算子和Roberts算子滤波函数。

(2) 编写Sobel算子滤波函数。

(3) 编写拉普拉斯边缘增强滤波函数。

三、实验方法及编程:

        在实验中,我们对于这三种算子的算法,都有其各自对应的模板,根据这个模板我们可以方便地编写出程序的主体结构。指导书中也有对应的流程框图可供参考,以下是程序的主体部分:

function  newbuf=RobFilter(oldbuf,M,N);

% ************************************************************************

% 函数名称:                    

%    RobFilter()         

% 说明:

%    ‘Robert梯度’滤波算法。                  

% ************************************************************************

for i=1:M-1

for j=1:N-1

newbuf(i,j)=abs(oldbuf(i,j)-oldbuf(i+1,j+1))+abs(oldbuf(i+1,j)-

oldbuf(i,j+1));

end

end  

%-------------------------------------------------------------------------

function  newbuf=SobFilter(oldbuf,M,N);

% ************************************************************************

% 函数名称:                   

%    SobFilter()        

% 说明:

%    ‘Sobel’滤波算法。                   

% ************************************************************************

for i=2:M-1

for j=2:N-1              

sx=oldbuf(i+1,j-1)+2*oldbuf(i+1,j)+oldbuf(i+1,j+1)-

oldbuf(i-1,j-1)-2*oldbuf(i-1,j)-oldbuf(i-1,j+1);

          sy=oldbuf(i-1,j+1)+2*oldbuf(i,j+1)+oldbuf(i+1,j+1)-

oldbuf(i-1,j-1)-2*oldbuf(i,j-1)-oldbuf(i+1,j-1);

newbuf(i,j)=abs(sx)+abs(sy);

     end

end   

%-------------------------------------------------------------------------

function  newbuf=LapFilter(oldbuf,M,N);

% ************************************************************************

% 函数名称:                   

%    LapFilter()        

% 说明:

%    ‘Laplace’滤波算法。                  

% ************************************************************************

for i=2:M-1

for j=2:N-1

              newbuf(i,j)=5*oldbuf(i,j)-oldbuf(i-1,j)-oldbuf(i+1,j)-

oldbuf(i,j-1)-oldbuf(i,j+1);

      end

end

%-------------------------------------------------------------------------

四、实验结果及分析:(原图像和处理后的图像比较及分析)

从上面的图像可以看出:

Robert梯度算子得出的图像能够得出原图的大部分边缘细节,灰度差别越大的地方结果越大,所以显示时较为明亮。一些边缘由于灰度差值较小,在得出的结果图像中不容易分辨出来。

Sobel算子得出的图像则显得明亮而粗壮。所有的边缘细节均被显示出来,特别是人物面部。由于其结果粗壮,面部细节显得非常密集。

Laplace算子则用以将图像的边缘、细节增强,通过结果结果可以看出,图像的细节明显比原来突出。但是这个方法存在的弊端是,在背景区域,结果图像中有一些噪声的图样也被加强了。

日 期: 20## 年9 月 13 日

==============================================================================

实验名称:图像信号的数字化

一、实验目的:

通过本实验了解图像的数字化参数取样频率(像素个数)、量化级数与图像质量的关系。

二、实验内容:

(1) 编写并调试图像数字化程序。要求参数kN可调。其中,k为亚抽样比例,N为量化比特数。

(2) 可选任意图像进行处理,在显示器上观察各种数字化参数组合下的图像效果。

三、实验方法及编程:

    在数字系统中进行处理、传输和存储图像,必须把代表图像的连续信号转变为离散信号,这种变换过程称为图像信号的数字化。它包括采样和量化两种处理。本实验对数字图像进行再采样和再量化,以考察人眼对数字图像的分辨率和灰度级的敏感程度。

function newbuf=Sample_Quant(oldbuf,k,n)%

% ************************************************************************

% 函数名称:

%    Sample_Quant()    图像数字化算法函数

% 参数:

%   oldbuf             原图像数组

%   M N                原图像尺寸

%    k                 取样间隔

%    n                 量化比特值

%   newbuf            存放处理后的图像二维数组

% 说明:

%    在水平和垂直方向作1:k取样,得到新的取样图像,再根据量化公式对每个像

% 素分别取n 比特量化,为了观察显示的需要,再按k:1的比例将再取样的图像还原

% 为原图像尺寸。最后放入新的图像数组中并返回该数组。

% ************************************************************************

[M,N]=size(oldbuf);

oldbuf=double(oldbuf);

x=1;y=1;

while x<M

    while y<N

        new=(round(oldbuf(x,y)/(2^(8-n))))*(2^(8-n));

        for i=0:k-1

            for j=0:k-1

                if(x+i<M)&(y+j<N)

                    newbuf(x+i,y+j)=uint8(new);

                end

            end

        end

        y=y+k;

    end

    if y>=N

        y=1;

    end

    x=x+k;

end

%-------------------------------------------------------------------------

四、实验结果及分析:(原图像和处理后的图像比较及分析)

由实验结果可以看出,亚抽样比例k和量化比特数N对都会使图像变得模糊,但两者的影响是不相同的。

亚抽样比例k的大小决定了数字化图像的方块效应是否明显。当k较大时,数字化图像会有较为明显的块状出现,对于图像的视觉效果影响很大。

量化比特数N则决定了图像的灰度级,量化比特数为N时,图像有个2N灰度级。所以当N较小时,图像会出现不规则的区域有着相同的灰度值的情况,但是这些区域在原图像中却有着差别较小的不同的灰度值。特别是在原图的灰度渐变的区域,这种效应会变得尤为明显。

日 期: 20## 年9 月 20 日

==============================================================================

实验名称:图像灰度级修正

一、实验目的:

掌握常用的图像灰度级修正方法,即图像的灰度变换法和直方图均衡化法,加深对灰度直方图的理解。

二、实验内容:

(1) 编程实现图像的灰度变换。改变图像输入、输出映射的灰度参数范围(拉伸和反比),观看图像处理结果。

(2) 修改可选参数gamma值,使其大于1,等于1和小于1,观看图像处理结果。

(3) 对图像直方图均衡化处理,显示均衡前后的直方图和图像。

实验图像选用hor256或vax256。

三、实验方法及编程:

图像增强常用到三种基本方式,分别为1线性2对数3幂次。

线性变换的公式可表示为

幂次变换的公式:

function newbuf=GrayTransf(oldbuf)

% ************************************************************************

% 函数名称:                   

%    GrayTransf()      灰度变换函数

% 参数:

%   oldbuf             原图像数组

%   newbuf             存放处理后的图像二维数组

% 说明:

%  可以任意指定输入图像需要映射的灰度范围和指定输出图像所在的灰度范围。还可接

% 受一个可选的参数来指定修正因素r。                

% ************************************************************************

[M,N]=size(oldbuf);

newbuf=imadjust(oldbuf,stretchlim(oldbuf),[]);

newbuf=uint8(newbuf);

%-------------------------------------------------------------------------

function newbuf=GrayGamma(oldbuf,r)

% ************************************************************************

% 函数名称:                   

%    GrayGamma()      gamma校正函数

% 参数:

%   r                  gamma校正值

%   oldbuf             原图像数组

%   newbuf             存放处理后的图像二维数组

% 说明:  

%  图像获取、打印和显示的各种装置是根据幂次规律进行响应的。习惯上,幂次等式中

%  的指数是指伽马值.用于修正幂次响应现象的过程称作伽马校正。

%  imadjust()函数还可接受一个可选的参数来指定修正因素r(也称gamma校正值)。

%  根据r值的不同,输入图像与输出图像间的映射可能是非线性的。              

% ************************************************************************

newbuf=imadjust(oldbuf,stretchlim(oldbuf),[],r);

newbuf=uint8(newbuf);

%-------------------------------------------------------------------------

function newbuf=GrayEqualize(oldbuf)

% ************************************************************************

% 函数名称:                   

%    GrayEqualize()   直方图均衡算法函数

% 参数:

%   oldbuf             原图像数组

%   newbuf             存放处理后的图像二维数组

% 说明:

% 对oldbuf的原图像数据进行灰度统计,然后计算每一个K所对应的S值,求出对照

% 表S(k),最后以原图像灰度值K作为地址,对每一象素进行变换,得出均衡化以后的

% 新图像存放在newbuf中。

% ************************************************************************

[M,N]=size(oldbuf);

NN=M*N;sk=0;

[COUNTS,X]=imhist(oldbuf,256);

for i=1:M

    for j=1:N

        kk=double(oldbuf(i,j));

        for k=1:kk

            sk=sk+COUNTS(k);

        end

        sk=sk/NN*256;

        newbuf(i,j)=sk;

    end

end

newbuf=uint8(newbuf);

%-------------------------------------------------------------------------

四、实验结果及分析:(原图像和处理后的图像比较及分析)

由实验结果可以看出,所选的测试图像的灰度值主要分布于低值的部分。

经过无gamma值的灰度值变换后,直观地看出:分布于低值部分的直方图分散开来,分布于几乎所有的灰度值,但是对映于各个灰度值的像素个数分布仍是不均匀的。变换后的图像比原图显得明亮、清晰。

经过第二第三幅图像可以进一步看出:gamma值的灰度值变换则明显受gamma值的影响:当gamma值大于1时,直方图有向灰度为0的一端压缩的趋势,gamma越大,这种趋势越明显。此时的图像比原图清晰,但是原本偏暗的部分更加偏黑,原本较亮的部分则变得发白,总体而言,图像偏暗的部分较多。当gamma值小于1时,其趋势与gamma值大于1相反,故整个图像显得发白。

直方图均衡后的图像也显得较为清晰、均匀。它能尽量将直方图变得均衡,分布也更为均匀,各个灰度值所对应的像素个数尽可能相同。

日 期: 20## 年9 月 27 日

==============================================================================

实验名称:图像的平滑滤波

一、实验目的:

图像平滑主要目的是减少噪声对图像的影响。噪声有很多种类,不同的噪声有不同的抑制措施。本实验要求用平滑线性滤波和中值滤波两种最典型、最常用的处理算法进行程序设计,学习如何对已被污染的图像进行“净化”。通过平滑处理,对结果图像加以比较,得出自己的实验结论。

二、实验内容:

(1) 编写并调试窗口尺寸为m×n的平滑滤波函数。

(2) 编写并调试窗口尺寸为m×n的中值滤波函数。

三、实验方法及编程:

在M*N的图像f上,用m*n大小的滤波器模板进行线性滤波由这个公式给出:

function  newbuf=AverageFilter(oldbuf,M,N,m)

% ************************************************************************

% 函数名称:  

%    AverageFilter()   均值滤波算法函数

% 参数:

%    oldbuf             噪声图像数组

%    M N                噪声图像尺寸

%    m                  矩形平滑窗口尺寸

%    newbuf            存放处理后的图像二维数组

% 说明:

% 用m*m的滤波器模板对oldbuf数组的噪声图像进行线性滤波,即用窗口内m*m个像

% 素的平均灰度值来代替图像每个像素点的值,最后结果存放在newbuf数组中。                                 

% ************************************************************************

oldbuf=double(oldbuf);

newbuf=zeros(M,N);

for i=(m+1)/2:M-(m+1)/2

    for j=(m+1)/2:N-(m+1)/2

        for x=-(m-1)/2:(m-1)/2;

            for y=-(m-1)/2:(m-1)/2;

                newbuf(i,j)=newbuf(i,j)+oldbuf(i+x,j+y)/(m*m);

            end

        end

    end

end

%-------------------------------------------------------------------------

function newbuf=MedianFilter(oldbuf,M,N,m)

% ************************************************************************

% 函数名称:

%    MedianFilter()     中值滤波算法函数

% 参数:

%    oldbuf             原图像数组

%    M N                原图像尺度

%    m                  滑动窗口尺寸   

%    newbuf            存放处理后的图像数组

% 说明:

% 把oldbuf数组m*m窗口内的象素值赋给winbuf,然后调用排队函数SeekMid( ),

% 把该函数在窗口中找到的中值放到newbuf数组中。        

% ************************************************************************

for i=(m+1)/2:M-(m+1)/2

    for j=(m+1)/2:N-(m+1)/2

        k=1;

        for x=-(m-1)/2:(m-1)/2;

            for y=-(m-1)/2:(m-1)/2;

                winbuf(k)=oldbuf(i+x,j+y);

                k=k+1;

            end

        end

        newbuf(i,j)=SeekMid(winbuf,m);

    end

end

%-------------------------------------------------------------------------

function mid=SeekMid(winbuf,m)

% ************************************************************************

% 函数名称:

%    SeekMid()          排序函数

% 参数:

%    winbuf             滑动窗口

%    m                  滑动窗口尺寸   

%    mid                存放排序后中间位置的像素值

% 说明:

%    将winbuf窗口中的m*m个像素进行排序,将排序队列中间的像素值赋给变量mid。       

% ************************************************************************

winsize=length(winbuf);        %取窗口尺寸

for i=1:winsize                %编写排序函数

    for j=1:winsize-i

        if(winbuf(i)>winbuf(j+i))

            t=winbuf(i);

            winbuf(i)=winbuf(j+i);

            winbuf(j+i)=t;

        end

    end

end

mid=winbuf(ceil(m*m/2));    % ceil函数朝正无穷大方向取整,总能取到中间位置

%-------------------------------------------------------------------------

四、实验结果及分析:(原图像和处理后的图像比较及分析)

由实验结果可以看出,对于处理椒盐噪声,中值滤波比均值滤波要好很多。当窗口大小为3×3时,均值滤波能一定程度上降低噪声的污染,但是,仍能看出在噪声点,并没有完全消除噪声,只是将噪声与周围的图像进行了平均,噪声点只是显得模糊了,并没有完全消除。相比之下,中值滤波则效果明显,同为3×3的窗口,几乎能把所有的噪声点消除,效果非常显著。当窗口大小变大时,也能将大部分噪声点消除,但是会带来严重的模糊。

同时我们可以看出,两种方法都使得处理后的图像比原图要模糊,并且随着窗口的变大,图像变得越来越模糊。通过两种方法之间的比较则可以看出,同等窗口下中值滤波带来的模糊比均值滤波要轻一些。

日 期: 20## 年10 月 11 日

==============================================================================

实验名称:图像方块编码(BTC)

一、实验目的:

通过编程实验,掌握方块编码的基本方法及压缩性能。

二、实验内容:

编程实现子块为n×n的方块编码基本方法,分别取n=2,4,8方块尺寸进行方块编码实验,计算编码后的均方误差和压缩比。

三、实验方法及编程:

本实验采用的方案为:

(1)

(2)  

(3)   

function outbuf=BtcBlock(inbuf,n)

% ************************************************************************

% 函数名称:

%   btcblock()        方块编码算法函数

% 参数:

%   inbuf              方块数组

%   n                  方块尺寸

%   outbuf             存放处理后的方块图像

% 说明:

% 把原图像分成n*n子块,对每个方块的图像数据分别计算xt,a0,a1值,再用分辨率

% 分量(a0,a1)替代方块原来的数据 最后放入方块图像数组中并返回该数组。

% ************************************************************************

temp=0; temp0=0; temp1=0; q=0; m=n*n;

inbuf=double(inbuf);

for i=1:n

    for j=1:n

        temp=temp+inbuf(i,j);

    end

end

xt=temp/m;

for i=1:n

    for j=1:n

        if (inbuf(i,j)>=xt)

            q=q+1;

            temp1=temp1+inbuf(i,j);

        else

            temp0=temp0+inbuf(i,j);

        end

    end

end

if q~=m

     a0=round(temp0/(m-q));

end

if q~=0

     a1=round(temp1/q);

end

for i=1:n

    for j=1:n

        if (inbuf(i,j)<xt)

            outbuf(i,j)=a0;

        else

            outbuf(i,j)=a1;

        end

    end

end

%-------------------------------------------------------------------------

四、实验结果及分析:(原图像和处理后的图像比较及分析)

由实验结果可以看出,窗口大小较小(如2×2)时,编码图像与原图像比几乎相同,很难察觉出误差。而当窗口较大(如8×8)时,在一些细节较多的部位就能看出有较明显的方块效应。同时,窗口越大,其对码率的压缩效果也越明显。综合考虑,当窗口大于8×8时,方块效应会导致观察上有一定的障碍,故选择2×2或4×4较为合适。

日 期: 20## 年10 月 18 日

==============================================================================

实验名称:图像线性预测编码(DPCM)

一、实验目的:

通过编程设计,掌握帧内DPCM的编解码方法(预测、量化)及其压缩性能。

二、实验内容:

(1) 编制一维前值预测DPCM编解码程序,预测系数取(1,0,0,0)。

(2) 编制二维前值预测DPCM编解码程序,预测系数取(1/2,1/4,0,1/4)。

(3) 重建图像f′(i,j)与原图像f(i,j)的误差图像,用绝对值表示如下。

式中的n为放大因子,以便观察误差的分布情况。

本实验采用15个量化分层的主观量化器,其量化电平分别取(0,±5,±7,±10,±17,±28,±39,±52,±67)。

实验图像为cla0或cla1。

三、实验方法及编程:

图像的线性预测编码所运用的基本原理是基于二维图像中相邻图像间存在着很强的相关性。

假定当前待编码的像素为表示预测系数,并用表示预测值,则的预测值为:

预测误差为:

的恢复值为:

的量化值)

function newbuf=Dpcm_code(oldbuf,M,N,dim);

% ************************************************************************

% 函数名称:

%     Dpcm_Code()      “线性预测编解码器”算法函数

% 参数:

%    oldbuf             原图像数组

%    M,N                原图像尺度

%    dim                选择预测编码维数

%    newbuf             存放处理后的图像二维数组

% 说明:

% 根据线性预测编解码算法调用各子模块,对原图像进行1D/2D线性预测编码和解码,

% 解码后的恢复图像放在newbuf数组中。

% ************************************************************************

global newbuf;                                %定义全局变量

for i=1:M

    for j=1:N

        pre_val=Predict_Value(i,j,N,dim);

        err=oldbuf(i,j)-pre_val;

        quan_err=Quant_Value(err);

        res_val=Restor_Value(quan_err,pre_val);

        newbuf(i,j)=Clip_Value(res_val);

    end

end

%-------------------------------------------------------------------------

function newbuf=Error_Code(M,N,dim);

% ************************************************************************

% 函数名称:

%    Error_Code()      “传输误码解码器”算法函数

% 参数:

%    M,N                原图像尺度

%    dim                选择预测编码维数

%    newbuf             存放处理后的图像二维数组

% 说明:

% 模拟信道传输过程中产生的误码,观察传输误码经解码后对恢复图像的影响,解码

% 后的恢复图像放在newbuf数组中。

% ************************************************************************

global newbuf;

wrong=zeros(M,N);

wrong(100,100)=120;

for i=1:M

    for j=1:N

        pre_val=Predict_Value(i,j,N,dim);

        err=wrong(i,j);

        quan_err=Quant_Value(err);

        res_val=Restor_Value(quan_err,pre_val);

        newbuf(i,j)=Clip_Value(res_val);

    end

end

%-------------------------------------------------------------------------

function  Pvalue=Predict_Value(row,col,N,dim)

% ************************************************************************

% {This function is used to give predicted value as linear predictor.

% The prediction formula is as follows:

% 1_D DPCM:      ^x[i,j]=128           if j=1

%                        x'[i,j-1]     if j>1

% 2_D DPCM:      ^x[i,j]=128           if i=1,j=1

%                        x'[  i,j-1]   if i=1,j>1

%                        x'[i-1,j  ]   if i>1,j=1 or N

%                     1/2x'[  i,j-1]   if i>1,j>1

%                     1/8x'[i-1,j-1]   (Pirsch's predictor)

%                     1/4x'[i-1,j  ]

%                     1/8x'[i-1,j+1]

% Dim : Dimension of prediction

% Row : vertical coordinate of current pixel to be predicted

% COL : horizontal coordinate of current pixel to be predicted}

% ************************************************************************

global newbuf;

switch  dim

    case 1

        if col==1

            Pvalue=128;

        else

            Pvalue=newbuf(row,col-1);

        end

    case 2

        if (row==1&&col==1)

            Pvalue=128;

        end

        if (row==1&&col>1)

            Pvalue=newbuf(row,col-1);

        end

        if (row>1&&col==1)||(row>1&&col==N)

            Pvalue=newbuf(row-1,col);

        end

        if (row>1&&col>1&&col<N)

            Pvalue=(1/2)*newbuf(row,col-1)+(1/4)*newbuf(row-1,col-1)+

 (1/4)*newbuf(row-1,col+1);

        end

end

%-------------------------------------------------------------------------

function Qvalue=Quant_Value(err);

% ************************************************************************

%   This function is used as linear quantizer.The quantizer has totally

%  15 quantization level :

%  0,±5,±10,±17,±28,±39,±52,±67

% ************************************************************************

if (abs(err)<=2.5)    lev=0; 

else

if(abs(err)<=7.5)   lev=5; 

      else

if(abs(err)<=13.5)   lev=10;

            else

if(abs(err)<=22.5)   lev=17;

                  else

if(abs(err)<=33.5)   lev=28;

                        else

if(abs(err)<=45.5)   lev=39; 

                              else

if(abs(err)<=59.5)   lev=52;

                                    else   lev=67;

                                    end

                              end

                        end

                  end

            end

      end

end

Qvalue=lev;

if (err~=0)

    Qvalue=lev*(err/abs(err));

end

%-------------------------------------------------------------------------

function  Rvalue=Restor_Value(quan_err,pre_val)

% ************************************************************************

% This function is used to get restored value of DPCM

%              x=^x+Quant_Error

% ************************************************************************  

Rvalue=quan_err+pre_val;

%-------------------------------------------------------------------------

function Cvalue=Clip_Value(res_val)

% ************************************************************************

%  This function is used to clip to restored value to 8_bit value

%               0       if x<0

%           x'=255     if x>255

%               x       otherwise

% ************************************************************************

if (res_val<0)  Cvalue=0;

else 

if(res_val>255)  Cvalue=255;

      else

Cvalue=res_val;

      end

end

%-------------------------------------------------------------------------

四、实验结果及分析:(原图像和处理后的图像比较及分析)

由实验结果可以看出,一维和二维预测编码图像与原图均十分接近,两者的差别难以察觉。而从误码图像中可以看出,当在某一位置出现误码后,一维预测编码会将误差延续至整个行,显得很明显。二维预测编码则与之不同,其将误码延续至其后的斜后方,并且随着距离的增加迅速消失,总体而言,影响要小一些。两相比较,可以体现出二维预测编码的一些优势。

日 期: 20## 年10 月 25 日

==============================================================================

实验名称:JPEG压缩编码

一、实验目的:

(1) 掌握n×n子块的DCT图像变换及频谱特点。

(2) 熟悉JPEG基本系统的图像编解码方法。

二、实验内容:

(1) 编程实现n×n子块DCT变换的图像频谱显示,8×8子块DCT变换系数按“Z”(Zig-Zag)扫描图像重建,计算图像的均方根误差RMSE,显示误差图像和误差直方图。

(2) 编程实现JPEG压缩编码,进行8×8子块的DCT图像变换,JPEG量化矩阵的量化与反量化,8×8子块DCT的图像重建,计算图像的均方根误差RMSE,显示误差图像和误差直方图。

三、实验方法及编程:

    DCT频谱系数在方块中的分布有如下规律:直流系数位于左上角第一个的位置,且值较大。余下的为交流系数,越向右下角系数的值一般越小,属于高频分量。在细节较多的区域,DCT频谱系数整体显得较亮,而在背景区,除了直流系数和少数低频系数,其余都为0或很小的值,故而显示为黑色。对DCT系数做反DCT变换则可复原出原图。若反变换前对DCT系数进行取舍则可以降低码率,但是,会对图像质量带来一定的影响。

    JPEG压缩编码的算法主要计算步骤如下:

    (1)通过前向离散余弦变换减少图像数据相关性。

    (2)利用人眼的视觉特性对DCT系数进行量化。

    (3)使用差分脉冲编码调制对直流系数进行编码。

    (4)对交流系数进行“Z”形扫描,使用行程长度编码对交流系数进行编码。

    (5)熵编码器对上述描述符进行熵编码,可以采用霍夫曼编码,也可以采用算数编码。

function newbuf=DctBlock(oldbuf,Block)

% ************************************************************************

% 函数名称:                   

%    DctBlock()      DCT n*n块频谱函数

%

% 参数:

%   oldbuf          原图像数组

%   Block           DCT n*n当前块选择值

%   newbuf          存放处理后的图像二维数组

%

% 说明:

%    根据Block块的当前选择值,计算原图像的n*n块DCT变换,并转换为可视频谱图,

%  有利于频谱的观察。               

% ************************************************************************

oldbuf=double(oldbuf);

H=dctmtx(Block);

newbuf=blkproc(oldbuf,[Block Block],'P1*x*P2',H,H');

newbuf=log(abs(newbuf));

subplot(2,2,2);

imshow(newbuf,[]);     

%------------------------------------------------------------------------- 

function newbuf=DctCode(oldbuf,DCTch)

% ************************************************************************

% 函数名称:                   

%    DctCode()      DCT 8*8 块系数“Z”字扫描图像压缩函数

%

% 参数:

%   oldbuf          原图像数组

%   DCTch           DCT 8*8 块“Z”扫描当前系数选择值

%   newbuf          存放处理后的图像二维数组

%

% 说明:

%    计算图像的8×8子块DCT变换,按“Z”字扫描顺序,根据DCTch参数,只保留64个

% DCT系数中的前DCTch个系数,对修改后的DCT系数用逆DCT变换重建图像,得到DCT

% 变换的压缩图像。计算重建图像的均方根误差RMSE ;显示误差图像和误差直方图。               

% ************************************************************************

zigzag=[1 2 6 7 15 16 28 29          %设置Z扫描顺序

        3 5 8 14 17 27 30 43

        4 9 13 18 26 31 42 44

        10 12 19 25 32 41 45 54

        11 20 24 33 40 46 53 55

        21 23 34 39 47 52 56 61

        22 35 38 48 51 57 60 62

        36 37 49 50 58 59 63 64];  

tbuf=ones(8);                           %定义8*8全1数组

maskbuf=tbuf .* zigzag<=DCTch;      %根据当前DCTch值得到“Z”字扫描的二值掩模

oldbuf=double(oldbuf);

H=dctmtx(8);

dctno=blkproc(oldbuf,[8 8],'P1*x*P2',H,H');

newbuf=blkproc(dctno,[8 8],'P1*(x.*P2)*P3',H',maskbuf,H);

subplot(2,2,2);

imshow(newbuf,[]);

eimag(oldbuf,newbuf);

%-------------------------------------------------------------------------

function newbuf=JpegCode(oldbuf)

% ************************************************************************

% 函数名称:                   

%    JpegCode()       JPEG近似基准编码

%

% 参数:

%   oldbuf             原图像数组

%   newbuf             存放处理后的图像二维数组

%

% 说明:  

%   实现JPEG压缩编码,进行 8×8 子块DCT变换、JPEG量化矩阵的量化与反量化,8×8

%子块DCT的图像重建;计算重建图像的均方根误差RMSE;显示误差图像和误差直方图。             

% ************************************************************************

z = [16 11 10 16 24 40 51 61

     12 12 14 19 26 58 60 55

     14 13 16 24 40 57 69 56

     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]  ;           %标准亮度量化表      

oldbuf=double(oldbuf);                            %原图像数据转换为双精度

H=dctmtx(8);

dctno=blkproc(oldbuf,[8 8],'P1*x*P2',H,H');

jpegno=blkproc(dctno,[8 8],'round(x./P1)',z);

jpegno1=blkproc(jpegno,[8 8],'x.*P1',z);

newbuf=blkproc(jpegno1,[8 8],'P1*x*P2',H',H);

subplot(2,2,2);

imshow(newbuf,[]);

eimag(oldbuf,newbuf);

%-------------------------------------------------------------------------

function eimag(oldbuf,newbuf)

% ************************************************************************

% 函数名称:                   

%    eimag()        

% 说明:

%    计算重建图像的均方根误差RMSE;显示误差图像和误差直方图。                  

% ************************************************************************

e=double(oldbuf)-newbuf;                          %计算原图像与压缩图像之差

[m,n]=size(e);RMSE=sqrt(sum(e(:).^2) / (m*n));      %计算均方根误差

if RMSE                                             %如果有误差,即rmse不为0

    emax=max(abs(e(:)));                          %找图像差最大值

    [h,x]=hist(e(:),emax);                        %用于生成直方图数据

    if length(h) >= 1                               %如果有数据

    s=max(h(:));

    subplot(2,2,3),bar(x,h/s,'k');                  %显示图像差值直方图

    RMSE=num2str(RMSE);                           %把数值转换为字符串

    strRMSE=strcat('图像差值直方图  均方根误差RMSE= ',RMSE); %把多个串连接成长串

    title(strRMSE);

    e=mat2gray(e,[-emax,emax]);                   %显示差值图像

    subplot(2,2,4),imshow(e);

    title('原图像与压缩图像的差值图像');         %显示结果图像标题

    end

end

%-------------------------------------------------------------------------

四、实验结果及分析:(原图像和处理后的图像比较及分析)

由实验结果可以看出:

当保留的系数很少时,恢复的图像有着严重的方块效应,对观看造成很大的阻碍。而当保留的系数较多时,恢复的图像和原图十分接近,对于观看基本没有影响。

JPEG是常用的静态图片编码方法,实验时进行了一定的简化。从结果看,其编码的结果较好,对观看影响很小。同时,JPEG对于码率的压缩也是效果很好的。

实验课程小结和思考(包括感想、体会与启示)

本学期所学的图像处理和图像通信编码方面的实验所用到的理论知识在以前的课程中都学习过,但是当运用到实际实验中的时候却显得比较生疏。这次实验课程让我对于理论知识和Matlab软件的应用有了更多的了解,尤其是一些编程函数与之前学习的C或是C++有很大区别,这花费了我一定的时间去学习Matlab的使用。

实验中的内容都是较为基础和简单的,与实际应用还有较大的距离。在今后的工作与学习过程中肯定会遇到复杂的多的难题。但是通过这次实验课程,我从中看到了这些知识的应用方向与方法,对我有很大的帮助。