当前位置: 首页 > news >正文

upsample nearest 临近上采样实现方式

nearest 最近邻居像素值来

实现 原理

最近邻上采样的原理非常简单,它直接取输入图像中最近的像素值作为输出图像中对应位置的像素值。这种方法在放大图像时保持了像素的原始值,不涉及像素值之间的平滑过渡,因此可能会产生明显的锯齿状边缘。

优点

计算量小:最近邻插值法通过直接选取离目标点最近的点的值作为新的插入点的值,计算过程相对简单,计算量小。
速度快:
算法简单:易于理解和实现。

缺点

图像质量差:插值后的图像在边缘处容易出现明显的锯齿现象,图像质量差。
灰度值不连续:由于插值点直接取最近点的值,因此插值后的图像在灰度值上能会出现不连续的情况,导致图像不够自然。
放大效果有限:当需要大幅度放大图像时,简单的复制最近点的值无法有效地恢复图像中的高频信息。
如下面11010的张量二倍nearest 上采样后生成12020的结果

请添加图片描述
代码示例

import torch  
import matplotlib.pyplot as plt
import seaborn as snsdef custom_nearest_interpolate(input_tensor, scale_factor):  """  对输入张量进行最近邻上采样。  参数:  - input_tensor: 输入张量,形状为 [batch_size, channels, height, width]  - scale_factor: 缩放因子,一个整数或整数元组,表示在每个维度上放大多少倍  返回:  - output_tensor: 上采样后的张量  """  batch_size, channels, height, width = input_tensor.size()  # 确保scale_factor是整数元组,且长度为2(针对height和width)  if isinstance(scale_factor, int):  scale_factor = (scale_factor, scale_factor)  new_height, new_width = int(height * scale_factor[0]), int(width * scale_factor[1])  # 创建一个空的输出张量,并用0填充(这里也可以用其他值填充,但最近邻插值通常不需要)  # 注意:我们实际上不需要用0填充,因为我们会直接从上采样中复制值  # 但为了与PyTorch的行为一致(虽然它内部不这样做),我们还是创建一个形状正确的张量  output_tensor = torch.zeros(batch_size, channels, new_height, new_width, dtype=input_tensor.dtype, device=input_tensor.device)  # 执行最近邻上采样  for b in range(batch_size):  for c in range(channels):  for y in range(new_height):  for x in range(new_width):  # 计算原始图像中的对应位置(向下取整)  orig_y = y // scale_factor[0]  orig_x = x // scale_factor[1]  # 注意边界情况,这里简单处理为边缘复制(也可以选择其他方式,如填充)  orig_y = min(orig_y, height - 1)  orig_x = min(orig_x, width - 1)  # 复制值  output_tensor[b, c, y, x] = input_tensor[b, c, orig_y, orig_x]  return output_tensor  # 示例使用  
input_tensor = torch.randn(1, 1, 10, 10)# 提取张量的最后两个维度
tensor_2d = input_tensor[0, 0].numpy()  # 转换为 NumPy 数组以便绘图# 使用 seaborn 的 heatmap 函数绘制热力图
sns.set()  # 设置 seaborn 的默认样式
plt.figure(figsize=(10, 8))  # 设置图形大小
sns.heatmap(tensor_2d, annot=True, fmt=".2f", cmap='coolwarm', cbar=True,xticklabels=False, yticklabels=False, square=True)plt.title('Tensor Shape Visualization (20x20)')
plt.xlabel('Width')
plt.ylabel('Height')plt.show()output_tensor = custom_nearest_interpolate(input_tensor, scale_factor=2)  
print(output_tensor.shape)  # 应该输出 torch.Size([1, 1, 20, 20])# 获取张量的形状
shape = output_tensor.shape# 创建一个条形图来表示张量的每个维度大小
plt.bar(range(len(shape)), shape)
plt.xlabel('Dimension')
plt.ylabel('Size')
plt.title('Tensor Shape')
plt.show()
# 提取张量的最后两个维度
tensor_2d = output_tensor[0, 0]# 绘制点阵
plt.imshow(tensor_2d, cmap='gray', interpolation='nearest')
plt.colorbar()  # 显示颜色条
plt.title('Tensor Shape Visualization (20x20)')
plt.xlabel('Width')
plt.ylabel('Height')
plt.xticks([])  # 隐藏坐标轴刻度
plt.yticks([])
plt.show()# 提取张量的最后两个维度
tensor_2d = output_tensor[0, 0].numpy()  # 转换为 NumPy 数组以便绘图# 使用 seaborn 的 heatmap 函数绘制热力图
sns.set()  # 设置 seaborn 的默认样式
plt.figure(figsize=(15, 12))  # 设置图形大小
sns.heatmap(tensor_2d, annot=True, fmt=".2f", cmap='coolwarm', cbar=True,xticklabels=False, yticklabels=False, square=True)plt.title('Tensor Shape Visualization (20x20)')
plt.xlabel('Width')
plt.ylabel('Height')plt.show()

相关文章:

  • taobao.item_get_appAPI接口原app数据测试指南
  • unity安装报错问题记录
  • 确保从IP池提取的IP是可用的对于数据抓取或其他网络活动至关重要。以下是一些确保IP可用性的有效方法:
  • 点评项目-3-登录成功后加载登录页面
  • Qt 每日面试题 -6
  • LVS+keepalived整合负载均衡配置
  • 物理学基础精解【41】
  • MySql中索引失效的情况及原因
  • CSS开发全攻略
  • ubuntu2204操作系统使用可执行文件方式安装docker-compose记录
  • Qt网络编程——QUdpSocket
  • [大语言模型-论文精读] MoRAG - 基于多部分融合的检索增强型人体动作生成
  • [C++][程序退出]详细讲解
  • C++【类和对象】(取地址运算符重载与实现Date类)
  • Jenkins提示Host key verification failed的解决办法
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • 30天自制操作系统-2
  • 4个实用的微服务测试策略
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • JAVA_NIO系列——Channel和Buffer详解
  • Java基本数据类型之Number
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • MySQL数据库运维之数据恢复
  • Python进阶细节
  • Python爬虫--- 1.3 BS4库的解析器
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • spring boot下thymeleaf全局静态变量配置
  • vue-router 实现分析
  • 百度地图API标注+时间轴组件
  • 第十八天-企业应用架构模式-基本模式
  • 对JS继承的一点思考
  • 如何胜任知名企业的商业数据分析师?
  • 小程序 setData 学问多
  • 自定义函数
  • No resource identifier found for attribute,RxJava之zip操作符
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​第20课 在Android Native开发中加入新的C++类
  • ​批处理文件中的errorlevel用法
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (03)光刻——半导体电路的绘制
  • (1)svelte 教程:hello world
  • (C)一些题4
  • (function(){})()的分步解析
  • (Java)【深基9.例1】选举学生会
  • (javaweb)Http协议
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (三)Kafka 监控之 Streams 监控(Streams Monitoring)和其他
  • (一)springboot2.7.6集成activit5.23.0之集成引擎
  • .net core docker部署教程和细节问题
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法