OpenCV学习笔记17_插值运算

前向映射:

如果一张图片需要缩小2倍,
图像缩放,本质上就是将每个像素点的矢量进行缩放,
也就是将矢量x方向和y方向的坐标值缩放,
那么图像中的所有坐标点都需要缩小到原来的1/2,
原来的图像通过缩小1/2到目标图像的这个过程就叫前向映射:
矩阵形式为:
[ u v ] = [ k x 0 0 k y ] [ x y ] \left[\begin{array}{c} u \\ v \end{array}\right]=\left[\begin{array}{cc} k_{x} & 0 \\ 0 & k_{y} \end{array}\right]\left[\begin{array}{l} x \\ y \end{array}\right] [uv]=[kx00ky][xy]

后向映射:

虽然前向映射的道理很简单,但是随之而来一个问题:值呢?值怎么映射?

每个像素点坐标对应的值是独立的,不可能通过简单的映射得到;
所以需要找到新像素点对应的原始像素点,再通过插值运算得到新像素点的值:
所以等式两边同时乘上转换矩阵的逆:

[ k x 0 0 k y ] − 1 [ u v ] = [ x y ] \left[\begin{array}{cc} k_{x} & 0 \\ 0 & k_{y} \end{array}\right]^{-1}\left[\begin{array}{l} u \\ v \end{array}\right]=\left[\begin{array}{c} x \\ y \end{array}\right] [kx00ky]1[uv]=[xy]

1、最近邻插值:

所谓最近邻插值就是当前新像素点的值可能反向映射之后的值并不存在,可能为小数,
那么就四舍五入取最近的一个像素点的值为当前新像素点的值;
理论上讲前向映射也是一样可以最近邻插值的;

2、双线性插值:

src的大小是3×3,目标图像dst的大小是4×4,考虑dst中(1,1)点像素对应原始图像像素点的位置为(0.75,0.75),如果使用最近邻算法来计算,原始图像的位置在浮点数取整后为坐标(0,0)。
考虑(0.75,0.75)这个信息,它表示在原始图像中的坐标位置,相比较取(0,0)点,
(0.75,0.75)貌似更接近(1,1)点,那如果将最近邻算法中的取整方式四舍五入的方式取(1,1)点,
同样会有丢的信息,即丢失了“0.25”部分的(0,0)点、(1,0)点和(0,1)点。

所以需要根据计算出的浮点数坐标,按照百分比各取四周的像素点的部分(带权计算)。
双线性插值的原理相类似

在这里插入图片描述

( w W X , h H Y ) ({\frac{w}{W}}X,{\frac{h}{H}}Y) (WwX,HhY)写成 ( x ′ + u , y ′ + v ) (x^\prime+u,y^\prime+v) (x+u,y+v)的形式,表示将x与y中的整数和小数分开表示uv分别代表小数部分。
根据权重比率的思想得到计算公式(x,y)表示坐标点的值:
( X , Y ) = ( 1 − u ) ∙ ( 1 − v ) ∙ ( x , y ) + ( u − 1 ) ∙ v ∙ ( x , y + 1 ) + u ∙ ( v − 1 ) ∙ ( x + 1 , y ) + ( u ∙ v ) ∙ ( x + 1 , y + 1 ) \left(X,Y\right)=\left(1-u\right)\bullet\left(1-v\right)\bullet\left(x,y\right)+\left(u-1\right)\bullet v\bullet\left(x,y+1\right)+u\bullet(v-1)\bullet(x+1,y)+(u\bullet v)\bullet(x+1,y+1) (X,Y)=(1u)(1v)(x,y)+(u1)v(x,y+1)+u(v1)(x+1,y)+(uv)(x+1,y+1)

3、双三次插值(立方卷积插值):

双三次插值假设最佳插值函数为

s ( x ) = sin ⁡ ( π ∗ x ) x s\left(x\right)=\frac{\sin{\left(\pi\ast x\right)}}{x} s(x)=xsin(πx)
利用三次多项式逼近
在这里插入图片描述

假定三次函数的一般式为(假设在距离范围内距离与原点的对应关系如下):

w x = a x 3 + b x 2 + c x + d wx=ax^3+bx^2+cx+d wx=ax3+bx2+cx+d

w y = n y 3 + m y 2 + k y + z wy=ny^3+my^2+ky+z wy=ny3+my2+ky+z

W ( x , y ) = w x ∗ w y W(x,y)=wx*wy W(x,y)=wxwy

W ( x , y ) W(x,y) W(x,y)为(x,y)点与原点(待插值点(u,v))反向映射点(x,y)的值;

那么求出未知系数需要16个方程组:(Bicubic Interpolation)
所以需要16邻域的像素权值。
步骤为:

1. 分别求出16个邻域与反向映射点(x,y)的距离,根据距离的不同代入不同的函数;
2. 分别根据距离代入逼近函数求出16邻域的权值;
3. 16邻域的权重值与像素值分别相乘;
4. 待插值点(u,v)的像素值为16邻域的像素值之和;

猜你喜欢

转载自blog.csdn.net/qq_40595787/article/details/121662100