实验2-图像灰度级减少和图像缩放

1 摘要

本实验实现灰度级减少和图像缩放的功能,主要分三个部分:编写一个以2的幂次方将给定图像的灰度级从256减少到2的程序;编写一个基于像素复制方式进行图像缩放的程序;编写一个以双线性插值技术进行图像缩放的程序,程序的输入输出参数为结果图像的水平和垂直方向的像素值,并用这两种缩放程序将图像从10241024缩小到256256,并且解释产生差异的原因。

2 相关技术

2.1 图像灰度级减少

改变图像灰度级:本实验要实现图像灰度级数的变化,将256级的灰度色阶以2的幂次方进行减小量化,也就是把图像的灰度级由每隔1(256灰度级),降低到每隔2(128灰度级)、每隔4(64灰度级),直到每隔128(2灰度级)。
当图像的采样点数一定时,采用不同的灰度级数,图像的质量不同。一般来说,图像的灰度级数越多,图像的质量越好;级数越少,质量越差。灰度级减少的极端情况就是二值图像。
本实验的处理方法是:
使用 uint8(ima),使A变成整型,对于(uint8(ima)/factor) 这个过程,先把数据类型变成8位整型,然后除以2的幂次方这个因子,四舍五入,得到间隔为2的幂次方的整型数据。

ima=imread('C:\Users\machenike\Desktop\DIP\pro2\Fig2.21(a).jpg'); 
for i=0:7
B = (uint8(ima/(2^i)))*(2^i); %量化的过程
a=num2str(2^(8-i)); %将数据类型转换为字符串
subplot(2,4,i+1), imshow(B); 
title( [ ' ',num2str(a),'级灰度图像']); %title中设置变量
end

2.2 基于像素复制法的图像缩放

像素复制法就是相邻像素之间简单的复制或删除,在图像放大时,简单的把原图最近的灰度值赋给每一个新的位置;在图像缩小时,简单的去除某一位置的像素信息。
这种方法的优点是计算量低。但其缺点十分明显:在放大中会增加很多无用的信息,缩小的过程中会损失很多有价值的信息,尤其是在多次缩小放大后,图像许多重要信息将会丢失,效果较差。

ima=imread('C:\Users\machenike\Desktop\DIP\pro2\Fig2.19(a).jpg');
[x,y]=size(ima);
factor=0.2;
for i=1:(x*factor)
for j=1:(y*factor)
imt(i,j) = ima(ceil(i/factor),ceil(j/factor)); %需要对ima中元素取整
end
end
figure, imshow(ima);
figure, imshow(imt);
对于0~1之间是缩小,1~N之间是放大,其中需要对ima中元素取整,可选用这些取整函数round(x): 朝两边取整,四舍五入至最近整数 
fix(x): 向中间取整, 朝零方向取整数
floor(x): 向下取整,朝负无穷方向取整
ceil(x): 向上取整,朝正无穷方向取整

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

使用双线性插值算法,需要4个最邻近点去估计给定位置的灰度。在数学上,双线性插值算法可以看成是两个变量间的线性插值的延伸。执行该过程的关键思路是先在一个方向上执行线性插值,然后再在另外一个方向上插值。
双线性插值法具有平滑功能,能有效地克服邻法的不足,但会退化图像的高频部分,使图像细节变模糊。

3 实验结果与分析

3.1 实验结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2 实验分析

这次实验编写了三个部分,以2的幂次方将一幅医学图像的灰度级数从256减少到2,同时论证了像素复制法和双线性插值法这两种图像缩放技术。对比图4和图6,很明显的看出图6更加的清晰,经过图像的缩小再放大后,对于图片的一些细节有失真,但采用双线性插值法的效果明显高于像素复制法,可像素复制法的优点是计算速度明显高于双线性插值算法。 双线性插值算法通过使用4个或以上的临近点来估计新位置的灰度级,灰度级有一个线性的变换,像素灰度级差不会特别的明显,处理结果和原图更加接近。但是在运算过程中含有较多的浮点运算,使得运算量增加,不过这种运算量的增加对现在的处理器来说足以应付,是对像素复制法的改进和提升。

4 程序

4.1 灰度变换

ima=imread('C:\Users\machenike\Desktop\DIP\pro2\Fig2.21(a).jpg');      
for i=0:7
    B = (uint8(ima/(2^i)))*(2^i);  %量化的过程
    a=num2str(2^(8-i));       %将数据类型转换为字符串
    subplot(2,4,i+1),    imshow(B);   
    title( [ ' ',num2str(a),'级灰度图像']);  %title中设置变量
end

4.2 像素复制法

ima=imread('C:\Users\machenike\Desktop\DIP\pro2\Fig2.21(a).jpg');
[x,y]=size(ima);
factor=0.25;
for i=1:(x*factor)
    for j=1:(y*factor)
        imt(i,j) = ima(ceil(i/factor),ceil(j/factor));  %需要对ima中元素取整
     end
end
figure, imshow(ima);
figure, imshow(imt);
imwrite(imt,'akenout2.jpg');

4.3 双线性插值算法

xs = 256;
ys = 256;
imt = uint8(zeros(xs,ys));
 
ima=imread('C:\Users\machenike\Desktop\DIP\pro2\Fig2.21(a).jpg');
[imax,imay] = size(ima);
    x = xs/imax;     %缩放倍数
    y = ys/imay;     %缩放倍数
 
if x>1 || y>1    %这是x和y轴都放大的情况下的插值方法  
    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<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
end
 
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
    end
end
                
 imshow(imt) ;
 imwrite(imt,'akenout3.jpg');
  • 5
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值