插值算法介绍
2023-8-12
| 2024-2-22
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password

1. 双线性插值

双线性插值, 将目标尺寸图像的每个像素点映射回原图, 各像素点的值由它周围4个原图像素点进行线性插值获得.

1.1. 角对齐和边对齐区别

  • 角对齐使用像素的中心点进行对齐(分割左右距离最远的中心点).
  • 边对齐使用像素的边缘进行对齐(分割左右距离最远像素边缘).
下图(红点是原像素中心点, 点是左上角第一个红点; 蓝点是目标对齐点):
notion image
  • 代码结果可以看出, 角对齐插值后, 像素值横纵方向上是线性的; 边对齐插值后, 边缘一圈在横纵方向上的像素值是非线性.
    • 所以, 对于目标检测这种少有物体出现在图像边缘的情况, 用两种对齐都行; 而对于图像分割, 边角的像素也会加入mIoU计算(也就是影响精度), 所以用角对齐更好.
  • 另外, OpenCV和PIL插值使用的都是边对齐. MXNet, PyTorch, TensorFlow两种方法都可选.

1.2. 双线性插值计算过程

  1. 将目标图像大小缩放到原图像的尺寸, 这时候目标图像上的每一个像素都变成了在原图上的亚像 素点.
  1. 对这个亚像素点进行插值获得像素值.
    1. 进行两次横向的线性插值.
    2. 进行一次纵向的线性插值.
notion image

2. 双三次插值

双三次插值, 将目标尺寸图像的每个像素点映射回原图, 各像素点的值由它周围16个原图像素点(以目标像素点为中心)进行线性插值获得.
notion image

2.1. 权重公式

  • : 目标像素点与某个邻近像素点的距离
  • : 平滑度, 默认取-0.5 (PyTorch默认使用-0.75)

2.2. 计算过程

将目标尺寸图像的每个像素点映射回原图, 各像素点的值由它周围16个原图像素点进行线性插值获得.
假设某个像素点为, 分别计算对应着16个原图像素点的 轴方向和 轴方向的距离, 带入权重公式.
notion image
  • 这样的话, 可以分开计算x轴和y轴方向的权重. 因为x轴方向权重每一列都是一样的; y轴方向权重每一行都是一样的(距离相同).
notion image
  • 求得结果之后, 求和就可以获得结果
实际操作的时候, 全图基础上需要在周围加两圈 padding 用来解决边缘像素的问题, PyTroch 可以使用replicate参数, 复制边缘像素来填充边缘.

3. 最邻近插值

3.1. 缩放过程

  1. 将目标尺寸的像素点映射到原图
  1. 目标像素点距离原图哪个像素点最近, 就使用哪个像素点的值.
具体细节
  • 遍历输出像素点, 将这些像素点缩放之后, 四舍五入到整数值, 这个整数的坐标对应原图的像素值就是目标像素值.
  • 如果遍历的时候发现像素点越界, 就使用边缘像素的像素值
  • 缺点
    • 有锯齿, 效果不如双线性插值
  • 优点
    • 对于分割任务. 如果要对标注图像进行缩放的时候, 用最邻近插值可以防止出现额外的像素值
      • notion image
         
  • OpenCV
  • OCR文本识别和CRNN算法简介OCR文本检测和DBNet
    • Giscus
    目录