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

图像预处理-插值方法

一.插值方法

当我们对图像进行缩放或旋转等操作时,需要在新的像素位置上计算出对应的像素值。

而插值算法的作用就是根据已知的像素值来推测未知位置的像素值。

1.1 最近邻插值

CV2.INTER_NEAREST

其为 warpAffine() 函数的参数 flags 的其一,表示最近邻插值。

        这个方法是根据原图目标图坐标关系来做填充,目标图中一点的坐标经过公式找到原图坐标然后找到像素点,然后填充进目标图中,也就是填充最近的像素。下面是公式:

- dstX:目标图像中某点的x坐标,

- dstY:目标图像中某点的y坐标,

- srcWidth:原图的宽度,

- dstWidth:目标图像的宽度;

- srcHeight:原图的高度,

- dstHeight:目标图像的高度。

- 而srcXsrcY:目标图像中的某点对应的原图中的点的x和y的坐标。

如果计算出的是小数,则向下取整(防止取不到点)

1.2 双线性插值

CV2.INTER_LINEAR

        原始图像的某些像素坐标可能不再是新图像中的整数位置,这时就需要使用其他插值算法来确定这些非整数坐标的像素值。我们依然需要把目标图像的点映射到原图像上,公式不变。

先来看看单线性插值:

        可见,单位像素值就是 (P2-P1)/(x2-x1) ,其中通过两点与目标点的关系给出表达式,简化后得到单线性插值的像素值公式。我们也容易理解,k2 的值是更大的,说明 P2 与 关系更近。

而双线性插值就是做两次,分别在水平方向和垂直方向上做线性插值:

- 水平方向:根据 x 与 x0 x1 的关系计算出 P00 P10 P01 P11 之间的插值结果。

- 垂直方向:将第一步的结果与 y0 y1 的关系结合,再在垂直方向上做一次线性插值。

1.3 像素区域插值

cv2.INTER_AREA

        使用像素区域插值方法进行缩小图像时,它就会变成一个均值滤波器(就是一个卷积核),其工作原理可以理解为对一个区域内的像素值取平均值。目标图像的每个像素点,其值等于卷积核中所有像素值的均值。(依然需要目标图像与原图像的坐标对应公式。)

卷积核先往右边走,计算完一个值就移动一格,到边缘就换到下一行开始依次进行。

1.4 双三次插值

cv2.INTER_CUBIC

双三次插值法需要原图像中近邻的**16**个点来加权,也就是4x4的网格。

        还是需要公式得出一点在原图像中的坐标,找到离它最近16个像素点。此时坐标有小数,则把整数部分小数部分分离为(x+u,y+v)。取整数部分(x,y),这个时候就肯定会是16个像素点的其中之一,将其作为坐标原点(是的你没有听错),然后再分别计算其他15个像素点的坐标。

        再来到重点,把这15个像素点的横纵坐标都取出来,然后分别与取出来的小数部分uv,再取绝对值,这就是每个像素点在一个方向上与原点的距离dw或dh。随后再根据公式计算得出权重,再把像素值乘以对应权重,最后把所有乘积相加,就是插值后的像素值。

公式:

1.5 Lanczos插值

        与双三次插值的思想是一样的,不同的就是其需要的原图像周围的像素点的范围变成了8*8,并且不再使用BiCubic函数来计算权重,而是换了一个公式计算权重。

其中a通常取2或者3,当a=2时,该算法适用于图像缩小。a=3时,该算法适用于图像放大。

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

相关文章:

  • 效率工具- git rebase 全解
  • 实现定长的内存池
  • 【C++】 —— 笔试刷题day_14
  • org.apache.spark.SparkException: Kryo serialization failed: Buffer overflow...
  • Java---抽象类与接口
  • 【C++】继承
  • 【ROS2】行为树:BehaviorTree
  • Spring Boot对接马来西亚股票数据源API
  • 【前端】CSS Grid 布局详解
  • 【PySpark大数据分析概述】03 PySpark大数据分析
  • 0x01、Redis 主从复制的实现原理是什么?
  • 《Vue Router实战教程》14.路由元信息
  • MySQL逻辑架构有什么?
  • JavaScript学习教程,从入门到精通,JavaScript 数组与引用类型语法知识点及案例代码(10)
  • 三大开源大模型应用框架深度对比:AnythingLLM、Dify 与 Open-WebUI
  • XML、JSON 和 Protocol Buffers (protobuf) 对比
  • ESP32开发入门:基于VSCode+PlatformIO环境搭建指南
  • 在Oracle数据库中,一条SQL查询请求的执行过程是一个复杂且精细的流水线
  • CSS学习02 动态列数表格开发,解决多组数据布局与边框重合问题
  • WEB前端开发中常用的算法
  • 布局决定终局:基于开源AI大模型、AI智能名片与S2B2C商城小程序的战略反推思维
  • 从Function Calling到Tool Calling:Spring AI架构升级背后的技术考量
  • Git 高级操作
  • VMWare Workstation 17 安装 Ubuntu24.02
  • pycharm如何通过跳板机连接服务器在本地debug
  • Pytorch torch.utils.data.dataloader.default_collate 介绍
  • CTF web入门之命令执行 完整版
  • Git代码管理
  • 代码随想录-06-二叉树-05.01 二叉树的层序遍历
  • 【股票数据API接口19】如何获取股票主力资金走势数据之Python、Java等多种主流语言实例代码演示通过股票数据接口获取数据