Reducing the Number of Gray Levels, Zooming and Shrinking Images

来源:互联网 发布:建筑师软件 编辑:程序博客网 时间:2024/04/28 12:43

摘   要:本实验通过编写三个MATLAB的程序来实现图像的放大与缩小和减小图像的灰度级数。三个程序包括:编写一个以2的幂次方将给定图像的灰度级数从256减少到2的程序,并用该程序实现由图2.21(a)生成图 2.21 所示的各个结果;编写一个基于像素复制方式进行图像缩放的程序将图 2.19 (a)从 1024 x 1024 缩小到 256 x 256;编写一个以双线性插值技术进行图像缩放的程序将图 2.19 (a)从 1024 x 1024 缩小到 256 x 256。最后解释不同方式编写的程序所生成图像产生差异的原因。


一、实验目的

(1.a) 编写一个以 2 的幂次方将给定图像的灰度级数从 256 减少到 2 的程序。图像的灰度级数以参数变量的形式传递到所编写的程序中。

(1.b) 使用图 2.21(a) 以(1.a)中编写的程序生成图 2.21 所示的各个结果。

(2.a) 编写一个基于像素复制方式进行图像缩放的程序,假设缩放因子为整数。忽略混叠效应。

(2.b) 用编写的程序将图 2.19 (a)从 1024 x 1024 缩小到 256 x 256。

(2.c) 用编写的程序将(2.b)中的结果图像放大到 1024 x 1024. 并解释与原图产生差异的原因。

(3.a) 编写一个以双线性插值技术进行图像缩放的程序,程序的输入参数为结果图像的水平和垂直方向的像素数。

忽略混叠效应。

(3.b) 用编写的程序将图 2.19 (a)从 1024 x 1024 缩小到 256 x 256。

(3.c) 用编写的程序将(3.b)中的结果图像放大到 1024 x 1024. 并解释与原图产生差异的原因。

二、技术论述

采用 MATLAB 编程环境写 M 函数去完成实验,MATLAB是一种用于算法开发、数据可视化数据分析以及数值计算的高级技术计算语言和交互式环境。它主要提供以下功能:用于技术计算的高级语言;可对代码、文件和数据进行管理的开发环境;可以按迭代的方式探查、设计及求解问题的交互式工具;可用于线性代数、统计、傅立叶分析、筛选、优化以及数值积分等的数学函数;可用于可视化数据的二维和三维图形函数;可用于构建自定义的图形用户界面的各种工具;可将基于MATLAB的算法与外部应用程序和语言集成的各种函数等。在本实验中我们主要运用了MATLAB扩展的图像处理工具箱进行(如利用函数imread、imshow和imresize可以实现对图像的读取、显示和调整)。

图像的灰度是指图像亮度的明暗程度,也叫灰阶色阶。采用矩阵处理方式将文件的像素处理成16、32、64级层次,使传送的图片更清晰,灰度等级越高,颜色越丰富,色彩越艳丽;反之,显示颜色单一,变化简单。

图像内插是在放大、收缩、旋转等图像处理任务中广泛使用的基本工具,它是通过已知数据来估计未知位置的数值图像处理方法,有两种方法是像素复制法和双线性插值法。双线性插值方法需要用4或4个以上最近邻点去估计给定位置的灰度。在数学上,双线性插值算法可以看成是两个变量间的线性插值的延伸。执行该过程的主要程序是先在一个方向上执行线性插值,然后再在另外一个方向上插值。经过0到255之间256种可能的的浮点运算,并对数值进行取整。

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

四、实验结果讨论

通过技术分析编写以2的幂次方将给定图像的灰度级数从256减少到2的程序grayreduce.m、基于像素复制方式进行图像缩放的程序pixelcp.m和以双线性插值技术进行图像缩放的程序c2line.m(见附录)。通过图片Fig2.19(a).jpg和Fig2.21(a).jpg进行程序测试,并对缩放后输出图像产生的差异进行分析。

通过实验结果的对比分析可知像素复制法运算速度较快,适用于一些只有少量细节的图片缩放技术,但由于缩放后的图像失真严重则无法胜任具有大量细节的图像缩放工作。双线性插值法通过使用4个或以上的临近点来估计新位置的灰度值,它的缩放结果更接近原图像的细节,失真较少。但是通过观察MATLAB上运行代码时便可明显感觉到它的运算速度较慢。不过使用双线性插值法所得到的结果比像素复制法有重大的改进。在实际操作过程中需要考虑考虑计算负担与效率问题。



