【数字图像处理】图像的最近邻插值、双线性插值和双三次插值

图像最近邻插值、双线性插值和双三次插值

O ( X , Y ) O(X,Y) O(X,Y)表示 H × W H\times W H×W的原始图像, G ( X ^ , Y ^ ) G(\hat{X},\hat{Y}) G(X^,Y^)表示 H ^ × Y ^ \hat{H}\times\hat{Y} H^×Y^的目标图像。

最近邻插值

最近邻插值法令目标图像在 ( x ^ , y ^ ) (\hat{x},\hat{y}) (x^,y^)的像素值 G ( x ^ , y ^ ) G(\hat{x},\hat{y}) G(x^,y^)等于逆变换到原始图像后 ( x , y ) (x,y) (x,y) 距离其最近的点的像素值。用公式表示为:

G ( x ^ , y ^ ) = O ( round ⁡ ( x ^ ⋅ W W ^ ) , round ⁡ ( y ^ ⋅ H H ^ ) ) G(\hat{x}, \hat{y})=O\left(\operatorname{round}\left(\frac{\hat{x} \cdot W}{\hat{W}}\right), \operatorname{round}\left(\frac{\hat{y} \cdot H}{\hat{H}}\right)\right) G(x^,y^)=O(round(W^x^W),round(H^y^H))

其中 x ^ ⋅ W W ^ \frac{\hat{x}\cdot W}{\hat{W}} W^x^W y ^ ⋅ H H ^ \frac{\hat{y}\cdot H}{\hat{H}} H^y^H为逆变换; r o u n d ( ) round() round()表示四舍五入,用于得到源图像中的最近点坐标。

双线性插值


双线性插值使用的逆变换为(需要考虑对齐):

x = x ^ ( W / W ^ ) + 0.5 ( W / W ^ − 1 ) y = y ^ ( H / H ^ ) + 0.5 ( H / H ^ − 1 ) \begin{array}{l} x=\hat{x}(W / \hat{W})+0.5(W / \hat{W}-1) \\ y=\hat{y}(H / \hat{H})+0.5(H / \hat{H}-1) \end{array} x=x^(W/W^)+0.5(W/W^1)y=y^(H/H^)+0.5(H/H^1)

双线性插值是在 X X X上进行两次线性插值计算,然后在 Y Y Y方向上进行一次插值计算。首先在 X X X方向上进行两次线性插值,得到:
O ( x , y 0 ) = x 1 − x x 1 − x 0 O ( x 0 , y 0 ) + x − x 0 x 1 − x 0 O ( x 1 , y 0 ) O ( x , y 1 ) = x 1 − x x 1 − x 0 O ( x 0 , y 1 ) + x − x 0 x 1 − x 0 O ( x 1 , y 1 ) \begin{array}{l} O\left(x, y_{0}\right)=\frac{x_{1}-x}{x_{1}-x_{0}} {O}\left(x_{0}, y_{0}\right)+\frac{x-x_{0}}{x_{1}-x_{0}} {O}\left(x_{1}, y_{0}\right) \\ O\left(x, y_{1}\right)=\frac{x_{1}-x}{x_{1}-x_{0}} {O}\left(x_{0}, y_{1}\right)+\frac{x-x_{0}}{x_{1}-x_{0}} O\left(x_{1}, y_{1}\right) \end{array} O(x,y0)=x1x0x1xO(x0,y0)+x1x0xx0O(x1,y0)O(x,y1)=x1x0x1xO(x0,y1)+x1x0xx0O(x1,y1)

然后在 Y Y Y方向上进行一次线性插值,得到:
O ( x , y ) = y 1 − y y 1 − y 0 O ( x , y 0 ) + y − y 0 y 1 − y 0 O ( x , y 1 ) O(x, y)=\frac{y_{1}-y}{y_{1}-y_{0}} O\left(x, y_{0}\right)+\frac{y-y_{0}}{y_{1}-y_{0}} O\left(x, y_{1}\right) O(x,y)=y1y0y1yO(x,y0)+y1y0yy0O(x,y1)

