计算机视觉教程2-3:图解双线性插值算法&最近邻插值算法

简介: 计算机视觉教程2-3:图解双线性插值算法&最近邻插值算法

目录

1 算法原理

提出此算法的背景是基于图片的缩放,在图片缩放的过程中,实质上就是将原图像像素矩阵像素值,填到目标图像像素矩阵中,目标图像像素矩阵可能比原图像像素矩阵大(图片放大),也可能小(图片缩小)。我们假设图片的宽( W i d t h Width Width)和高( H e i g h t Height Height)是按同比例缩放的,那么

srcWidth

srcX


=

dstWidth

dstX



s r c Y s r c H e i g h t = d s t Y d s t H e i g h t \frac{srcY}{srcHeight}=\frac{dstY}{dstHeight}

srcHeight

srcY


=

dstHeight

dstY



也就是,给定一个目标图片矩阵在( d s t X dstX dstX, d s t Y dstY dstY)处的坐标,计算出对应缩放前原图像的某点坐标( s r c X srcX srcX, s r c Y srcY srcY),将后者的像素RGB值填入前者。但在计算中常常遇到算出的( s r c X srcX srcX, s r c Y srcY srcY)为浮点型的情况,如图1。而在像素坐标中,所有的坐标都应该为整型,因此本文的这两个算法就是为了解决浮点型原图像坐标的处理问题。


image.png

image.png

1.1 最近邻插值

算法思路就是将浮点型坐标用int()强制转换为整型,在图2中,浮点型像素点P的坐标被强制转换成整型后,就转为A点,也即用A点单个点的像素代表目标图像矩阵中某个像素值,算法的优点在于速度快,但从图2中就可以看出此算法的误差很大,容易造成图像缩放失真。

1.2 双线性插值算法

image.png

算法思路是用浮点型像素点P周围相邻的四个像素,如图2中的A、B、C、D四个点像素的加权平均值来表征P的像素。具体的做法是用横轴、纵轴的距离来表示权重,例如: △ x P , A △x_{P,A} △x

P,A


= u u u, △ y P , A △y_{P,A} △y

P,A


= v v v。若用f(M)表示M点的像素值,则P点像素中的A像素分量就为

( 1 − u ) ( 1 − v ) f ( A ) (1-u)(1-v)f(A)

(1−u)(1−v)f(A)


显然,u、v越大,P点离A点的距离就越远;那么(1-u)(1-v)就越小,从而A像素f(A)的权重就越小。根据这个思路,可以写出:

f ( M ) = ( 1 − u ) ( 1 − v ) f ( A ) + u ( 1 − v ) f ( B ) + ( 1 − u ) v f ( C ) + u v f ( D ) f(M)=(1-u)(1-v)f(A)+u(1-v)f(B)+(1-u)vf(C)+uvf(D)

f(M)=(1−u)(1−v)f(A)+u(1−v)f(B)+(1−u)vf(C)+uvf(D)


现在要考虑一个目标图像像素坐标得出过程的问题,正如开头所列写的:

s r c X = s r c W i d t h d s t X d s t W i d t h srcX=srcWidth\frac {dstX}{dstWidth}

srcX=srcWidth

dstWidth

dstX



s r c Y = s r c H e i g h t d s t Y d s t H e i g h t srcY=srcHeight\frac{dstY}{dstHeight}

srcY=srcHeight

dstHeight

dstY



如果直接利用这个相似公式,得出的目标图像相对于原图像将不是中心化的,为了说明这一点,假设现在希望将一个5×5的图像缩小为3×3的图像,直接相似关系得出的结果为图3(i)所示,即最右侧和最下侧的像素其实没有参与运算,我们希望得到的图像是如图3(ii)的,这样的放缩才能更多地体现原图像的信息,因此我们需要对放缩公式进行一个补偿修正。


image.png

image.png

考虑将一个m×m的像素矩阵放缩为M×M的像素矩阵,原像素矩阵的中心为( ( m − 1 ) 2 \frac{(m-1)}{2}

2

(m−1)


, ( m − 1 ) 2 \frac{(m-1)}{2}

2

(m−1)


),例如一个5×5矩阵,其中心就为(2,2),若为偶数阶矩阵,其中心可理解为一个虚拟的浮点数像素。将目标像素矩阵的中心( ( M − 1 ) 2 \frac{(M-1)}{2}

2

(M−1)


, ( M − 1 ) 2 \frac{(M-1)}{2}

2

(M−1)


)代入相似公式,得到(仅列出横坐标,纵坐标同理):

s r c X = ( M − 1 ) 2 m M srcX=\frac{(M-1)}{2}\frac{m}{M}

srcX=

2

(M−1)


 

M

m



设置一个误差量:

b i a s = s r c X − ( m − 1 ) 2 bias=srcX-\frac{(m-1)}{2}

bias=srcX−

2

(m−1)



化简即得:

b i a s = 1 2 ( 1 − m M ) bias=\frac{1}{2}(1-\frac{m}{M})

bias=

2

1


(1−

M

m


)


因此对相似公式进行修正,得到:

s r c X = d s t X s r c W i d t h d s t W i d t h − b i a s srcX=dstX\frac{srcWidth}{dstWidth}-bias

srcX=dstX

dstWidth

srcWidth


−bias


s r c Y = d s t Y s r c H e i g h t d s t H e i g h t − b i a s srcY=dstY\frac{srcHeight}{dstHeight}-bias

srcY=dstY

dstHeight

