图像灰度级减少及基本缩放(Reducing the Number of Gray Levels, Zooming and Shrinking Images)

    要: 本实验分为三部分:编写一个以2的幂次方将一幅图像的灰度级数从256减少到2;编写一个基于像素复制法的图像缩放程序,要求缩放因子为整数;编写一个基于双线性插值法的图像缩放程序,要求输入参数为输出图像的水平和垂直方向的像素数。并使用这三个函数对给定图像进行缩小再放大操作,对比输出图像和原图的差异。该实验是在MATLAB 2014a平台上实现。


一、实验原理

1.图像灰度级数变化

    图像的灰度就是所谓的色阶或灰阶,是指亮度的明暗程度。也称中间色调主要用于传送图片,分别有16级、32级、64级三种方式,它采用矩阵处理方式将文件的像素处理成163264级层次,使传送的图片更清晰。LED显示屏的灰度等级越高,颜色越丰富,色彩越艳丽;反之,显示颜色单一,变化简单。

本实验的图像素材是一种具有从黑到白256级灰度色阶的单色图像。该图像中的每个像素用8位无符号数据表示,因此像素点值介于黑白间的256种灰度中的一种。该图像只有灰度等级,而没有颜色的变化

为了实现图像灰度级数的变化,本实验以2的幂次方将256级的灰度色阶进行量化。当图像的采样点数一定时,采用不同量化灰度级数的图像质量不一样。灰度级数越多,图像质量越好;反之图像质量越差。灰度级数小的极端情况就是二值图像。图1给出在MATLAB上运行的量化代码。

图像灰度级减少及基本缩放(Reducing the Number of Gray Levels, Zooming and Shrinking Images)_第1张图片

1灰度级减少程序

其中imt = (ima / dfact) * dfact中的(ima / dfact)的计算结果为整数,略去了小数点后,再乘以dfact则达到了量化的作用,即不是dfact整数倍的灰度值都被归为dfact的整数倍。其中dfact2factor次幂,为了防止数据溢出,将factor设定在08之间。


2.关于图像内插

内插是在诸如放大、收缩、旋转等图像处理任务中广泛使用的基本工具。使用内插用于调整图像尺寸大小也称为图像重取样方法。从根本上看,内插是用已知数据来估计未知位置的数值的处理,本实验将验证两种插值方法,分别是像素复制法和双线性插值法。


3.基于像素复制方式的图像缩放

   在本实验中,像素复制法只是简单的把原图像最近邻的灰度赋给每个新的位置,或者在缩小中简单地去除某一位置的像素信息,这种方法的优势是计算量很低,不用涉及类似于双线性插值和双三次内插的大量的浮点运算。其方法的缺点也是明显的,该方法在放大图片时会产生较为严重的失真,在缩小后再放大图片则失真更为明显。


4.基于双线性插值技术的图像缩放

使用双线性插值法,我们需要用44个以上最近邻点去估计给定位置的灰度。在数学上,双线性插值算法可以看成是两个变量间的线性插值的延伸。执行该过程的关键思路是先在一个方向上执行线性插值,然后再在另外一个方向上插值。用一个简单的数学表达式可以表示如下:

由上式可以看出,这个过程有大量的浮点运算,而图像的像素取值在0255之间,最多只有256种结果,而计算出的f(x,y)很明显是个浮点数,我们还需要对该浮点数进行取整。

图像灰度级减少及基本缩放(Reducing the Number of Gray Levels, Zooming and Shrinking Images)_第2张图片


2双线性插值法的大致思路


二、实验结果

本实验素材分别取自冈萨雷斯主编的数字图象处理第三版中Fig2.19(a).jpgFig2.21(a).jpg



图像灰度级减少及基本缩放(Reducing the Number of Gray Levels, Zooming and Shrinking Images)_第3张图片

3不同灰度级的输出图像

图像灰度级减少及基本缩放(Reducing the Number of Gray Levels, Zooming and Shrinking Images)_第4张图片

4基于像素复制法缩小为256*256后的图像

图像灰度级减少及基本缩放(Reducing the Number of Gray Levels, Zooming and Shrinking Images)_第5张图片

5基于像素复制法放大为1024*1024后的图像

图像灰度级减少及基本缩放(Reducing the Number of Gray Levels, Zooming and Shrinking Images)_第6张图片

6基于双线性插值法缩小为256*256后的图像

图像灰度级减少及基本缩放(Reducing the Number of Gray Levels, Zooming and Shrinking Images)_第7张图片

7基于双线性插值法放大为1024*1024后的图像



三、实验结论

        本实验编写了一个以2的幂次方将一幅医学图像的灰度级数从256减少到2的程序,同时论证了像素复制法、双线性插值法这两种图像缩放技术。实验结果表明像素复制法具有运算速度快这一优点,对于一些只具有少量细节的图片不失为一种有效的图像缩放技术,但无法胜任具有大量细节的图像缩放工作,因为缩放后的图像失真严重。

      双线性插值法是一种非线性内插法,通过使用4个或以上的临近点来估计新位置的灰度值,其处理结果更接近原图像的细节。但是,由于运算过程中包含大量浮点运算,使得计算量明显增加,在MATLAB上运行代码时便可明显感觉到。但是使用双线性插值法所得到的结果比像素复制法有重大的改进。