综合起来,就是双线性插值的结果
G ( x ^ , y ^ ) = ( y 1 − y ) ( x 1 − x ) ( y 1 − y 0 ) ( x 1 − x 0 ) O ( x 0 , y 0 ) + ( y 1 − y ) ( x − x 0 ) ( y 1 − y 0 ) ( x 1 − x 0 ) O ( x 1 , y 0 ) + ( y − y 0 ) ( x 1 − x ) ( y 1 − y 0 ) ( x 1 − x 0 ) O ( x 0 , y 1 ) + ( y − y 0 ) ( x − x 0 ) ( y 1 − y 0 ) ( x 1 − x 0 ) O ( x 1 , y 1 ) \begin{aligned} G(\hat{x}, \hat{y})= & \frac{\left(y_{1}-y\right)\left(x_{1}-x\right)}{\left(y_{1}-y_{0}\right)\left(x_{1}-x_{0}\right)} {O}\left(x_{0}, y_{0}\right) \\ & +\frac{\left(y_{1}-y\right)\left(x-x_{0}\right)}{\left(y_{1}-y_{0}\right)\left(x_{1}-x_{0}\right)} O\left(x_{1}, y_{0}\right) \\ & +\frac{\left(y-y_{0}\right)\left(x_{1}-x\right)}{\left(y_{1}-y_{0}\right)\left(x_{1}-x_{0}\right)} O\left(x_{0}, y_{1}\right) \\ & +\frac{\left(y-y_{0}\right)\left(x-x_{0}\right)}{\left(y_{1}-y_{0}\right)\left(x_{1}-x_{0}\right)} O\left(x_{1}, y_{1}\right) \end{aligned} G(x^,y^)=(y1y0)(x1x0)(y1y)(x1x)O(x0,y0)+(y1y0)(x1x0)(y1y)(xx0)O(x1,y0)+(y1y0)(x1x0)(yy0)(x1x)O(x0,y1)+(y1y0)(x1x0)(yy0)(xx0)O(x1,y1)

双三次插值

如图3所示,双三次插值通过对周边16个点进行加权计算得到目标像素点的值,加权系数常采用基于BiCubic基函数的方法,该函数形式如下:

