浅析图像中的双线性插值

您所在的位置:网站首页 插值在图像处理中的应用 浅析图像中的双线性插值

浅析图像中的双线性插值

2023-01-14 22:14| 来源: 网络整理| 查看: 265

各位好:

这段时间想到一个问题,我们经常在研究图像时,会对其做resize操作,那么resize必定引起图像大小变化,多余的那些像素值都是哪里来的呢?对 ,是利用插值算法得到的,opencv中常用的有以下三种方法:

CV_INTER_NN - 最近邻插值CV_INTER_LINEAR - 双线性插值 (默认的方法)CV_INTER_CUBIC - 立方插值(双三次插值)

今天我们来介绍一下双线性插值方法,网上有很多直接出来双线性插值公式,如下:

f(x,y1) = \frac{x2-x}{x2-x1}*f(Q_{11}) + \frac{x-x1}{x2-x1}*f(Q_{21}) \\ f(x,y2) = \frac{x2-x}{x2-x1}*f(Q_{12}) + \frac{x-x1}{x2-x1}*f(Q_{22}) \\ 但是该公式是如何推到出来的?许多博客都没有讲清楚,如下:

\frac{f(x2)-f(x)}{x2-x1} = \frac{f(x)-f(x1)}{x-x1} \\ \Rightarrow f(x) = \frac{x2-x}{x2-x1}f(x1) + \frac{x-x1}{x2-x1}f(x2) \\ 所以继续在 y 方向进行线性插值,并且化简后得到:

f(x,y) = \frac{1}{(x2-x1)(y2-y1)}\left[ x2-x\;x-x1 \right]\left[ \begin{array}{ccc} f(Q_{11}) & f(Q_{12}) \\ f(Q_{21}) & f(Q_{22}) \\ \end{array} \right] \left[ \begin{array}{ccc} y2-y \\ y-y1 \\ \end{array}\right] \\

一般来说resize后的值来自于resize前原图像该点(浮点)四周的整点的值,因此一般x2 =x1+1,x1 = floor(x),y2=y1+1,y1 =floor(y)利用该关系可以进一步化简上式

不废话,上python代码

#!/usr/bin/env python # encoding: utf-8 import numpy as np import cv2 import math def bilinear(src_img, dst_shape): src_h, src_w = src_img.shape[0], src_img.shape[1] dst_h, dst_w = dst_shape[0], dst_shape[1] dst_img = np.zeros((dst_h, dst_w, 3), np.uint8) scale_h, scale_w = src_h/dst_h, src_w/dst_w for i in range(dst_h): for j in range(dst_w): src_x = float((j + 0.5) * scale_w - 0.5) src_y = float((i + 0.5) * scale_h - 0.5) src_x_int = math.floor(src_x) src_y_int = math.floor(src_y) # print(src_x,src_y) # print(src_h,src_w) if src_x_int+1 == src_w or src_y_int+1 == src_h: dst_img[i,j,:] = src_img[src_y_int,src_x_int,:] continue dst_img[i,j,:] = ((src_x_int+1-src_x)*src_img[src_y_int,src_x_int,:]+(src_x-src_x_int)*src_img[src_y_int,src_x_int+1,:])*(src_y_int+1-src_y) + \ ((src_x_int+1-src_x)*src_img[src_y_int+1,src_x_int,:] + (src_x-src_x_int)*src_img[src_y_int+1,src_x_int+1,:])*(src_y-src_y_int) return dst_img if __name__ == "__main__": src_img = cv2.imread("a.jpg") dst_shape=[1280,720] dst_img = bilinear(src_img, dst_shape) cv2.imwrite("b.jpg", dst_img)

前后效果

那么除了resize,图像处理中哪些地方还会用到呢?

本人经验中记得ROI Align中用到过双线性插值,起因是这样的:

在检测任务中,ROI Pooling是一种区域特征聚集的方式,在二级检测框架中经常用到,它将特征图的感兴趣位置池化为固定尺寸的特征图,以便进行批量操作并行计算,但是这些预选框通常是浮点数,这里存在一个量化的过程,一是边界值,而是切割成k x k 大小时,每个边界需要量化,因此ROI Align很好的解决这个问题,他利用双线性插值,这样就开始优雅起来了。

以上就是双线性插值用到的地方,关注生活,留心工作,欢迎大家讨论,共同成长!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3