【matlab图像处理】插值方法

中国史之【懿王攻犬戎】:
周懿(yi)王攻打犬戎的战争。周懿王在位时期,西周衰弱,戎族不断入侵周朝,一度打到镐(今陕西西安)、岐(今陕西岐县)等地,懿王被迫迁都槐里(今陕西兴平县)。周懿王派虢(guo)公率军北伐犬戎,企图收复失地,但不幸战败。
——来源:全历史APP

【路漫漫其修远兮,吾将上下而求索】

今天介绍图像的几何操作之插值方法。本内容参考自《实用MATLAB图像和视频处理》第7章。

1、为什么需要插值(Interpolation)?

对原始图像进行几何操作后,各个像素的结果值可用两种不同的方法计算,也就是前向映射(源到目标的映射)后向映射(目标到源的映射)。

(1)前向映射

对于前向映射,它需要计算输入图像所有像素的新坐标,并将其值复制到新的位置。其示意图如下:
在这里插入图片描述
从上面的示意图可以看到,从坐标(x, y)到(x’, y’),会存在一些问题:

  • 由变换式得到的坐标(x’, y’)有可能不是整数,不是刚好落在离散的光栅点(如上图),所以需要四舍五入到最接近的整数。
  • 很多坐标可能落到界外(如负的值)
  • 很多输出像素的坐标在计算中赋值了多次(冗余),但有些坐标却根本没有赋值过,这就导致在输出图像中出现“孔洞”,即对这些坐标没有可计算的像素值

(2)后向映射
为了克服前向映射的问题,常使用后向映射,也就是目标到源的映射。它需要访问输出图像中的每个像素并使用逆变换确定输入图像中需要采样像素值的坐标。其示意图如下:
在这里插入图片描述
同理,因为这种后向映射过程常产生在原始图像采样网格点之外的结果,一般还需要某种形式的插值,以计算一个像素的最佳值。

2、简单的插值方法

插值是非常普遍的,比如图像放大两倍可以通过像素复制来达到效果,而图像缩小两倍可以通过像素删除来完成。但这种简单粗暴的方式会遇到一些问题:

  • 当放大图像时,一些重复块的效应变得很明显
  • 当缩小图像时,可能会删除一些本质的信息
  • 这种简单粗暴的方式很难将其推广到任意的、非整数的缩放因子

下面简单介绍几种常见的插值方式,不会详细介绍原理,具体可自行查询。

3、零阶(最近邻)插值

这是一种很简单的插值思路,它将计算的坐标(x’, y’)舍入到它们最近的整数。通俗来讲,也就是通过变换后,(x’, y’)如果不是整数,将其四舍五入成整数。

显然,零阶(最近邻)插值简单且计算快,但其生成的结果质量低,包括:

  • 块效应:在块的边界会出现不连续,形成的图像有明显缺陷,在大尺度时更明显
  • 锯齿状直线,特别在旋转非90度整数倍的角度时更明显,如下图。

4、一阶(双线性)插值

双线性插值被用在深度学习的经典分割模型Mask RCNN中。它使用输入图像中参考像素附近的4个像素灰度值的加权函数来计算插值像素的灰度值。

它的视觉效果比最近邻插值要好,但是需要更多的CPU计算资源。如下图:

5、高阶插值

高阶插值方法更复杂,且计算代价更大。若使用3阶插值方法,可称为双立方插值。它考虑参考像素附近的4*4邻域并通过将该领域与一个立方函数卷积来计算插值像素的灰度值。

最后,我们整体看一下效果,对一幅旋转35度后的图像使用不同的插值方法,并且放大局部得到的结果如下图所示。
从上面的结果可以看出,最近邻插值虽然计算量少,但是其锯齿边缘效应很明显,而双线性插值和双立方插值结果不错。

以上是本期内容,建议自己动手来实践一下。如果需要图片和代码,可以关注公众号,回复关键字【matlab代码】即可获得。我会上传到云盘。

【声明】:学习笔记基于互联网上各种学习资源的个人整理。

以上是本期内容,下期介绍图像处理的几何操作实践。

我叫小保,一名计算机视觉爱好者、学习者、追随者,欢迎关注我【CV之道】一起学习。

猜你喜欢

转载自blog.csdn.net/ling_xiobai/article/details/124499299