插值法的第一次都是相同的,计算新图的坐标点对应原图中哪个坐标点来填充,计算公式为:
srcX = dstX* (srcWidth/dstWidth)
srcY = dstY * (srcHeight/dstHeight)
srcWidth/dstWidth和srcHeight/dstHeight分别表示宽和高的放缩比。
那么问题来了,通过这个公式算出来的srcX,scrY有可能是小数,但是坐标点是不存在小数的,都是整数,得想办法把它转换成整数才行。
不同的插值法的区别就体现在srcX,scrY是小数时,怎么变成整数去取原图片中的像素值。
最邻近:看名字就很直白,四舍五入选取最接近的整数。这样的做法就会导致像素的变化不连续,在图像中的体现就是会有锯齿。
双线性插值:双线性就是利用与坐标轴平行的两条直线去把小数坐标分解到相邻的四个整数坐标点的和,权重为距离。

例如P点是小数坐标,Q是相邻的四个整数坐标
双三次插值:与双线性插值类似,只不过用了相邻的16个点。但是需要注意的是,前面两种方法能回保证两个方向的坐标权重和为1,但是双三次插值不能保证这点,所以又可能去出现像素值越界的情况,需要截断。
直接看代码,清晰明了。实验结果图:



from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
import mathdef NN_interpolation(img,dstH,dstW):scrH,scrW,_=img.shaperetimg=np.zeros((dstH,dstW,3),dtype=np.uint8)for i in range(dstH):for j in range(dstW):scrx=round((i+1)*(scrH/dstH))scry=round((j+1)*(scrW/dstW))retimg[i,j]=img[scrx-1,scry-1]return retimgdef BiLinear_interpolation(img,dstH,dstW):scrH,scrW,_=img.shapeimg=np.pad(img,((0,1),(0,1),(0,0)),'constant')retimg=np.zeros((dstH,dstW,3),dtype=np.uint8)for i in range(dstH):for j in range(dstW):scrx=(i+1)*(scrH/dstH)-1scry=(j+1)*(scrW/dstW)-1x=math.floor(scrx)y=math.floor(scry)u=scrx-xv=scry-yretimg[i,j]=(1-u)*(1-v)*img[x,y]+u*(1-v)*img[x+1,y]+(1-u)*v*img[x,y+1]+u*v*img[x+1,y+1]return retimgdef BiBubic(x):x=abs(x)if x<=1:return 1-2*(x**2)+(x**3)elif x<2:return 4-8*x+5*(x**2)-(x**3)else:return 0def BiCubic_interpolation(img,dstH,dstW):scrH,scrW,_=img.shape#img=np.pad(img,((1,3),(1,3),(0,0)),'constant')retimg=np.zeros((dstH,dstW,3),dtype=np.uint8)for i in range(dstH):for j in range(dstW):scrx=i*(scrH/dstH)scry=j*(scrW/dstW)x=math.floor(scrx)y=math.floor(scry)u=scrx-xv=scry-ytmp=0for ii in range(-1,2):for jj in range(-1,2):if x+ii<0 or y+jj<0 or x+ii>=scrH or y+jj>=scrW:continuetmp+=img[x+ii,y+jj]*BiBubic(ii-u)*BiBubic(jj-v)retimg[i,j]=np.clip(tmp,0,255)return retimgim_path='C:/Users/11358/Pictures/Camera Roll/1.png'
image=np.array(Image.open(im_path))image1=NN_interpolation(image,image.shape[0]*2,image.shape[1]*2)
image1=Image.fromarray(image1.astype('uint8')).convert('RGB')
image1.save('C:/Users/11358/Pictures/Camera Roll/2.png')image2=BiLinear_interpolation(image,image.shape[0]*2,image.shape[1]*2)
image2=Image.fromarray(image2.astype('uint8')).convert('RGB')
image2.save('C:/Users/11358/Pictures/Camera Roll/3.png')image3=BiCubic_interpolation(image,image.shape[0]*2,image.shape[1]*2)
image3=Image.fromarray(image3.astype('uint8')).convert('RGB')
image3.save('C:/Users/11358/Pictures/Camera Roll/4.png')

转载于:https://www.cnblogs.com/super-JJboom/p/9993431.html