1.1 以2的幂次方将给定图像的灰度级数从256减少到2的程序grayreduce.mfunction imt = grayreduce(ima,factor)%功能: 将原图像的灰度级按照2的foctor次幂减少%ima输入的 8 bits灰度图像矩阵%factor是灰度级减小因子,阈值在0-8之间%imt代表输出的灰度图像       if factor < 0            factor = 0;       end       if factor > 8           factor = 8;       end       quantify= uint8(2^factor);       imt = (ima /quantify) *quantify;%将不是quantify整数倍的灰度值量化为quantify的整数倍       return;   1.2 使用图2.21(a)以grayreduce.m程序生成图2.21所示的各个结果test.mfunction test()%测试灰度减小程序grayreduce.m%在一张2*4的图片上显示8个灰度级的输出图像         m=2; n=4;         ima=imread('fig2.21(a).jpg');         subplot(m,n,1)          imshow(ima);         title('原图像');%---------------------------------------                  imt = grayreduce(ima,1);         subplot(m,n,2)          imshow(imt);         title('128级灰度图像');%---------------------------------------                  imt = grayreduce(ima,2);         subplot(m,n,3)          imshow(imt);         title('64级灰度图像'); %---------------------------------------                  imt = grayreduce(ima,3);         subplot(m,n,4)          imshow(imt);         title('32级灰度图像'); %---------------------------------------                  imt = grayreduce(ima,4);         subplot(m,n,5)          imshow(imt);         title('16级灰度图像');%---------------------------------------                   imt = grayreduce(ima,5);         subplot(m,n,6)          imshow(imt);         title('8级灰度图像');%---------------------------------------                  imt = grayreduce(ima,6);         subplot(m,n,7)          imshow(imt);         title('4级灰度图像');%---------------------------------------                   imt = grayreduce(ima,7);         subplot(m,n,8)          imshow(imt);         title('2级灰度图像');2.1 基于像素复制方式进行图像缩放的程序pixelcp.mfunction imt=pixelcp(ima,factor)% 基于像素复制方式进行图像缩放% factor位整数缩放因子[xs,ys] = size(ima);if factor<0            %缩放因子factor小于0时图像缩小    fa = abs(factor)   %取绝对值      for i=1:(xs/fa)        for j=1:(ys/fa)            imt(i,j) = ima(i*fa,j*fa);        end    endelse if factor>0        %缩放因子大于0时图像放大        for i=1:(xs*factor)            for j=1:(ys*factor)                imt(i,j) = ima(ceil(i/factor),ceil(j/factor));            end        end    else         imt = ima;    endendreturn;2.2 用像素复制方法编写的程序pixelcp.m测试缩小和放大后图像的区别flower1.mfunction flower1%用像素复制方法编写的程序pixelcp.m测试缩小和放大后图像的区别    m=1;n=2;    ima=imread('Fig2.19(a).jpg');    %缩小图像----------------------------------------------    imt1=pixelcp(ima,-4);    subplot(m,n,1)     imshow(imt1);    title('缩放1/4倍图像256*256');    imwrite(imt1,'shrinks1.jpg');    %放大图像-------------------------------------    imt2=pixelcp(imt1,4);    subplot(m,n,2)     imshow(imt2);    title('缩放4倍图像1024*1024');    imwrite(imt2,'zooms1.jpg');end3.1 编写一个以双线性插值技术进行图像缩放的程序c2line.mfunction imt=c2line(ima,xs,ys)% 基于双线性插值技术进行图像缩放% 输入参数为结果图像的水平和竖直方向的像素数 x和yimt = uint8(zeros(xs,ys));[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 outx<imax & outy<imayimt(m,n)=ima(xk,yk)*(1-xd)*(1-yd)+ima(xk+1,yk)*(1-yd)*xd+ima(xk,yk+1)*yd*(1-xd)+ima(xk+1,yk+1)*xd*yd;         elseif outx==imax & outy<imay             imt(m,n)=ima(xk,yk)*(1-xd)*(1-yd)+ima(xk,yk+1)*yd*(1-xd);         elseif outx<imax & outy==imay             imt(m,n)=ima(xk,yk)*(1-xd)*(1-yd)+ima(xk+1,yk)*(1-yd)*xd;         elseif outx==imax & outy==imay             imt(m,n)=ima(xk,yk)*(1-xd)*(1-yd);          end     endend        else     %这是x和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<imax & outy<imay             imt(m,n)=ima(xk,yk)*(1-xd)*(1-yd)+ima(xk+1,yk)*(1-yd)*xd+ima(xk,yk+1)*yd*(1-xd)+ima(xk+1,yk+1)*xd*yd;         elseif outx==imax & outy<imay             imt(m,n)=ima(xk,yk)*(1-xd)*(1-yd)+ima(xk,yk+1)*yd*(1-xd);         elseif outx<imax & outy==imay             imt(m,n)=ima(xk,yk)*(1-xd)*(1-yd)+ima(xk+1,yk)*(1-yd)*xd;         elseif outx==imax & outy==imay             imt(m,n)=ima(xk,yk)*(1-xd)*(1-yd);           end     end    endend3.2 双线性插值法编写的程序c2line.m测试缩小和放大后图像的区别flower2.mfunction flower2%用双线性插值法编写的程序c2line.m测试缩小和放大后图像的区别    m=1; n=2;    ima=imread('Fig2.19(a).jpg');    %缩小图像--------------------------    imt1=c2line(ima,256,256);    subplot(m,n,1);     imshow(imt1);    title('缩放1/4倍图像256*256');    imwrite(imt1,'shrinks2.jpg');    %放大图像--------------------------    imt2=c2line(imt1,1024,1024);    subplot(m,n,2)     imshow(imt2);    title('缩放4倍图像1024*1024');    imwrite(imt2,'zooms2.jpg');end


阅读全文
0 0
原创粉丝点击