srcHeight


−bias


这就是中心化公式的由来

2 源码实现

这里仅贴出双线性插值算法的核心代码段:

for i in range(dstHeight):
    for j in range(dstWidth):
        srcX = j*(srcWidth/dstWidth)-bias_Width    
        srcY = i*(srcHeight/dstHeight)-bias_Height
        srcX_0 = int(np.floor(srcX))
        u = np.float(srcX-srcX_0)
        srcX_1 = int(np.ceil(srcX))
        if srcX_1>srcWidth-1:             #消除数组越界问题
            srcX_1 = srcX_1-1
        srcY_0 = int(np.floor(srcY))
        v = srcY-srcY_0
        srcY_1 = int(np.ceil(srcY))
        if srcY_1>srcHeight-1:
            srcY_1 = srcY_1-1
        dstImgInfo[i][j] =(1-u)*(1-v)*img[srcY_0][srcX_0]+u*(1-v)*img[srcY_0][srcX_1]+(1-u)*v*img[srcY_1][srcX_0]+u*v*img[srcY_1][srcX_1]     

🚀 计算机视觉基础教程说明

image.png

🔥 更多精彩专栏


目录
相关文章
|
1月前
|
机器学习/深度学习 算法 搜索推荐
从理论到实践,Python算法复杂度分析一站式教程,助你轻松驾驭大数据挑战!
【10月更文挑战第4天】在大数据时代,算法效率至关重要。本文从理论入手,介绍时间复杂度和空间复杂度两个核心概念,并通过冒泡排序和快速排序的Python实现详细分析其复杂度。冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1);快速排序平均时间复杂度为O(n log n),空间复杂度为O(log n)。文章还介绍了算法选择、分而治之及空间换时间等优化策略,帮助你在大数据挑战中游刃有余。
60 4
|
2月前
|
人工智能 算法 安全
深度讲解-互联网算法备案指南和教程
随着人工智能和大数据技术的发展,互联网算法在内容推荐、用户画像等领域日益重要,但也带来了安全风险和合规挑战。国家互联网信息办公室为此发布了《互联网算法备案管理规定》,要求具有舆论属性或社会动员能力的互联网信息服务提供者进行算法备案,以确保算法透明性和合规性,维护网络健康秩序。唯安创远AI合规专家将解析备案的必要性、流程及其对企业的影响,帮助企业顺利完成备案。
228 3
|
2月前
|
机器学习/深度学习 人工智能 测试技术
AI计算机视觉笔记二十五:ResNet50训练部署教程
该项目旨在训练ResNet50模型并将其部署到RK3568开发板上。首先介绍了ResNet50网络,该网络由何恺明等人于2015年提出,解决了传统卷积神经网络中的退化问题。项目使用车辆分类数据集进行训练,并提供了数据集下载链接。环境搭建部分详细描述了虚拟环境的创建和所需库的安装。训练过程中,通过`train.py`脚本进行了15轮训练,并可视化了训练和测试结果。最后,项目提供了将模型转换为ONNX和PT格式的方法,以便在RK3568上部署。
|
4月前
|
机器学习/深度学习 算法 搜索推荐
从理论到实践,Python算法复杂度分析一站式教程,助你轻松驾驭大数据挑战!
【7月更文挑战第22天】在大数据领域,Python算法效率至关重要。本文深入解析时间与空间复杂度,用大O表示法衡量执行时间和存储需求。通过冒泡排序(O(n^2)时间,O(1)空间)与快速排序(平均O(n log n)时间,O(log n)空间)实例,展示Python代码实现与复杂度分析。策略包括算法适配、分治法应用及空间换取时间优化。掌握这些,可提升大数据处理能力,持续学习实践是关键。
124 1
|
4月前
|
机器学习/深度学习 人工智能 算法
计算机视觉:目标检测算法综述
【7月更文挑战第13天】目标检测作为计算机视觉领域的重要研究方向,近年来在深度学习技术的推动下取得了显著进展。然而,面对复杂多变的实际应用场景,仍需不断研究和探索更加高效、鲁棒的目标检测算法。随着技术的不断发展和应用场景的不断拓展,相信目标检测算法将在更多领域发挥重要作用。
|
5月前
|
算法 计算机视觉
图像处理之三种常见双立方插值算法
图像处理之三种常见双立方插值算法
37 2
|
4月前
|
机器学习/深度学习 算法 搜索推荐
一个开源且全面的C#算法实战教程
一个开源且全面的C#算法实战教程
|
5月前
|
存储 机器学习/深度学习 算法
Python算法基础教程
Python算法基础教程
30 0
|
6月前
|
机器学习/深度学习 计算机视觉
AIGC核心技术——计算机视觉(CV)预训练大模型
【1月更文挑战第13天】AIGC核心技术——计算机视觉(CV)预训练大模型
610 3
AIGC核心技术——计算机视觉(CV)预训练大模型
|
2月前
|
人工智能 测试技术 API
AI计算机视觉笔记二十 九:yolov10竹签模型,自动数竹签
本文介绍了如何在AutoDL平台上搭建YOLOv10环境并进行竹签检测与计数。首先从官网下载YOLOv10源码并创建虚拟环境,安装依赖库。接着通过官方模型测试环境是否正常工作。然后下载自定义数据集并配置`mycoco128.yaml`文件,使用`yolo detect train`命令或Python代码进行训练。最后,通过命令行或API调用测试训练结果,并展示竹签计数功能。如需转载,请注明原文出处。