Resize:最近邻插值、双线性插值、双三次插值

Resize:最近邻插值、双线性插值、双三次插值

    • Opencv resize函数
      • 1. 最近邻插值(INTER_NEAREST)
        • 1.1 原理
        • 1.2 代码实例
        • 1.3 简单的代码复现
        • 1.4 特点
      • 2. 双线性插值(INTER_LINEAR)(默认值)
        • 2.1 原理
        • 2.2 简单的代码复现
      • 3. 双三次插值(INTER_CUBIC)
      • 4. 三种方法的直观对比

Opencv resize函数

官方文档:Opencv resize()

void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR );
参数含义: 
InputArray src     -原图像 
OutputArray dst    -输出图像 
Size dsize         -目标图像的大小 
double fx=0        -在x轴上的缩放比例 
double fy=0        -在y轴上的缩放比例 
int interpolation  -插值方式,有以下5种方式 INTER_NEAREST      -最近邻插值 
INTER_LINEAR       -双线性插值 (默认使用) 
INTER_AREA         -区域插值。 
INTER_CUBIC        -三次样条插值,也叫立方插值(超过4*4像素邻域内的双三次插值)
INTER_LANCZOS4     -Lanczos插值(超过8*8像素邻域的Lanczos插值)

当不输入fx和fy时,函数会自动计算

fx = float(src.shape[1] / dsize[1])
fy = float(src.shape[0] / dsize[0])

python中cv2.resize默认的是INTER_LINEAR官方建议:如果是缩小图片,使用INTER_AREA插值算法看起来是最好的,如果是放大图片,可以选择INTER_CUBIC(慢)或INTER_LINEAR(快但效果还不错)。

官方原文:To shrink an image, it will generally look best with INTER_AREA interpolation, whereas to enlarge an image, it will generally look best with INTER_CUBIC (slow) or INTER_LINEAR (faster but still looks OK).

1. 最近邻插值(INTER_NEAREST)

1.1 原理

最近邻插值,也称为零阶插值。计算原理为,目标图像位置直接采用与它最邻近位置的原始图像的像素点为其赋值

目标图像位置(dst_x, dst_y)最邻近的原始图像位置(src_x, src_y)的计算:src_x = int(dst_x / scale_x)src_y = int(dst_y / scale_y),其中scale_xscale_y分别表示在图像宽度方向和高度方向的缩放比例。

1.2 代码实例

使用一个灰度图实例进行放大缩小

import numpy as np
import cv2# 生成3*3的灰度图
img = np.array([[1,2,3],[4,5,6],[7,8,9]], dtype=np.uint8)# 放大一倍
resized_up = cv2.resize(img, None, fx=2, fy=2, interpolation=cv2.INTER_NEAREST)# 缩小一倍
resized_down = cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_NEAREST)# 缩小一倍再放大一倍
resized_down_up = cv2.resize(resized_down, None, fx=2, fy=2, interpolation=cv2.INTER_NEAREST)print(img, resized_up, resized_down, resized_down_up)
(array([[1, 2, 3],[4, 5, 6],[7, 8, 9]], dtype=uint8),array([[1, 1, 2, 2, 3, 3],[1, 1, 2, 2, 3, 3],[4, 4, 5, 5, 6, 6],[4, 4, 5, 5, 6, 6],[7, 7, 8, 8, 9, 9],[7, 7, 8, 8, 9, 9]], dtype=uint8),array([[1, 3],[7, 9]], dtype=uint8)),
array([[1, 1, 3, 3],[1, 1, 3, 3],[7, 7, 9, 9],[7, 7, 9, 9]], dtype=uint8)

由上可知:

  • 当dsize不指定的时候,则由fx和fy计算后四舍五入得到
  • 对同一张图缩小再放大,与原图不会保持一致
1.3 简单的代码复现
  • 官方函数
