opencv之图像插值

时间:2024-03-20 09:23:45

图像插值算法

1.定义

插值指的是在一幅图像[u,v]中,灰度值仅在整数位置有定义,然而输出图像[x,y]的灰度值一般由处在非整数坐标(u,v)值来决定

2.关于插值的映射方法

1.向前映射的插值法:原图像映射到输出图像中,原图像像素值由4个输出图像的像素进行分配

opencv之图像插值

用h(x,y)表示原图像,用f(x,y)表示目标图像,插值的原理就是利用整数位置上的像素值h(x,y)去构造对应位置分数位置的像素值h(x_fraction,y_fraction) = f(x,y)

– x_fraction可能为假分数(原图大于目标图),也可能为真分数(原图小于目标图)

f(dstx,dsty)=h(dstxSrcWdstW,dstySrcHdsty)f(dstx,dsty) = h(\frac{dstx*SrcW}{dstW},\frac{dsty*SrcH}{dsty})

2.向后映射的插值法:输出图像映射到原图像中,输出图像像素值由4个原图像的像素进行分配

opencv之图像插值

3.常用的插值算法

3.1 最近邻差值算法(向后映射)

原理:近似h(x_fraction,y_fraction)为最邻近的点(x,y)的h(x,y)对应的值。

将目标图像的点对应到源图像中,找到当前对应像素在原像素中最相邻的整数点像素值,作为目标图像的插值

opencv之图像插值

缺点:用该方法会有明显的块状效应

3.2 双线性插值

1.线性插值:把h函数构造成线性函数,求解h(x_fraction,y_fraction)

opencv之图像插值

2.双线性插值原理: 三次线性插值!

3.双线性插值(向后映射)原理: 将输出图映射到原图,如下图所示输出图在原图的映射位置h(x,y)的像素值由原图的h(0,0),h(0,1),h(1,0),h(1,1)所分配

opencv之图像插值

线性插值方程:
h(x,y)=ax+by+cxy+dh(x,y) = ax+by+cxy+d

1.对y=0方向进行插值求得h(x,0)即位置1
h(x,0)=h(0,0)+(x0)h(1,0)h(0,0)1h(x,0) = h(0,0)+(x-0)\frac{h(1,0)-h(0,0)}{1}
2.对y=1方向进行插值求得h(x,1)即位置2
h(x,1)=h(0,1)+(x0)h(1,1)h(0,1)1h(x,1) = h(0,1)+(x-0)\frac{h(1,1)-h(0,1)}{1}
3.对位置1,位置2构成的直线方向求得h(x,y)即位置3
h(x,y)=h(x,0)+(y0)h(x,1)h(x,0)1h(x,y) = h(x,0)+(y-0)\frac{h(x,1)-h(x,0)}{1}

4.综合前三步,h(x,y)由临近的四个像素决定,且四个像素对h(x,y)的权重贡献之和为1
h(x,y)=(1x)(1y)h(0,0)+(1x)yh(0,1)+x(1y)h(1,0)+xyh(1,1)h(x,y)=(1−x)(1−y)∗h(0,0)+(1−x)y∗h(0,1)+x(1−y)∗h(1,0)+xy∗h(1,1)

4.双线性插值(向前映射)原理: 将原图映射到输出图,如原图在输出图的映射位置为f(x,y)的像素值由输出图的f(0,0),f(0,1),f(1,0),f(1,1)所分配,

转换为插值的具体做法::输出图的该四个像素点的像素值都受原图的像素点影响,找到所有对某个输出图像素点有影响的所有原图像素点,根据逆变换求得输出图的像素值

如下述公式,由逆变换解出f(x,y)对输出图四个点像素贡献权重
f(0,0)=(1x)(1y)f(x,y)f(0,0)=(1−x)(1−y)*f(x,y)
f(0,1)=(1x)yf(x,y)f(0,1)=(1−x)y*f(x,y)
f(1,0)=x(1y)f(x,y)f(1,0)=x(1−y)*f(x,y)
f(1,1)=xyf(x,y)f(1,1)=xy∗f(x,y)