视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
图像信号的抽取与插值
2025-09-29 22:46:16 责编:小OO
文档
设计性实验1   图像信号的抽取与插值

一、实验目的

1、熟悉图像处理常用函数和方法;

2、培养通过查阅文献解决问题的能力。

二、实验要求

给出一个二维灰度图像,

3、编程实现对该图像的任意比例的放大及缩小;

4、编程实现对该图像的任意角度旋转;

5、解决缩放及旋转时产生的锯齿等图像不平滑问题。

实验提示

6、利用上采样、下采样等方法对信号进行缩放变换;

7、观察对图像进行缩放或旋转时,图像是否会出现锯齿等不平滑现象?

8、分析产生锯齿现象的原因;

9、查阅文献了解解决锯齿现象的方法。(例如平滑滤波、双线性插值、双立方插值等处理)

三、实验细节

    1、实现图像的放大

算法:

为了实现图像的放大,首先将原图按照x1=a*x,y1=b*x将原图的像素点(x,y)映射为新的画布上的(x1,y1)点,如上图左一到左二。然后,以行或列为一个处理单位,采用一种图像插值算法,在两红点之间的空白点插入一些值,使图像充满整个画布。具体顺序如上图所示,先按行插值,再按列插值。

本实验采用的插值算法要达到的目标是,使插入点的斜率与原图保持一致

具体插值方法如下(以宽度放大三倍为例):

取出一行像素点,使时域坐标变为原来的三倍。假设两相邻像素点坐标分别为a[n]和a[m],则在a[n+1]、a[n+2]、a[n+i]…a[m-1]处填入的灰度值为:

过程如下:

图①

原图像的一行像素点

图②

使时域坐标变为原来的三倍

插入的点

图③

在两点间插值,使新插入的点与原先的两点以同一斜率变化。

    

2.实现图像的缩小:

    若要实现缩小,则同样按照x1=ax,y1=by的坐标转换关系将原画布上的点映射到新画布上,那么新画布上的一点将成为原画布上多点的映射,此时,新画布的点只需取其中一个映射点即可。过程如下:

运行结果:

(以行列均放大三倍为例)

①放大前的图像:

②将图像的行列上的时域变为原来的三倍。

③行插值:

④列插值后(完成):

颗粒(锯齿)不明显

使用线性插值法

假如使用临近插值法,将得到如下图片,可见,在图中眼部的位置,临近插值法的锯齿更为明显,而使用本实验插值算法得到的图像边缘更为平滑。

颗粒(锯齿)明显

使用临近插值法

图像缩小:

(以行列均缩小为1/2为例)

缩小

             

    代码清单:

clear;clf;

pic=imread();

k=2; %¾â³ÝÏû³ýϵÊý

[l,w]=size(pic);

pic(l+1,1)=0;

pic(1,w+1)=0;

 

l1=2*l;

w1=2*w;

 

i=1:l;

x=ceil(i*l1/l);

ii=1:w;

y=ceil(ii*w1/w);

for i=1:l

    for ii=1:w

        a(ceil(i*l1/l),ceil(ii*w1/w))=pic(i,ii);

    end;

end;

 

for i=1:l

   for ii=1:w-1

       n=(y(ii));

       m=(y(ii+1));

       for iii=1:m-n-1

           a(x(i),n+iii)=(a(x(i),m)-a(x(i),n))*iii/(m-n)+a(x(i),n);

       end;

   end;

end;

 

for i=1:w1

   for ii=1:l-1

       n=(x(ii));

       m=(x(ii+1));

       for iii=1:m-n-1

           a(n+iii,i)=(a(m,i)-a(n,i))*iii/(m-n)+a(n,i);

       end;

   end;

end;

imshow(a);

2.实现图片的旋转

算法:

根据坐标变换公式,可将旋转后坐标(x1,y1)映射到原坐标(x,y)

         x=x1*cos(b)-y1*sin(b)

        y=x1*sin(b)+y1*cos(b)

由于求出来的原坐标不为整数,故将其取整,若求得(x,y)坐标范围处于有效范围,即0                原图(x,y)                                  旋转后(x1,y1)

如上图所示,从(x1,y1)出发回到原图寻找对应的(x,y)坐标,如果(x1,y1)对应的点(x,y)在原画布内,则该点的灰度值取为最临近的整数点的灰度值,如图中黑线所示;否则(x1,y1)取为空白点,如途中红线所示。

运行结果:

旋转后的图片

旋转后的图片产生了锯齿

程序清单:

clear;clf;

 [l,w]=size(pic);

b=30;

xx=[0,0,l,l];

yy=[0,w,w,0];

b=b*2*pi/360;

x0=min(xx.*cos(b)-yy.*sin(b));

y0=min(xx.*sin(b)+yy.*cos(b));

x1=max(xx.*cos(b)-yy.*sin(b));

y1=max(xx.*sin(b)+yy.*cos(b));

for x=1:fix(x1-x0)+1

    for y=1:fix(y1-y0)+1

        a(x,y)=uint8(205);

    end;

end;

[l1,w1]=size(a);

for x=1:l1

    for y=1:w1

        xt=floor(+x*cos(b)-y*sin(b)+l*sin(b)*sin(b));

        yt=floor(+x*sin(b)+y*cos(b)-l*sin(b)*cos(b));

        if (xt>0 && xt<=l && yt>0 && yt<=w)

            a(x,y)=pic(xt,yt);

        end;

    end;

end;

imshow(a);

四、实验感想

    我们小组在完成本实验要求的两道题目的过程中,尝试了多种图像处理的算法,从一开始的邻近插值,到使用滤波器滤波,再到使用线性插值,最终得到了较优的处理效果。在这过程中,设计算法与编程的能力得到了提高。

    在设计图像放大算法的时候,我们首先采用的是邻近插值法,即按照坐标映射的方法,从新画布出发寻找原画中的较邻近对应点作为新像素的值,这种算法的缺点在于,当图像放大之后,原本的渐变区域并没有进行相应的处理,结果造成渐变部分出现锯齿。于是我们小组提出了改进算法,即将图像中的高频部分滤除,以使渐变部分更为平滑。处理的结果让人失望,虽然得到的图像比原来平滑了,但是总体上看,却使得图像质量明显下降。于是我们又设计了第二种改进算法,即采用线性插值法。具体做法为,在两点之间,插入一些点使之与原本的渐变速度保持一致。处理的结果让人欣喜,在一些细致区域可以明显地看到,此算法的处理结果优于邻近插值法(报告中有对比图像)。但是仍有不足,因为在图像变化比较大的区域不应采用平稳的渐变,而线性插值虽然使变化平稳部分的锯齿状况有所改善,但缺使变化剧烈的部分出现了不应有的渐变。故本实验仍有可改善之处,我们可以设计一个图像均衡器,增强图像的高频部分,使图像的轮廓更清晰。

    在设计图像旋转算法的时候,我们最开始采用的是直接映射法,即从原画布出发,根据坐标变换公式,寻找新画布上的对应点并赋值。这种方法的缺陷在于,由于图像旋转后新增了许多像素点,新旧图像的像素点无法一一对应,因此在新画布上出现了许多空白的点。于是我们采用了第二种方法,即从新画布出发寻找原画布上的像素点,由于变换之后的坐标为小数,故对新坐标取整,这个过程实际上是邻近插值法。插值结果总体上令人满意。但放大后仍能发现一些锯齿。本实验有可改善之处,可采用更优的插值方法进行改进。下载本文

显示全文
专题