import cv2# 读取图像
img = cv2.imread('F:/Datas/kaggle/archive/test/apple/apple.jpg')# 缩放尺寸
dim = (int(img.shape[1] * 2), int(img.shape[0] * 2))# 使用最近邻插值缩放图像
resized = cv2.resize(img, dim, fx=2, fy=2, interpolation = cv2.INTER_NEAREST)# 显示缩放后的图像
cv2.imshow("Original image", img)
cv2.imshow("Resized image", resized)
cv2.waitKey(0)
cv2.destroyAllWindows()# 将图片写入本地
cv2.imwrite("F:/Datas/kaggle/archive/test/apple/applex2.jpg", resized)
  • 简单的复现
def resizeNearestRGB(src, dsize, fx, fy):cols, rows = dsizedst = np.zeros((rows, cols, 3), dtype=np.uint8)for i in range(rows):for j in range(cols):x = int(j / fx)y = int(i / fy)dst[i, j][0] = src[y, x][0]dst[i, j][1] = src[y, x][1]dst[i, j][2] = src[y, x][2]return dstimg = cv2.imread('F:/Datas/kaggle/archive/test/apple/apple.jpg')dim = (int(img.shape[1] * 2), int(img.shape[0] * 2))
new_image = resizeNearestRGB(img, dim, 2, 2)cv2.imshow("Original image", img)
cv2.imshow("Resized image", new_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 比较两个矩阵是否相等
if np.array_equal(resized, new_image):print("两个矩阵相等")
else:print("两个矩阵不相等")OUT: 两个矩阵相等

在这里插入图片描述

1.4 特点

由于是以最近的点作为新的插入点,因此边缘不会出现渐变过渡区域,这也导致缩放后的图像容易出现锯齿的现象

在这里插入图片描述

2. 双线性插值(INTER_LINEAR)(默认值)

2.1 原理

双线性插值,又称双线性内插。其核心思想是在x和y两个方向分别进行线性插值。

1) 将目标图像的位置(dst_x, dst_y)映射到原图P(src_x, src_y)中,但这时取得的是float格式的结果;

src_x = float(dst_x / scale_x)
src_y = float(dst_y / scale_y)

2)得到P点在原图中最邻近的4个点Q11Q12Q21Q22
在这里插入图片描述

3)首先在x方向进行两次线性插值得到R1R2两个点的像素值f(R1)f(R2),然后再在y方向一次线性插值得到最终点P的像素值f(P),将该值赋值给目标图像(dst_x, dst_y)注意此处如果先在y方向插值,再在x方向插值,其结果是一样的

在这里插入图片描述

在这里插入图片描述

2.2 简单的代码复现
  • 官方代码
import cv2# 读取图像
img = cv2.imread('F:/Datas/kaggle/archive/test/apple/apple.jpg')# 缩放尺寸
dim = (int(img.shape[1] * 2), int(img.shape[0] * 2))# 使用最近邻插值缩放图像
resized = cv2.resize(img, dim, fx=2, fy=2, interpolation = cv2.INTER_LINEAR)# 显示缩放后的图像
cv2.imshow("Original image", img)
cv2.imshow("Resized image", resized)
cv2.waitKey(0)
cv2.destroyAllWindows()# 将图片写入本地
cv2.imwrite("F:/Datas/kaggle/archive/test/apple/applex2.jpg", resized)
  • 简单的复现
