最邻近插值、双线性插值、三线性插值

零、图像的放大和缩小的基本原理–映射

图像的放大和缩小的基本原理就是一种映射,即缩小后或者放大后的图像像素位置向原图的一个映射。简单理解就是,将放大或者缩小后的图像将其的坐标(长宽)拉伸或者压缩到和原图一样大时,其像素坐标点对应在原图上的位置就是其映射位置

坐标映射图

一、插值法放缩放图像算法第一步映射

1. 值法算法流程----映射:
(1)、插值法放大图像的第一步都是相同的,遍历新图。计算新图的坐标点像素值对应原图中哪个坐标点的像素值来填充,计算公式为:
对应成比例scrH/dstH = srcHeight/dstHeight >>>
scrH = dstH * (srcHeight/dstHeight)
对应成比例scrW/dstW = srcWidth/dstWidth >>>
scrW = dstW * (srcWidth/dstWidth)
其中,src表示旧图,dst表示新图。新图的坐标(dstH,dstW)对应于旧图的坐标(scrH,scrW)。
srcWidth/dstWidth 和 srcHeight/dstHeight 分别表示宽和高的放缩比。

2、总结
那么问题来了,通过这个映射公式算出来的 scrH,scrW(旧图坐标)有可能是小数,但是坐标点是不存在小数的,都是整数,得想办法把它转换成整数才行。
不同插值法的区别就体现在 scrH,scrW 是小数时,怎么变成整数----去取原图像中的像素值。
最近邻插值(Nearest-neighborInterpolation): 看名字就很直白,四舍五入选取最接近的整数。这样的做法会导致像素变化不连续,在目标图像中产生锯齿边缘。
双线性插值(Bilinear Interpolation): 双线性就是利用与坐标轴平行的两条直线去把小数坐标分解到相邻的四个整数坐标点。权重与距离成反比。
双三次插值(Bicubic Interpolation): 与双线性插值类似,只不过用了相邻的16个点。但是需要注意的是,前面两种方法能保证两个方向的坐标权重和为1,但是双三次插值不能保证这点,所以可能出现像素值越界的情况,需要截断。

二、最邻近插值法:

最邻近插值法: 看名字就很直白,将scrH,scrW ,四舍五入选取最接近的整数,得到该点的像素值(该整数坐标在原图上的像素值)。这样的做法会导致像素的变化不连续,在新图中会产生锯齿。

四、python实现最邻近插值算法

import cv2
import numpy as np
scr_img = cv2.imread("lenna.png", 1)
print(scr_img.shape)
cv2.imshow("scr_img", scr_img)
cv2.waitKey(0)
# print(scr_img[0][0])
def nearest_neighbor_interpolation(scr_img,dstHeight,dstWidth):if(len(scr_img.shape)>2):# 图像不是灰度图像srcHeight, srcWidth, channels = scr_img.shape  # 获取原图的形状# 创建新图dst_img = np.zeros((dstHeight,dstWidth,channels),dtype = np.uint8)# 遍历新图,计算新图像素坐标在原图上的映射坐标for dstH in range(dstHeight):for dstW in range(dstWidth):scrH = round((dstH)*(srcHeight/dstHeight))scrW = round((dstW)*(srcWidth/dstWidth))dst_img[dstH][dstW] = scr_img[scrH][scrW]return  dst_imgelse:#图像是灰度图像srcHeight, srcWidth = scr_img.shape  # 获取原图的形状dst_img = np.zeros((dstHeight, dstWidth), dtype=np.uint8)# 遍历新图,计算新图像素坐标在原图上的映射坐标for dstH in range(dstHeight):for dstW in range(dstWidth):scrH = round((dstH) * (srcHeight / dstHeight))scrW = round((dstW) * (srcWidth / dstWidth))dst_img[dstH][dstW] = scr_img[scrH][scrW]return dst_img
dstHeight,dstWidth = 1000,1000
dst_img = nearest_neighbor_interpolation(scr_img,dstHeight,dstWidth)
cv2.imshow("dst_img",dst_img)
cv2.waitKey(0)

原图

放大图

五、双线性插值法:

1、插值介绍

