学习 interpolation 算法

2020年11月19日 / 18次阅读 / Last Modified 2021年2月9日
图像处理

当把一个图片缩放(image scaling),比如放大时,我们可能会看到马赛克(pixelated)的效果,这些马赛克效果就是一种interpolation的处理结果。

放大图片会导致图片显示区域的分辨率超过图片本身的分辨率,这些多出来的pixel不能空白,需要有一种机制去给他们填充内容(颜色),这就是interpolation要做的事情。不仅仅在图片处理上,在科学和其它工程领域,也有很多地方需要interpolate技术,这种技术本质上,就是用相邻的数据点去预测空白的点位。

(缩小图片,就是简单的按比例丢弃pixel吗?)

nearest neighbor interpolation

这是最简单最快速的interpolation算法了,就是直接取临近点位的值来作为空白点位的值。比如下面这个函数图:

nearest neighbor interpolation
nearest neighbor interpolation

红色的点为已知的,蓝色就是用nearest方法来预测的值。

别看nearest算法简单粗暴,在图像处理上常常被使用,比如我们放大一张图片时,使用nearest算法就能得到一张马赛克图:

用nearest算法放大图像
用nearest算法放大图像

一个4x4的图,用nearest放大到8x8,如上图效果。

nearest算法用在图像处理上(2D),会产生很明显的马赛克效果。

2D nearest

上一段说的是1D的nearest,2D就是两个方向。图像处理领域一般都是用2D的方法处理数据。

linear interpolation

plot曲线的时候,常常见到这种算法:

linear interpolation
linear interpolation

由于数据量不足,在画曲线的时候,看到的效果就入上图。

bilinear

双向线性interpolation,双向,就是x和y两个方向。

比如放大图像,图像是2D的,这个时候bilinear就在两个方向上进行相对平滑的interpolation。

这是openCV接口的默认值。

cubic

cubic interpolation就是求一个三次的方程,它的思想就是把已知的数分为一个一个的小区间,拟合到曲线上去,就是一个多分段函数高阶函数(此处的阶数为3)。

用一个3次方程去拟合一系列的点,That's it.

bicubic

两个方向上做cubic。

看图

下面这种图来自wiki,非常清晰的说明了以上6种interpolation算法的原理。

当然,interpolation算法不止这些,不过我认为以上几种是很基本的,一个问题:为什么算法从linear直接到了cubic,没有2次的算法呢?

注意观察interpolation计算需要的数据量。nearest和linear,不管是1D还是2D,需要的数据都是一样的,分别是2个点和4个点。cubic计算需要4个点,因为一个3次方程有4个系数,4个点可以解出这4个系数。bicubic的计算,就需要16个点。

-- EOF --

本文链接:https://www.pynote.net/archives/2834

留言区

邮箱地址不会被公开。 必填项已用*标注


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top