def resizeNearestRGB(src, dsize, fx, fy):cols, rows = dsizedst = np.zeros((rows, cols, 3), dtype=np.uint8)for i in range(rows):for j in range(cols):x = j / fxy = i / fyx1, y1 = int(x), int(y)x2 = min(x1 + 1, src.shape[1] - 1)y2 = min(y1 + 1, src.shape[0] - 1)Q11, Q21 = src[y1, x1], src[y1, x2]Q12, Q22 = src[y2, x1], src[y2, x2]if x2 == x1:R1 = Q11R2 = Q12else:R1 = Q11 * (x2 - x)/(x2 - x1) + Q21 * (x - x1)/(x2 - x1)R2 = Q12 * (x2 - x)/(x2 - x1) + Q22 * (x - x1)/(x2 - x1)if y2 == y1:P = R1else:P = R1 * (y2 - y)/(y2 - y1) + R2 * (y - y1)/(y2 - y1)dst[i, j] = Preturn dstimage = cv2.imread('F:/Datas/kaggle/archive/test/apple/apple.jpg')new_size = (int(image.shape[1] * 2), int(image.shape[0] * 2))
new_image = resizeNearestRGB(image, new_size, 2, 2)cv2.imshow('new image', new_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

自己复现的代码得到的像素值和opencv中内部实现存在一点偏差,可能opencv内部有进行优化
在这里插入图片描述

双线性内插值算法放大后的图像质量较高,不会出现像素值不连续的情况,然而此算法具有低通滤波器的性能,使高频分量受损,所以可能会使图像轮廓在一定程序上变得模糊。

3. 双三次插值(INTER_CUBIC)

在这里插入图片描述

双立方插值是双线性插值的扩展,又称双三次插值,使用相邻的16(4x4)个像素点的加权之和进行插值,每个像素的权重由基于距离的函数取得。

双立方插值算法比双线性插值能更好地保留细节、增加锐度和清晰度,但是,它可能会导致波纹。

在这里插入图片描述
在这里插入图片描述

4. 三种方法的直观对比

三种方法的对比:25(5x5)个拼凑在一起的单位方块,颜色表示函数值,黑点是指定数据被插值的位置。双线性插值得到的图像在正方形边界处会有像素值突变现象。
在这里插入图片描述

参考

图像处理中常见的几种插值方法:最近邻插值、双线性插值、双三次插值(附Pytorch测试代码)

维基百科

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis教程——Redis string 字符串

Redis 是一款开源的高性能键值对存储数据库,支持多种数据结构,其中之一是字符串(String)。在 Redis 中,字符串是二进制安全的,这意味着字符串可以包含任意数据,包括图片、音频、视频等。 Redis…

【C++练级之路】【Lv.6】【STL】string类的模拟实现

文章目录 引言一、成员变量二、默认成员函数2.1 constructor2.2 copy constructor2.3 destructor2.4 operator 三、迭代器3.1 begin3.2 end 四、元素访问4.1 operator[ ] 五、容量5.1 size5.2 capacity5.3 reserve5.4 resize 六、修改6.1 push_back6.2 append6.3 operator6.4 i…

spring boot学习第八篇:通过spring boot、jedis实现秒单

参考:Redis实现分布式锁的7种方案 - 知乎 1、 准备数据库表,如下SQL表示库存表,有主键ID和库存数量字段 CREATE TABLE t_stock (id bigint(20) NOT NULL AUTO_INCREMENT,quantity bigint(20) NOT NULL,PRIMARY KEY (id) ) ENGINEInnoDB DEF…

2023年全球软件开发大会(QCon北京站2023)9月:核心内容与学习收获(附大会核心PPT下载)

随着科技的飞速发展,全球软件开发大会(QCon)作为行业领先的技术盛会,为世界各地的专业人士提供了交流与学习的平台。本次大会汇集了全球的软件开发者、架构师、项目经理等,共同探讨软件开发的最新趋势、技术与实践。本…

ChatGPT与文心一言:两大AI助手智能回复、语言准确性、知识库丰富度比较

ChatGPT与文心一言:两大AI助手智能回复、语言准确性、知识库丰富度比较 在现代科技飞速发展的时代,人工智能已经成为了我们生活中不可或缺的一部分。特别是在对话AI领域,两大巨头ChatGPT和文心一言以其出色的性能和广泛的应用引起了大家的广…

Agent Attention:Softmax与线性注意力的融合研究

摘要 https://arxiv.org/pdf/2312.08874.pdf 在Transformer中,注意力模块是其关键组件。虽然全局注意力机制提供了高度的表达能力,但其过高的计算成本限制了其在各种场景下的应用。本文提出了一种新颖的注意力范式,称为Agent Attention,以在计算效率和表示能力之间取得良好…

返利机器人的前景分析

返利机器人的前景分析 大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天,我将为你揭示返利机器人在2024年的赚钱前景。 一、返利机器人的发展历程 返…

20240116金融读报1分钟小得

真是羊毛逮着一个薅。银发贷款,助力适老企业腾飞,提前买股新蓝海 强化对科技创新、先进制造、绿色发展等重点领域的精准支持,引导资金更多流向民营小微、乡村振兴等环节 提升科技型企业“首贷率”,这会不会是今年银行人的kpi&…

提供多语种客户服务的正确方法:让你更接近全球客户

优质的客户支持是任何成功企业的核心。每位客户都希望得到全天候的及时响应。事实上,根据《哈佛商业评论》的研究报告,快速响应会促使人们在未来支付更多的费用。此外,在与全球客户打交道时,您的沟通必须超越语言障碍。用客户的语…

Java Chassis 3技术解密:注册中心分区隔离

原文链接:Java Chassis 3技术解密:注册中心分区隔离-云社区-华为云 注册中心负责实例的注册和发现,对微服务可靠运行起到举足轻重的作用。实例变更感知周期是注册中心最重要的技术指标之一。感知周期代表提供者的实例注册或者下线后&#xf…

2024 CKA 题库 | 10、创建 PV

不等更新题库 文章目录 10、创建 PV题目:考点:参考链接:解答:更换 context创建 pv yaml创建 pv 检查 10、创建 PV 题目: 设置配置环境: [candidatenode-1] $ kubectl config use-context hk8sTask 创建名为 app-config 的 persistent volume&#xff0…

Java后端sql编写

Java后端sql编写 注意事项二级目录三级目录 注意事项 在后端编写sql,不要直接编写sql语句进行查询 比如直接在service实现类中写下图这种语句 二级目录 三级目录

Python文本向量化入门(三):查看默认词袋

在文本分析和自然语言处理中,将文本数据转换为数值型格式是至关重要的第一步。这有助于我们利用机器学习算法进行更高效的数据分析。Scikit-learn库中的CountVectorizer类是一个非常有用的工具,它可以将文本数据转换为词频矩阵。 首先,我们需…

QT 类介绍

1. QThread类 QThread类是Qt中的线程类,用于创建和管理线程。使用QThread类可以方便地创建和管理线程,并可以在不同的线程之间进行通信和同步。 2. QRunnable类 QRunnable类是Qt中的可执行类,用于定义需要在线程中执行的任务。使用QRunnable类…

《如何制作类mnist的金融数据集》——1.数据集制作思路

1.数据集制作思路(生成用于拟合金融趋势图像的分段线性函数) 那么如何去制作这样的一个类minist的金融趋势曲线数据集呢? 还是如上图所示,为了使类别平均分布,因此可以选取三种“buy”的曲线、三种“sell”…

Java基础面试题汇总

☆* o(≧▽≦)o *☆嗨~我是小奥🍹 📄📄📄个人博客:小奥的博客 📙📙📙Github:传送门 📅📅📅面经分享(牛客主页)…

【笔记】Helm-3 主题-5 Helm来源和完整性

Helm来源和完整性 Helm有一个来源工具帮助chart用户检测包的完整性和来源。使用基于PKI,GnuPG及流行包管理器的行业标准工具,Helm可以生成和检测签名文件。 概述 完整性是通过比较chart的出处记录来建立的。出处记录存储在出处文件,和打包好…

汽车研发测试大全

车研发中需要做的试验,这些试验都是保证我们的车能安全、稳定、可靠行驶的必要条件。主要包含以下内容: 一、整车试验项目 1.1整车可靠性试验 1.2 NVH试验 1.3 HVAC试验 1.4 EMC试验 1.5 化学分析试验 1.6 整车道路性能试验 二、零部件试验项目 …

什么是NTFS格式文件系统?Tuxera NTFS for Mac2024下载步骤

一般磁盘格式分为:FAT、FAT32、NTFS,这几种格式目前是我们最常遇到的文件系统格式,其中现在遇到最多的就是NTFS格式,为更好地了解这类文件系统格式,小编今天专门介绍一下什么是NTFS格式文件系统以及它的特点和局限性。…

git提交文本或者word到git教程,git创建仓库时候自带

简易的命令行入门教程: Git 全局设置: git config --global user.name “XX” git config --global user.email “XXXqq.com” 创建 git 仓库: mkdir test cd test git init touch README.md git add README.md git commit -m “first commit” git remote add origin https:…