在离散数据的基础上补插连续函数,使得这条连续曲线通过全部给定的离散数据点。
插值 是离散函数逼近的重要方法,利用它可通过函数在有限个点处的取值状况,估算出函数在其他点处的近似值。
插值: 用来填充图像变换时像素之间的空隙。

2、线性插值

线性插值 是指插值函数为一次多项式的插值方式,其在插值节点上的插值误差为零。线性插值相比其他插值方式,如抛物线插值,具有简单、方便的特点。线性插值的几何意义即为概述图中利用过A点和B点的直线来近似表示原函数。线性插值可以用来近似代替原函数,也可以用来计算得到查表过程中表中没有的数值。

3、双线性插值

双线性插值就是在x和y方向个来一次单线性插值


在图像中 y2-y1=1;x2-x1=1(x1 x2 y1 y2 是原图坐标)

所以上式变为

在实际图像双线性插值时,即可算出双线性插值的值

六、python实现双线性插值法:

import cv2
import numpy as np
import math
def bilinear_interpolation(scr_img,dstHeight,dstWidth):if(len(scr_img.shape)>2):# 图像是RGB图像srcHeight, srcWidth, channels = scr_img.shape  # 获取原图的形状scr_img = np.pad(scr_img, ((0, 1), (0, 1), (0, 0)), 'constant')# 创建新图dst_img = np.zeros((dstHeight,dstWidth,channels),dtype = np.uint8)# 遍历新图,计算新图像素坐标在原图上的映射坐标for dstH in range(dstHeight):for dstW in range(dstWidth):scrH = (dstH)*(srcHeight/dstHeight)scrW = (dstW)*(srcWidth/dstWidth)# i,j = int(scrH),int(scrW)  # 获得映射到原图的位置的左上角的像素位置i,j = math.floor(scrH),math.floor(scrW)  # 获得映射到原图的位置的左上角的像素位置u,v = scrH-i,scrW-j  # 获得映射到原图的位置的到左上角的像素位置的距离 x距离和y距离dst_img[dstH][dstW] = (1-u)*(1-v)*scr_img[i][j] + (1-u)*v*scr_img[i][j+1] + u*(1-v)*scr_img[i+1][j] + u*v*scr_img[i+1][j+1]return  dst_imgelse:#图像是灰度图像srcHeight, srcWidth = scr_img.shape  # 获取原图的形状dst_img = np.zeros((dstHeight, dstWidth), dtype=np.uint8)# 遍历新图,计算新图像素坐标在原图上的映射坐标for dstH in range(dstHeight - 1):for dstW in range(dstWidth - 1):scrH = (dstH+0.5) * (srcHeight / dstHeight)-0.5scrW = (dstW+0.5) * (srcWidth / dstWidth)-0.5i, j = int(scrH), int(scrW)  # 获得映射到原图的位置的左上角的像素位置u, v = scrH - i, scrW - j  # 获得映射到原图的位置的到左上角的像素位置的距离 x距离和y距离dst_img[dstH][dstW] = (1 - u) * (1 - v) * scr_img[i][j] + (1 - u) * v * scr_img[i][j + 1] + u * (1 - v) * scr_img[i + 1][j] + u * v * scr_img[i + 1][j + 1]return dst_imgdstHeight,dstWidth = 500*2,500*2
dst_img = bilinear_interpolation(scr_img,dstHeight,dstWidth)
cv2.imshow("dst_img",dst_img)
cv2.waitKey(0)

原图
放大图

注:

插值不仅可以放大图像也可以缩小图像

