图像的灰度级数越多越好_数字图像处理:Reducing Gray Levels, Zooming and Shrinking

摘 要:本实验通过编写三个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种可能的的浮点运算,并对数值进行取整。

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

四、实验结果讨论

f4310d37147c3dfee9465b15fcec882c.png

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

图1 不同灰度级图像的对比

f65bae81b0bc11e9b42ab5aeb7246c5d.png

图2-1 像素复制方式缩小为256*256的图像

b8cfad946107edac7f5d3602414c5719.png

图2-2 像素复制方式放大为1024*1024的图像

257dfdbb93a80d44c6578d6aa9ad5867.png
图3-1 双线性插值技术缩小为256*256的图像

722d86662aafcf3335731c1801ccfbde.png

图3-2 双线性插值技术缩小为1024*1024的图像

b711b433a7e4bf4a8af2caaabf2a2bc4.png

图2-3 像素复制方式缩小和放大图像的对比

e77797bc7ee17b7b61637b22020c6d27.png

图3-3 双线性插值技术缩小和放大后图像的对比

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

附录:程序清单

%1.1 以2的幂次方将给定图像的灰度级数从256减少到2的程序grayreduce.m
function imt = grayreduce(ima,factor)
%功能: 将原图像的灰度级按照2的foctor次幂减少
%ima输入的 8 bits灰度图像矩阵
%factor是灰度级减小因子,阈值在0-8之间
%imt代表输出的灰度图像if factor < 0 factor = 0;endif factor > 8factor = 8;endquantify= uint8(2^factor);imt = (ima /quantify) *quantify;
%将不是quantify整数倍的灰度值量化为quantify的整数倍return;   
%1.2 使用图2.21(a)以grayreduce.m程序生成图2.21所示的各个结果test.m
function 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.m
function 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);endend
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));endendelse imt = ima;end
end
return;
%2.2 用像素复制方法编写的程序pixelcp.m测试缩小和放大后图像的区别flower1.m
function 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');
end
%3.1 编写一个以双线性插值技术进行图像缩放的程序c2line.m
function imt=c2line(ima,xs,ys)
% 基于双线性插值技术进行图像缩放
% 输入参数为结果图像的水平和竖直方向的像素数 x和y
imt = uint8(zeros(xs,ys));
[imax,imay] = size(ima);x = xs/imax;     %缩放倍数y = ys/imay;     %缩放倍数
if x>1 || y>1x = fix(x);     %缩放倍数y = fix(y);     %缩放倍数
for m=1:xsfor n=1:ysoutx = (m-1)/x+1;   %求输出图像各点的位置outy = (n-1)/y+1;%要求各点到邻近点的距离,先求出四个邻近点的位置xk = fix(outx);yk = fix(outy);%可求出距离,写为xd和ydxd = outx - xk;yd = outy - yk;if outx


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部