插值法(最邻近,双线性,双三次),图像放缩 python实现相关推荐

  1. 双线性 双三次 和基于lanczos 的插值算法

    三者相同点 双线性 双三次 lanczos插值 都是首先找到插值后点与原图中亚像素点后,通过不同的映射函数进行求解. 三者本质上没有任何区别,区别只是求解函数的拟合方式不同,努力去cover住最真实的 ...

  2. 插值法(最邻近,双线性,双三次)的原理及实现

    插值法(最邻近,双线性,双三次)的原理及实现 常用的插值方法有最邻近插值法.双现象插值法和双三次插值法等,主要用于图像的放大或缩小. 缩小图像(或称为下采样(subsampled) 或降采样(down ...

  3. 【图像】插值方法原理(最近邻,双线性,双三,兰索斯)

    插值流程分为以下几步: 1)计算放缩比例.比如原图是2x2,现在放大到3x3,那么放缩比例就是3/2. 2)计算现在图片上每个像素对应到原图哪个像素.比如(2, 2)的像素对应到原图就是(2/(3/2 ...

  4. 第2章 Python 数字图像处理(DIP) --数字图像基础3 - 图像内插 - 最近邻内插 - 双线性插值 - 双三次内插 - 图像放大

    目录 图像内插 放大图像 图像内插 内插通常在图像放大.缩小.旋转和几何校正等任务中使用.内插并用它来调整图像的大小(缩小和放大),缩小和放大基本上采用图像重取样方法 最近邻内插,这种方法将原图像中最 ...

  5. 数字图像处理学习笔记(七)——用Pycharm及MATLAB实现三种图像内插法(最近邻内插法、双线性内插法、双三次内插法)

    数字图像处理(Digital Image Processing)是通过计算机对图像进行去除噪声.增强.复原.分割.提取特征等处理的方法和技术.本专栏将以学习笔记形式对数字图像处理的重点基础知识进行总结 ...

  6. 【数字图像处理】图像内插“双三次内插法 双三次插值 Bicubic interpolation”(cv2.resize、cv.INTER_CUBIC)

    文章目录 基本原理 代码 引用自:<数字图像处理> 基本原理 引用自:https://baike.baidu.com/item/%E5%8F%8C%E4%B8%89%E6%AC%A1%E6 ...

  7. Opencv下双线性插值法进行图像放缩

    关于图像放缩的算法有很多,本文主要介绍双线性插值法进行图像放缩,本文参考了: http://www.cnblogs.com/funny-world/p/3162003.html 我们设源图像src的大 ...

  8. 三种图像内插法(最近邻内插法、双线性内插法、双三次内插法)的做法 代码实现

    参考博客 数字图像处理学习笔记(四)--数字图像的内插.度量.表示与质量_闭关修炼--暂退的博客-CSDN博客 数字图像处理学习笔记(七)--用Pycharm及MATLAB实现三种图像内插法(最近邻内 ...

  9. Python计算机视觉编程 第三章 图像到图像的映射

    第三章 图像到图像的映射 3.1 单应性变换 3.1.1直接线性变换算法 3.1.2仿射变换 3.2图像扭曲 3.2.1图像中的图像 3.2.2图像配准 3.3创建全景图 3.3.1RANSAC 3. ...

最新文章

  1. linux之shell脚本学习篇一
  2. 正则判断是否有html标签,正则表达式匹配所有HTML标签,除了和
  3. Linkis1.0用户使用文档:JAVA和SCALA调用Linkis的接口示例代码
  4. QT的QSet类的使用
  5. 深入理解多重采样(Multisampling)
  6. 原码、反码、补码,以及负数的位操作
  7. sessionStorage、localStorage存储api
  8. python get请求 url传参_requests的get请求url参数、url重定向处理及cookies
  9. GET 和 POST的区别(转载)
  10. android之AlarmManager 全局定时器
  11. CSS3动画序列(CSS3)
  12. c#初学-select和Dictionary字典在c#中的用法
  13. mysql成绩统计数据库设计_MySQL数据库设计——以学生成绩数据库为例
  14. json格式数据集转yolo txt格式
  15. 如何用计算机算电路,如何利用基础门电路进行加法计算和触发器
  16. 在蚂蚁金服上班是一种什么体验?分享一下我的蚂蚁保险面经,以及我的面试感悟。
  17. Uav开发杂记-4-无人机开发的C-C++
  18. 刷程序对车危害_刷ecu非常后悔,刷程序对车危害有多大
  19. Python的下载和安装教程
  20. springboot集成rabbitmq商品秒杀业务实战(流量削峰)

热门文章

  1. 《追寻生命的意义》--后记
  2. html页面退格代码,HTML中的退格键
  3. 新浪微博 发微博消息的处理
  4. NADH二钠CAS 606-68-8的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  5. PMP备考大全:经典题库(6月第2周)
  6. python设置默认utf8编码_Python设置默认编码为utf8的方法
  7. 网易互联网产品运营管培生面试经历--从群面到终面面试经验分享
  8. 个人计算机培训校本研修总结,个人研修总结
  9. ubuntu安装frps服务器与xtcp配置
  10. linux编译ace tao,ACE_TAO的编译