W ( d ) = { ( a + 2 ) ∣ d ∣ 3 − ( a + 3 ) ∣ d ∣ 2 + 1  for  ∣ d ∣ ≤ 1 a ∣ d ∣ 3 − 5 a ∣ d ∣ 2 + 8 a ∣ d ∣ − 4 a  for  1 < ∣ d ∣ < 2 0  otherwise  W(d)=\left\{\begin{array}{cc} (a+2)|d|^{3}-(a+3)|d|^{2}+1 & \text { for }|d| \leq 1 \\ a|d|^{3}-5 a|d|^{2}+8a|d|-4 a & \text { for } 1<|d|<2 \\ 0 & \text { otherwise } \end{array}\right. W(d)= (a+2)d3(a+3)d2+1ad35ad2+8ad4a0 for d1 for 1<d<2 otherwise 

其中 a a a通常为-0.5或-1, d d d为16个点到 ( x , y ) (x,y) (x,y)沿 X X X Y Y Y轴的距离。双三次插值通过以下公式进行计算:

G ( x ^ , y ^ ) = ∑ m = 0 3 ∑ n = 0 3 W ( x m ) ⋅ W ( y n ) ⋅ O ( x m , y n ) G(\hat{x}, \hat{y})=\sum_{m=0}^{3} \sum_{n=0}^{3} W\left(x_{m}\right) \cdot W\left(y_{n}\right) \cdot O\left(x_{m}, y_{n}\right) G(x^,y^)=m=03n=03W(xm)W(yn)O(xm,yn)

import cv2 as cv
import matplotlib.pyplot as plt
img = plt.imread('***.jpg')
img_down = cv.resize(img, None, fx=0.2, fy=0.2, interpolation=cv.INTER_NEAREST)
img_up1 = cv.resize(img, None, fx=10, fy=10, interpolation=cv.INTER_NEAREST) # 最近邻插值
img_up2 = cv.resize(img, None, fx=10, fy=10, interpolation=cv.INTER_LINEAR)  # 双线性插值
img_up3 = cv.resize(img, None, fx=10, fy=10, interpolation=cv.INTER_CUBIC)  # 双三次插值


cv.imwrite('dowm5x.jpg', img_down)
cv.imwrite('INTER_NEAREST10x.jpg', img_up1)
cv.imwrite('INTER_LINEAR10x.jpg', img_up2)
cv.imwrite('INTER_CUBIC10x.jpg', img_up3)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/513392.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入理解直播美颜SDK背后的深度学习原理

直播美颜SDK技术背后涉及了深度学习原理的应用&#xff0c;今天我将为大家讲解美颜SDK其中的深度学习算法&#xff0c;还有一些基本原理与关键技术。 一、深度学习在直播美颜中的应用 直播美颜SDK的核心是基于深度学习的算法模型。这些模型通常由多个卷积神经网络组成&#xf…

SCI一区 | Matlab实现BES-TCN-BiGRU-Attention秃鹰算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测

SCI一区 | Matlab实现BES-TCN-BiGRU-Attention秃鹰算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测 目录 SCI一区 | Matlab实现BES-TCN-BiGRU-Attention秃鹰算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测预测效果基本介绍模型描述程序…

VS2022配置boost库-Windows为例

1. boost库下载 1&#xff09;下载boost库源码&#xff1a;https://www.boost.org/ 2&#xff09;以1.81版本为例&#xff0c;安装包如下 3&#xff09;下载后解压 比如我是放在E盘下面的boost文件夹 2. 安装配置 1&#xff09;打开VS2022命令行 2&#xff09;切换安装…

智慧城市治理:构建全域覆盖的城市时空感知体系

TSINGSEE青犀AI算法中台是一款平台型产品&#xff0c;专注于提供各行业中小场景部署解决方案。平台具备接入广、性能强、支持跨平台、芯片国产化等特点&#xff0c;可提供丰富的视图接入能力和智能分析能力。 平台采用了多项IT高新技术&#xff0c;包括视频编解码技术、嵌入式…

蓝桥杯刷题-04-岛屿个数-DFS

#include <iostream> #include<bits/stdc.h> #define int long long using namespace std; const int N2e510; typedef pair<int,int>pii;map<pii, int>st;//记录从{x&#xff0c;y}的距离是多少 int a[N];//存储原始路径vector<pii>edge[N];//存…

C语言 | Leetcode C语言题解之第6题Z字形变换

题目&#xff1a; 题解&#xff1a; char * convert(char * s, int numRows){int n strlen(s), r numRows;if (r 1 || r > n) {return s;}int t r * 2 - 2;char * ans (char *)malloc(sizeof(char) * (n 1));int pos 0;for (int i 0; i < r; i) { // 枚举矩阵的…

回溯算法|46.全排列

力扣题目链接 class Solution { public:vector<vector<int>> result;vector<int> path;void backtracking (vector<int>& nums, vector<bool>& used) {// 此时说明找到了一组if (path.size() nums.size()) {result.push_back(path);re…

Acwing.1388 游戏(区间DP对抗思想)

题目 玩家一和玩家二共同玩一个小游戏。 给定一个包含 N个正整数的序列。 由玩家一开始&#xff0c;双方交替行动。 每次行动可以在数列的两端之中任选一个数字将其取走&#xff0c;并给自己增加相应数字的分数。&#xff08;双初始分都是 0分&#xff09; 当所有数字都被…

做好产品定位的3个重点

产品定位对于项目而言至关重要&#xff0c;正确的产品定位有助于项目锁定目标市场&#xff0c;精准满足客户需求。通过差异化产品策略&#xff0c;让产品在众多竞品中脱颖而出&#xff0c;形成独特竞争优势&#xff0c;从而有助于产品价值的实现。 因此做好产品定位迫在眉睫&am…

【智能算法】猎豹优化器(CO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2022年&#xff0c;MA Akbari等人受到自然界中猎豹捕猎行为启发&#xff0c;提出了猎豹优化器&#xff08;The Cheetah Optimizer&#xff0c;CO&#xff09;。 2.算法原理 2.1算法思想 CO法对猎…

软件测试学习(一)

1.软件测试的定义 软件是控制计算机硬件工作的工具。 软件基本组成&#xff1a;客服端、服务器、数据库 软件产生过程&#xff1a;需求产生->需求文档->设计效果图->产品开发->产品测试->部署上线 软件测试的定义&#xff1a;使用技术手段来验证软件产品是否…

Java编程使用CGLIB动态代理介绍与实战演示

文章目录 前言技术积累核心概念主要功能适用场景与JDK动态代理的对比 实战演示定义待代理的目标类实现MethodInterceptor接口使用代理对象 测试结果写在最后 前言 在Java编程中&#xff0c;CGLIB (Code Generation Library) 是一个强大的高性能代码生成库&#xff0c;它通过生…

5.Python数据分析—Pandas数据结构详讲

5.Python数据分析—Pandas数据结构详讲 摘要个人简介简介Series定义和特点创建方法属性和方法 DataFrame定义和特点创建方法数据获取和操作 索引对象种类和应用作用和管理 摘要 Pandas是一个开源的Python数据分析库&#xff0c;提供了高性能、易用的数据结构和数据分析工具。它…

向量数据库实战介绍

本文将介绍三种常用的向量数据库&#xff1a;faiss, Milvus和Qdrant&#xff0c;并给出一个具体的使用例子。 向量数据库&#xff08;Vector Database&#xff09;是一种专门用于存储、管理、查询、检索向量的数据库&#xff0c;主要应用于人工智能、机器学习、数据挖掘等领域。…

STM32学习和实践笔记(4): 分析和理解GPIO_InitTypeDef GPIO_InitStructure (b)

继续上篇博文&#xff1a;STM32学习和实践笔记&#xff08;4&#xff09;: 分析和理解GPIO_InitTypeDef GPIO_InitStructure (a)-CSDN博客 往下写&#xff0c; 为什么&#xff1a;当GPIO_InitStructure.GPIO_PinGPIO_Pin_0 ; 时&#xff0c;其实就是将对应的该引脚的寄存器地…

如何处理Flutter内存泄漏检测和优化

处理Flutter内存泄漏问题是构建高性能、稳定的应用程序的关键部分之一。在本文中&#xff0c;我将详细介绍如何检测和优化Flutter内存泄漏问题&#xff0c;以确保应用程序的良好性能和用户体验。 1. 了解内存泄漏 在深入了解如何处理Flutter内存泄漏之前&#xff0c;首先需要了…

基于Springboot + MySQL + Vue 大学新生宿舍管理系统 (含源码)

目录 &#x1f4da; 前言 &#x1f4d1;摘要 &#x1f4d1;操作流程 &#x1f4da; 系统架构设计 &#x1f4da; 数据库设计 &#x1f4ac; 管理员信息属性 &#x1f4ac; 学生信息实体属性 &#x1f4ac; 宿舍安排信息实体属性 &#x1f4ac; 卫生检查信息实体属性 &…

LeetCode 第391场周赛个人题解

目录 哈沙德数 原题链接 思路分析 AC代码 换水问题 II 原题链接 思路分析 AC代码 交替子数组计数 原题链接 思路分析 AC代码 最小化曼哈顿距离 原题链接 思路分析 AC代码 哈沙德数 原题链接 思路分析 签到题&#xff0c;不说了 AC代码 class Solution:def s…

实时获取 Pacific Time Zone (太平洋时区) 时间

实时获取 Pacific Time Zone [太平洋时区] 时间 1. Google -> Pacific Time2. Pacific Time - exact time nowReferences 1. Google -> Pacific Time 2. Pacific Time - exact time now https://time.is/zh/PT References [1] Yongqiang Cheng, https://yongqiang.blog…

freeRTOS学习

总结 1.总结任务调度算法之间的区别 调度算法&#xff1a;抢占式调度&#xff1a;优先级高的任务可以打断低优先级任务的执行&#xff0c;适用于不同优先级任务的执行。 时间片轮换&#xff1a;分配时间片&#xff08;1ms&#xff09;&#xff0c;时间片耗尽时&#xff0c;任…