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,一经查实,立即删除!

相关文章

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)作为行业领先的技术盛会,为世界各地的专业人士提供了交流与学习的平台。本次大会汇集了全球的软件开发者、架构师、项目经理等,共同探讨软件开发的最新趋势、技术与实践。本…

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

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

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

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

Java后端sql编写

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

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

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

汽车研发测试大全

车研发中需要做的试验,这些试验都是保证我们的车能安全、稳定、可靠行驶的必要条件。主要包含以下内容: 一、整车试验项目 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:…

eclipse ADT安装及abap cds模版创建

文章目录 1.前提2.安装3.创建cds模版 abap cds 常用语法 https://blog.csdn.net/weixin_49198221/article/details/135531478?spm1001.2014.3001.5501 1.前提 需要了解版本关系: **1.eclipse:**2023-06 (4.28), 2023-09 (4.29), 2023-12 (4.30) 2.Windows: ​ 1.Windows …

基本BGP配置试验 :配置 IBGP 和 EBGP

一、预习: BGP:Border Gateway Protocol 没有精妙的算法,但能承载大量的路由,它不生产路由,它是路由的搬运工 使用TCP做为传输层协议,端口号179,使用触发式路由更新 1. BGP路由…

LiveGBS流媒体平台GB/T28181功能-基础配置接入控制白名单黑名单配置控制设备安全接入设备单独配置接入密码

LiveGBS基础配置接入控制白名单黑名单配置控制设备安全接入设备单独配置接入密码 1、白名单配置应用场景2、接入控制2.1、白名单2.2、黑名单 3、搭建GB28181视频直播平台 1、白名单配置应用场景 LiveGBS国标流媒体服务,支持白名单配置。 可在设备注册前&#xff0…

SV-8004VP 网络对讲求助话筒,4个自定义按键

SV-8004VP网络对讲求助话筒,4个自定义按键 SV-8004VP是一款4按键求助对讲话筒,具有10/100M以太网接口,支持G.711音频编解码,其接收SIP网络的音频数据,实时解码播放,还配置了麦克风输入和扬声器输出。 SV-…

红日靶场2 指免杀360 个人学习记录

360安全卫士,有一说一,确实很强,这几天研究的MSF利用java反序列化的漏洞是无法利用的,其他方法也瘦小甚微 前几天在研究用 用免杀工具 go-shellcode-loader-main免杀工具对我们生成的木马进行加密 本来是用csa4.0黑客工具生成了…

中国互联网的早期形态

1 大约是从 1991 年开始,国内开始了第一个 BBS 站——北京长城站,经过长时间发展,直到 1995 年,随着计算机及其外设的大幅降价,BBS 才逐渐被部分人们所认识。少数玩 BBS 站的“极客”站长, 基于个人关系&am…

伪装目标检测模型论文阅读之:Zoom in and out

论文链接:https://arxiv.org/abs/2203.02688 代码;https://github.com/lartpang/zoomnet 1.摘要 最近提出的遮挡对象检测(COD)试图分割视觉上与其周围环境融合的对象,这在现实场景中是非常复杂和困难的。除了与它们的背景具有高…

第二证券:旅游股大涨 “预热”春节黄金周

在淄博烧烤热、哈尔滨冰雪热火爆出圈后,希望能接住文旅下一波“泼天富贵”的各地文旅局各出奇招并“卷”出新高度,被各地网友谈论“杀疯了”。 其间,A股游览概念股迎来一波集体上涨,成为不少出资者的重视热点,而行将到…

模拟日光AR汽车HUD的光学特性太阳光模拟器

AR HUD 的光学特性 几何光学可描述物体、透镜和成像之间的关系。将物体放在透镜及其焦点之间将会形成放大且离实际物体有一定距离的虚像[4]。这便是 HUD 生成虚像的方法。源物体(在这里是散射屏或 TFT 面板)在 HUD 反光镜光学系统的焦距内。这使相应虚像…

test0116测试

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 磁盘满的本质分析 专栏:《Linux从小白到大神》 | 系统学习Linux开发、VIM/GCC/GDB/Make工具…

网络安全ctf比赛/学习资源整理,【解题工具、比赛时间、解题思路、实战靶场、学习路线】推荐收藏!

对于想学习或者参加CTF比赛的朋友来说,CTF工具、练习靶场必不可少,今天给大家分享自己收藏的CTF资源,希望能对各位有所帮助。 CTF在线工具 首先给大家推荐我自己常用的3个CTF在线工具网站,内容齐全,收藏备用。 1、C…