<图像处理> 图像插值算法

图像插值算法

图像插值在图像处理中常用于调整图像尺寸或变形,其目标是根据给定像素点周围像素点的信息来预测该像素点的值。

常见的图像插值算法可以分为两类:自适应和非自适应。自适应的方法可以根据插值内容的特点来进行调整,而非自适应的方法对所有像素点都进行相同的处理。非自适应算法包括最近邻插值双线性插值双三次插值样条插值sinc插值lanczos插值等。这些算法可以根据需要调整插值的精度和计算复杂度,以实现图像的扭曲和缩放。

最近邻插值

最近邻插值是一种简单的插值方法,它选择离目标点最近的已知点的值作为新插入点的值。当源图像大小为 S r c W i d t h SrcWidth SrcWidth和 S r c H e i g h t SrcHeight SrcHeight,目标图像大小为 D s t W i d t h DstWidth DstWidth和 D s t H e i g h t DstHeight DstHeight,或者涨缩比例为 S x S_x Sx和 S y S_y Sy,则计算目标图像任意像素横纵坐标 d s t x dst_x dstx和 d s t y dst_y dsty如下:

  1. 如果 S x S_x Sx和 S y S_y Sy均为0,则先计算 S x S_x Sx和 S y S_y Sy
    S x = r o u n d ( D s t W i d t h / S r c W i d t h ) S_{x}=round(DstWidth/SrcWidth) Sx=round(DstWidth/SrcWidth) //水平涨缩比例
    S y = r o u n d ( D s t H e i g h t / S r c H e i g h t ) S_{y}=round(DstHeight/SrcHeight) Sy=round(DstHeight/SrcHeight) //竖直涨缩比例
  2. 计算目标图像->源图像的涨缩比例
    S x i n v = 1. / S x S_{xinv}=1./S_x Sxinv=1./Sx //反水平涨缩比例
    S y i n v = 1. / S y S_{yinv}=1./S_y Syinv=1./Sy //反竖直涨缩比例
  3. 计算目标像素在源图像中的坐标,注意边界条件
    d s t x = r o u n d ( s r c x ∗ S x i n v ) dst_x=round(src_x*S_{xinv}) dstx=round(srcx∗Sxinv) //水平坐标
    d s t y = r o u n d ( s r c y ∗ S y i n v ) dst_y=round(src_y*S_{yinv}) dsty=round(srcy∗Syinv) //竖直坐标
  4. 计算目标图像像素值
    I D s t ( x , y ) = I S r c ( d s t x , d s t y ) I_{Dst}(x,y)=I_{Src}(dst_x,dst_y) IDst(x,y)=ISrc(dstx,dsty)

双线性插值

双线性插值则是在两个方向上进行线性插值,通过对四个最近的已知点进行加权平均来确定新插入点的值,如下图所示,点P为目标图像任意像素坐标通过一定的涨缩比例变换至源图像的坐标位置,计算方式如下:

  1. 利用上述最近邻方法,计算目标图像像素坐标在源图像中的坐标位置
  2. 计算坐标偏差
    点P坐标 ( x , y ) (x,y) (x,y), t , u t,u t,u为小数部分坐标, t = x − x 0 , u = y − y 0 t=x-x0,u=y-y0 t=x−x0,u=y−y0
  3. 先计算水平方向
    Q1,Q2线性插值: I Q 11 = I ( x 0 , y 0 ) ∗ ( 1 − t ) + I ( x 1 , y 0 ) ∗ t I_{Q11} = I(x_0,y_0) * (1-t) + I(x_1, y_0) * t IQ11=I(x0,y0)∗(1−t)+I(x1,y0)∗t
    Q3,Q4线性插值: I Q 22 = I ( x 0 , y 1 ) ∗ ( 1 − t ) + I ( x 1 , y 1 ) ∗ t I_{Q22} = I(x_0, y_1) * (1-t) + I(x_1,y_1) *t IQ22=I(x0,y1)∗(1−t)+I(x1,y1)∗t
  4. 利用Q11, Q22的值,进行垂直方向权重计算得出计算采样点值
    I D s t ( x , y ) = I Q 11 ∗ ( 1 − u ) + I Q 22 ∗ u I_{Dst}(x,y) = I_{Q11}*(1-u) + I_{Q22} * u IDst(x,y)=IQ11∗(1−u)+IQ22∗u