(四)最邻近插值、双线性插值相关推荐

  1. 最邻近插值、双线性插值、三次卷积插值最通俗入门理论解析,论文材料

    如有任何问题,请联系VX:1755337994 前言 图像处理中有三种常用的插值算法: 最邻近插值 双线性插值 双立方(三次卷积)插值 其中效果最好的是双立方(三次卷积)插值,本文介绍它的原理以及使用 ...

  2. 上采样(放大图像)和下采样(缩小图像)(最邻近插值和双线性插值的理解和实现)

    上采样和下采样 什么是上采样和下采样? • 缩小图像(或称为下采样(subsampled)或降采样(downsampled))的主要目的有 两个:1.使得图像符合显示区域的大小:2.生成对应图像的缩略 ...

  3. opencv:用最邻近插值和双线性插值法实现上采样(放大图像)与下采样(缩小图像)

    上采样与下采样 概念: 上采样: 放大图像(或称为上采样(upsampling)或图像插值(interpolating))的主要目的 是放大原图像,从而可以显示在更高分辨率的显示设备上. 下采样: 缩 ...

  4. Lanczos插值,最邻近插值,双线性二次插值,三次插值

    本文为转载,原博客地址:http://blog.csdn.net/trent1985/article/details/45150677 [研究内容] 目前比较常用的几种插值算法 [正文] 目前比较常用 ...

  5. 图像处理中两种基本的插值算法(最邻近插值法和双线性内插法)

    在图像的基本仿射变换中,经常会碰到经过旋转.缩放后灰度值如何赋值的问题.因为变换之后,图像的坐标位置有可能是小数,所以就需要插值算法来确定到底将该像素赋予哪个位置. 1.最邻近插值法(Nearest ...

  6. 数值计算笔记之插值(四)三次样条插值

    0.定义 已知函数在区间上个互异节点,处的函数值为,若构造函数,满足: 在每个小区间上是一个不超过三次的多项式 在上连续 则称为的三次样条插值函数. 根据定义知道规律为: 已知: n+1个数据点[xi ...

  7. 计算方法(四):插值与拟合

    文章目录 插值与拟合 插值概念与基础理论 插值问题的提法 插值多项式的存在唯一性 插值余项 插值多项式的求法 拉格朗日(Lagrange)型插值多项式 差商与牛顿基本插值多项式 差分与等距结点下的牛顿 ...

  8. matlab练习程序(图像放大/缩小,最邻近插值)

    cl;w=0.6; %放大或缩小的宽度h=1.4; %放大或缩小的高度img=imread('Corner.png');imshow(img);[m n]=size(img);imgn=zeros(h ...

  9. matlab练习程序(图像旋转,最邻近插值)

    cl;H=1; %索引pix中第一个元素,即高度W=2; %索引pix中第二个元素,即宽度jiaodu=45; %要旋转的角度,旋转方向为顺时针img=imread('Corner.png'); %这 ...

最新文章

  1. Python访问街区所有节点最短路径问题,并结合matplotlib可视化
  2. java web三:反射
  3. python字符串单个替换_如何用变量替换列表中的单个字符串?
  4. 华为驳斥鸿蒙六月上线,终于来了!华为鸿蒙6月初将正式上线手机
  5. HTML 学习笔记 day one
  6. jquery获取checkbox是否选中
  7. java 中传输文件的代码_java文件上传Demo(必看篇)
  8. 毕设问题小记——No Dialect mapping for JDBC type:-1错误
  9. 设计模式(5)—— 工厂方法模式(Factory Method,创建型)
  10. 洞悉物联网发展1000问之可穿戴设备的未来会怎样?
  11. 星岚技术 Win10 x64 装机版 V2021.5【带驱动包】
  12. python画中国的轮廓_利用python绘制中国地图(含省界、河流等)
  13. 计算机中插入背景图片怎样操作,在word中怎么添加背景图片及文字背景
  14. 写的不错的《活着》的书评
  15. python 将一串数字形式的时间转换为标准时间格式
  16. 买了个新主机,从0开始配电脑(持续更新ing)
  17. Windows右击无新建文本文档怎么办
  18. 进制转换 2进制转10进制 10进制转2进制
  19. V8常见去优化原因一览
  20. 微型计算机aspire1600x,终结性能过剩时代 评Acer 1600X小型机

热门文章

  1. bzoj 3039: 玉蟾宫(悬线法)
  2. JDK源码解析--Object类
  3. [paper reading] GoogLeNet
  4. [python] 将一个序列的排序方式扩展到其他序列
  5. js系列教程13-原型、原型链、作用链、闭包全解
  6. python绘制心形图像
  7. ecshop mysql 标题表_ecshop商品分类列表页如何自定义title标题
  8. mac php apache mysql 集成环境 的软件
  9. Mybatis中DAO层接口没有写实现类,Mapper中的方法和DAO接口方法是怎么绑定到一起的...
  10. 库存管理与订单的控制