在图像缩放处理中,双线性内插和双三次内插是两种常用的典型方法。当然有可能使用更多的邻点和更复杂的方程来逼近原图像,但实际操作过程中需要考虑计算负担与效率问题。


以下给出简单的MATLAB代码:

% 第一部分是灰度级转换程序 

function imt = grayleveldec(ima,factor)
%功能: 将原图像的灰度级按照2的foctor次幂减少
%输入参数:
%  ima     输入的 8 bits灰度图像矩阵
%  factor  灰度级减小因子
%  输出参数:
%  imt  输出的灰度图像
% 规定factor的阈值在0到8之间
       if factor < 0 
           factor = 0;
       end
       if factor > 8
           factor = 8
       end
       dfact = uint8(2^factor);   
       imt = (ima / dfact) * dfact;  %量化的过程
       return;   

function main()
%
%功能: 灰度级减少试验 将八种灰度级的输出图像显示在2*4的一张图片上
%
         wH=2; wL=4;
         
         ima=imread('fig2.21(a).jpg');
         subplot(wH,wL,1) 
         imshow(ima);
         title('原图像');
         
         imt = grayleveldec(ima,1);
         subplot(wH,wL,2) 
         imshow(imt);
         title('128级灰度图像');
         
         imt = grayleveldec(ima,2);
         subplot(wH,wL,3) 
         imshow(imt);
         title('64级灰度图像');
         
         imt = grayleveldec(ima,3);
         subplot(wH,wL,4) 
         imshow(imt);
         title('32级灰度图像');
         
         imt = grayleveldec(ima,4);
         subplot(wH,wL,5) 
         imshow(imt);
         title('16级灰度图像');
         
         imt = grayleveldec(ima,5);
         subplot(wH,wL,6) 
         imshow(imt);
         title('8级灰度图像');
         
         imt = grayleveldec(ima,6);
         subplot(wH,wL,7) 
         imshow(imt);
         title('4级灰度图像');
         
         imt = grayleveldec(ima,7);
         subplot(wH,wL,8) 
         imshow(imt);
         title('2级灰度图像');
         
% 第二部分是基于像素复制法的图像缩放程序
function imt=change_pixels(ima,factor)

% 功能: 基于像素复制方式进行图像缩放
% 输入参数为一整数缩放因子
% 当缩放因子为负整数时代表缩小,正整数时代表放大

% wH=1; wL=2;
[xs,ys] = size(ima);
if factor<0               %缩放因子小于0时,判断为缩小图像
    fa = abs(factor)       %取绝对值
    %imt = zeros((xs/fa),(xs/fa));  
    for i=1:(xs/fa)
        for j=1:(ys/fa)
            imt(i,j) = ima(i*fa,j*fa);
        end
    end
else if factor>0           %缩放因子大于0时,判断为放大图像
        for i=1:(xs*factor)
            for j=1:(ys*factor)
                imt(i,j) = ima(ceil(i/factor),ceil(j/factor));  
% round(x):四舍五入至最近整数  
% fix(x):无论正负,舍去小数至最近整数 
% floor(x):下取整,即舍去正小数至最近整数  
% ceil(x):上取整,即加入正小数至最近整数
            end
        end
    else 
        imt = ima;
    end
end
return;
        
% 第三部分是基于双线性插值法的图像缩放程序
function imt=change_2lines()%(ima,xs,ys)
%
% 基于双线性插值技术进行图像缩放
% 输入参数为结果图像的水平和竖直方向的像素数 x和y
%

%xs = 1024;
%ys = 1024;
imt = uint8(zeros(xs,ys));

ima=imread('Fig2.19(a).jpg');
[imax,imay] = size(ima);
    x = xs/imax;     %缩放倍数
    y = ys/imay;     %缩放倍数

if x>1 || y>1
    x = fix(x);     %缩放倍数
    y = fix(y);     %缩放倍数
for m=1:xs
     for n=1:ys
         outx = (m-1)/x+1;   %求输出图像各点的位置
         outy = (n-1)/y+1;
         %要求各点到邻近点的距离,先求出四个邻近点的位置
         xk = fix(outx);
         yk = fix(outy);
         %可求出距离,写为xd和yd
         xd = outx - xk;
         yd = outy - yk;

          if outx1 || y<1
%    x = fix(x);     %缩放倍数
%     for m=1:xs
%      for n=1:ys
%          outx = (m-1)/x+1;   %求输出图像各点的位置
%          outy = (n-1)/y+1;
%          %要求各点到邻近点的距离,先求出四个邻近点的位置
%          xk = fix(outx);
%          yk = fix(outy);
%          %可求出距离,写为xd和yd
%          xd = outx - xk;
%          yd = outy - yk;
% 
%           if outx1
%    y = fix(y);     %缩放倍数
%     for m=1:xs
%      for n=1:ys
%          outx = (m-1)/x+1;   %求输出图像各点的位置
%          outy = (n-1)/y+1;
%          %要求各点到邻近点的距离,先求出四个邻近点的位置
%          xk = fix(outx);
%          yk = fix(outy);
%          %可求出距离,写为xd和yd
%          xd = outx - xk;
%          yd = outy - yk;
% 
%           if outx












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