双三次插值

双三次插值则是在两个方向上进行三次插值,通过对16个最近的已知点进行加权平均来确定新插入点的值。待补充算法。

OpenCV函数

void cv::resize(InputArray src, OutputArray dst, Size dsize, double fx = 0, double fy = 0, int interpolation = INTER_LINEAR)	

Parameters
src				输入图像;
dst				输出图像,其大小为dsize(当它非零时)或由src.size()、fx和fy计算得到的大小,类型与src相同;
dsize			输出图像尺寸,如果它等于0(在Python中为None),则计算为:dsize = Size(round(fx*src.cols), round(fy*src.rows)),dsize或者fx和fy都必须非零。
fx				水平轴比例因子,当它等于0时,计算为(double)dsize.width/src.cols
fy				纵轴比例因子,当它等于0时,计算为(double)dsize.height/src.rows
interpolation	插值方式, 见InterpolationFlags

InterpolationFlags

  • INTER_NEAREST :最近邻插值
  • INTER_LINEAR :双线性插值
  • INTER_CUBIC :双立方插值
  • INTER_AREA :利用像素面积关系进行重采样。它可能是图像抽取的首选方法,因为它可以得到与莫尔无关的结果。但当图像被放大时,它类似于INTER_NEAREST方法。
  • INTER_LANCZOS4 :8x8邻域上的LANCZOS4插值
  • INTER_LINEAR_EXACT :位精确双线性插值
  • INTER_NEAREST_EXACT :位精确近邻插值。这将产生与PIL、scikit-image或Matlab中的最近邻方法相同的结果。
  • INTER_MAX :插值掩码
  • WARP_FILL_OUTLIERS :标志,填充目标图像的所有像素。如果其中一些对应于源图像中的异常值,则将其设置为零
  • WARP_INVERSE_MAP :标志,逆变换,例如, linearPolar or logPolar 两种变化:flag is not set: dst(ρ,ϕ)=src(x,y);flag is set: dst(x,y)=src(ρ,ϕ);

参考

  1. https://blog.csdn.net/jia20003/article/details/6907152
  2. https://blog.csdn.net/jia20003/article/details/6915185
相关推荐
这是一个图像35 分钟前
从opencv-python入门opencv--图像处理之图像滤波
图像处理·opencv·计算机视觉·中值滤波·高斯滤波·双边滤波·图像滤波
爱吃生蚝的于勒2 小时前
C语言内存函数
c语言·开发语言·数据结构·c++·学习·算法
ChoSeitaku7 小时前
链表循环及差集相关算法题|判断循环双链表是否对称|两循环单链表合并成循环链表|使双向循环链表有序|单循环链表改双向循环链表|两链表的差集(C)
c语言·算法·链表
Fuxiao___7 小时前
不使用递归的决策树生成算法
算法
我爱工作&工作love我7 小时前
1435:【例题3】曲线 一本通 代替三分
c++·算法
学术搬运工7 小时前
【珠海科技学院主办,暨南大学协办 | IEEE出版 | EI检索稳定 】2024年健康大数据与智能医疗国际会议(ICHIH 2024)
大数据·图像处理·人工智能·科技·机器学习·自然语言处理
白-胖-子8 小时前
【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-统计数字
开发语言·c++·算法·蓝桥杯·等考·13级
workflower8 小时前
数据结构练习题和答案
数据结构·算法·链表·线性回归
好睡凯8 小时前
c++写一个死锁并且自己解锁
开发语言·c++·算法
Sunyanhui18 小时前
力扣 二叉树的直径-543
算法·leetcode·职场和发展