计算机视觉笔记01_图像插值算法

图像插值算法

简介

在图像处理中,有平移,旋转,缩放等常用操作。这些操作并不改变图像的像素值,只是在图像上进行像素的重新排列,图像变换常用到一些插值算法,本节主要介绍常见的最近邻插值双线性插值

最近邻插值

最近邻插值,是将目标图像中的点,对应到源图像中后,找到最相邻的整数点,作为插值后的输出。

假设我们将一幅3X3的图像放大到4X4,用 f ( x , y ) f(x, y) f(x,y)表示目标图像, h ( x , y ) h(x, y) h(x,y)表示原图像,我们有如下公式:

f ( d s t x , d s t y ) = h ( d s t x s r c w i d t h d s t w i d t h , d s t y s r c h e i g h t d s t h e i g h t ) \begin{array}{c}f(dst_{x}, dst_{y}) = h(\frac{dst_{x} src_{width}} {dst_{width}}, \frac{dst_{y} src_{height}} {dst_{height}})\end{array} f(dstx,dsty)=h(dstwidthdstxsrcwidth,dstheightdstysrcheight)
f ( 0 , 0 ) = h ( 0 , 0 ) f ( 0 , 1 ) = h ( 0 , 0.75 ) = h ( 0 , 1 ) f ( 0 , 2 ) = h ( 0 , 1.50 ) = h ( 0 , 2 ) f ( 0 , 3 ) = h ( 0 , 2.25 ) = h ( 0 , 2 ) . . . \begin{array}{c}f(0,0)=h(0,0) \\f(0,1)=h(0,0.75)=h(0,1) \\f(0,2)=h(0,1.50)=h(0,2) \\f(0,3)=h(0,2.25)=h(0,2) \\...\\\end{array} f(0,0)=h(0,0)f(0,1)=h(0,0.75)=h(0,1)f(0,2)=h(0,1.50)=h(0,2)f(0,3)=h(0,2.25)=h(0,2)...
在这里插入图片描述
最近邻插值缺点:*
使用该方法作图像放大处理时,易出现明显的块状效应。
在这里插入图片描述

双线性插值

在讲双线性插值之前先看以一下线性插值,线性插值多项式为:
f ( x ) = a 1 x + a 0 f(x)=a_{1} x+a_{0} f(x)=a1x+a0
y = y 0 + ( x − x 0 ) y 1 − y 0 x 1 − x 0 = y 0 + ( x − x 0 ) y 1 − ( x − x 0 ) y 0 x 1 − x 0 y=y_{0}+\left(x-x_{0}\right) \frac{y_{1}-y_{0}}{x_{1}-x_{0}}=y_{0}+\frac{\left(x-x_{0}\right) y_{1}-\left(x-x_{0}\right) y_{0}}{x_{1}-x_{0}} y=y0+(xx0)x1x0y1y0=y0+x1x0(xx0)y1(xx0)y0

OpenCV缩放函数

cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])

参数:

参数描述
src【必需】原图像
dsize【必需】输出图像所需大小
fx【可选】沿水平轴的比例因子
fy【可选】沿垂直轴的比例因子
interpolation【可选】插值方式

插值方式:

cv.INTER_NEAREST最近邻插值
cv.INTER_LINEAR双线性插值
cv.INTER_CUBIC基于4x4像素邻域的3次插值法
cv.INTER_AREA基于局部像素的重采样

通常,缩小使用cv.INTER_AREA,缩放使用cv.INTER_CUBIC(较慢)和cv.INTER_LINEAR(较快效果也不错)。默认情况下,缩放都使用cv.INTER_LINEAR。

python 实现
import cv2

if __name__ == "__main__":
    img = cv2.imread('images/yuner.jpg', cv2.IMREAD_UNCHANGED)

    print('Original Dimensions : ', img.shape)

    # 按原始图像的30%缩小
    scale_percent = 30
    width = int(img.shape[1] * scale_percent / 100)
    height = int(img.shape[0] * scale_percent / 100)
    dim = (width, height)
    # resize image
    resized = cv2.resize(img, dim, interpolation=cv2.INTER_LINEAR)

    fx = 1.5
    fy = 1.5
    # 将前面缩小的图像按1.5倍放大 采用最近邻插值
    resized1 = cv2.resize(resized, dsize=None, fx=fx, fy=fy, interpolation=cv2.INTER_NEAREST)

    # 将前面缩小的图像按1.5倍放大 采用双线性值
    resized2 = cv2.resize(resized, dsize=None, fx=fx, fy=fy, interpolation=cv2.INTER_LINEAR)
    print('Resized Dimensions : ', resized.shape)

    cv2.imshow("Resized image", resized)
    cv2.imshow("INTER_NEAREST image", resized1)
    cv2.imshow("INTER_LINEAR image", resized2)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

在这里插入图片描述
0.3倍缩小
在这里插入图片描述

1.5倍放大 最近邻插值
在这里插入图片描述

1.5倍放大 双线性插值
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值