转自:http://blog.csdn.net/qiqi5521/article/details/2207562

图像的缩放很好理解,就是图像的放大和缩小。传统的绘画工具中,有一种叫做“放大尺”的绘画工具,画家常用它来放大图画。当然,在计算机上,我们不再需要用放大尺去放大或缩小图像了,把这个工作交给程序来完成就可以了。下面就来讲讲计算机怎么来放大缩小图象;在本文中,我们所说的图像都是指点阵图,也就是用一个像素矩阵来描述图像的方法,对于另一种图像:用函数来描述图像的矢量图,不在本文讨论之列。

越是简单的模型越适合用来举例子,我们就举个简单的图像:3X3的256级灰度图,也就是高为3个象素,宽也是3个象素的图像,每个象素的取值可以是 0-255,代表该像素的亮度,255代表最亮,也就是白色,0代表最暗,即黑色。假如图像的象素矩阵如下图所示(这个原始图把它叫做源图,Source):

234  38   22

67    44  12

89    65  63

这个矩阵中,元素坐标(x,y)是这样确定的,x从左到右,从0开始,y从上到下,也是从零开始,这是图象处理中最常用的坐标系,就是这样一个坐标:

---------------------->X

|

|

|

|

|

∨Y

如果想把这副图放大为 4X4大小的图像,那么该怎么做呢?那么第一步肯定想到的是先把4X4的矩阵先画出来再说,好了矩阵画出来了,如下所示,当然,矩阵的每个像素都是未知数,等待着我们去填充(这个将要被填充的图的叫做目标图,Destination):

?       ?       ?     ?

?       ?       ?     ?

?       ?       ?     ?

?       ?       ?     ?

然后要往这个空的矩阵里面填值了,要填的值从哪里来来呢?是从源图中来,好,先填写目标图最左上角的象素,坐标为(0,0),那么该坐标对应源图中的坐标可以由如下公式得出:

srcX=dstX* (srcWidth/dstWidth) , srcY = dstY *(srcHeight/dstHeight)

好了,套用公式,就可以找到对应的原图的坐标了(0*(3/4),0*(3/4))=>(0*0.75,0*0.75)=>(0,0)

,找到了源图的对应坐标,就可以把源图中坐标为(0,0)处的234象素值填进去目标图的(0,0)这个位置了。

接下来,如法炮制,寻找目标图中坐标为(1,0)的象素对应源图中的坐标,套用公式:

(1*0.75,0*0.75)=>(0.75,0)

结果发现,得到的坐标里面竟然有小数,这可怎么办?计算机里的图像可是数字图像,象素就是最小单位了,象素的坐标都是整数,从来没有小数坐标。这时候采用的一种策略就是采用四舍五入的方法(也可以采用直接舍掉小数位的方法),把非整数坐标转换成整数,好,那么按照四舍五入的方法就得到坐标(1,0),完整的运算过程就是这样的:

(1*0.75,0*0.75)=>(0.75,0)=>(1,0)

那么就可以再填一个象素到目标矩阵中了,同样是把源图中坐标为(1,0)处的像素值38填入目标图中的坐标。

依次填完每个象素,一幅放大后的图像就诞生了,像素矩阵如下所示:

234  38    22  22

67     44    12  12

89     65   63  63

89    65   63   63

这种放大图像的方法叫做最临近插值算法,这是一种最基本、最简单的图像缩放算法,效果也是最不好的,放大后的图像有很严重的马赛克,缩小后的图像有很严重的失真;效果不好的根源就是其简单的最临近插值方法引入了严重的图像失真,比如,当由目标图的坐标反推得到的源图的的坐标是一个浮点数的时候,采用了四舍五入的方法,直接采用了和这个浮点数最接近的象素的值,这种方法是很不科学的,当推得坐标值为0.75的时候,不应该就简单的取为1,既然是0.75,比1要小0.25 ,比0要大0.75 ,那么目标象素值其实应该根据这个源图中虚拟的点四周的四个真实的点来按照一定的规律计算出来的,这样才能达到更好的缩放效果。双线型内插值算法就是一种比较好的图像缩放算法,它充分的利用了源图中虚拟点四周的四个真实存在的像素值来共同决定目标图中的一个像素值,因此缩放效果比简单的最邻近插值要好很多。

双线性内插值算法描述如下:

  对于一个目的像素,设置坐标通过反向变换得到的浮点坐标为(i+u,j+v) (其中i、j均为浮点坐标的整数部分,u、v为浮点坐标的小数部分,是取值[0,1)区间的浮点数),则这个像素得值f(i+u,j+v) 可由原图像中坐标为 (i,j)、(i+1,j)、(i,j+1)、(i+1,j+1)所对应的周围四个像素的值决定,即:

  f(i+u,j+v) = (1-u)(1-v) f(i,j) + (1-u)v f(i,j+1) +u(1-v) f(i+1,j) + uvf (i+1,j+1)                         公式1

其中f(i,j)表示源图像(i,j)处的的像素值,以此类推。

比如,象刚才的例子,现在假如目标图的象素坐标为(1,1),那么反推得到的对应于源图的坐标是(0.75 ,0.75), 这其实只是一个概念上的虚拟象素,实际在源图中并不存在这样一个象素,那么目标图的象素(1,1)的取值不能够由这个虚拟象素来决定,而只能由源图的这四个象素共同决定:(0,0)(0,1)(1,0)(1,1),而由于(0.75,0.75)离(1,1)要更近一些,那么(1,1)所起的决定作用更大一些,这从公式1中的系数uv=0.75×0.75就可以体现出来,而(0.75,0.75)离(0,0)最远,所以(0,0)所起的决定作用就要小一些,公式中系数为(1-u)(1-v)=0.25×0.25也体现出了这一特点

后记:近日在论坛上看到有人提问,说写的图像缩放算法放大图片的时候出现了空缺。分析了一下代码,发现是犯了这样的错误:缩放图片的时候,遍历源图的像素,然后推出目标图中的对应坐标,进行逐点的像素拷贝,这样当然放大图片的时候会出现空缺。缩小图片的时候结果是对的,但是会出现多余的计算量。

图像缩放算法一定要反推:遍历目标图的像素,反推得到源图中的对应坐标,然后进行像素拷贝。这样才保证了放大图片没有空缺,缩小图片也不会引入冗余计算。

最邻近插值和双向性内插值缩放图片的效果对比:

    原始图片

     最邻近插值放大图片

   双线型内插值放大图片

转载于:https://www.cnblogs.com/pamxy/archive/2013/03/19/2991464.html

图像缩放的双线性内插值算法的原理解析相关推荐

  1. 验证darknet中前处理做图像缩放(双线性内插值法)scale的算法效果

    关于图形scale原理的介绍可以参考下面的文章 用最近邻插值(Nearest Neighbor interpolation)进行图片缩放_papaofdoudou的博客-CSDN博客_最近邻插值算法原 ...

  2. python构造callable_Python callable内置函数原理解析

    python内置函数 callable用于检查一个对象是否是可调用的,如果函数返回True,object 仍然可能调用失败:但如果返回 False,调用对象 object 绝对不会成功. 一.call ...

  3. 图像缩放--OpenCV cvResize函数

    void cvResize( const CvArr* src, CvArr* dst, int interpolation=CV_INTER_LINEAR );  src 输入图像. dst 输出图 ...

  4. 图像缩放算法及速度优化

    原文来自:博客园 小欣子 图像缩放算法及速度优化--(一)最近邻插值 图像缩放算法及速度优化--(二)双线性插值 --------------------以下为原文------------------ ...

  5. OpenCV图像缩放插值之BiCubic双三次插值

    图像缩放算法简介 在图像的仿射变换中,很多地方需要用到插值运算,常见的插值运算包括最邻近插值,双线性插值,双三次插值(立体插值),兰索思插值等方法,OpenCV提供了很多方法,其中,双线性插值由于折中 ...

  6. 双线性插值实现图像缩放详解

    目录 双线性插值(Bilinear Interpolation) 线性插值 双线性插值 深入理解双线性插值 我的插值理解 代码 官方插值办法 源图像和目标图像几何中心的对齐 将浮点运算转换成整数运算 ...

  7. 图像缩放的艺术,揭秘图像放大且保持清晰度的技术

    麦客奥德彪的博客地址: https://juejin.cn/user/2365804752418232 图像缩放是数字图像处理中常用的技术之一.随着数字媒体的普及,图像缩放算法变得越来越重要.本文将探 ...

  8. 【图像处理】图像灰度级减少, 图像缩放(Reducing the Number of Gray Levels, Zooming and Shrinking)

    实验要求 (1.a) 编写一个以2 的幂次方将给定图像的灰度级数从256 减少到2 的程序.图像的灰度级数以参数变量的形式传递到所编写的程序中. (1.b) 使用图2.21(a) 以(1.a)中编写的 ...

  9. 智能手机中图像处理的原理解析及 RGB 数值变化规律研究

    1 前言 图像处理是一种利用计算机算法对数字图像进行处理的技术.数字图像是由像素组成的二维矩阵,每个像素包含了颜色和亮度信息,图像处理就是通过对这些像素进行各种算法操作,改变其颜色.亮度.对比度.清晰 ...

最新文章

  1. HDOJ2203 亲和数
  2. JavaScript检查null与undefined以及==和===之间的差异
  3. das,nas,san区别——大型数据中心会用NAS+SAN软硬结合思路
  4. 一些SqlServer常见和入门操作2
  5. ExtJs Grid 合计 [Ext | GridPanel | GridSummary]
  6. Java AOP研究之@Aspect注解的工作原理
  7. windows 修改nginx端口号_分享Nginx搭建图片服务器简单实现
  8. PC软件开发技术之二:用C#开发基于自动化接口的OPC客户端
  9. php网站导航-国际网址导航系统 v5.0源码
  10. HTML的基本知识(四)——文本格式化标签
  11. Windows 10下使用Xshell5连接虚拟机的ubuntu18系统
  12. ipop映射到ftp服务器,设备作为FTP客户端进行文件传输-IPOP
  13. 数码大师2013破解补丁|数码大师2013白金版注册破解补丁下载(附数码大师2013白金版注册码)
  14. 计算机视觉 - python实现求解homography矩阵
  15. spring整合kaptcha验证码
  16. linux 命令 aft,AFT整理出来的NPC检测命令大全
  17. python输入球的半径计算球的表面积和体积_球扇形(球心角体)体积,表面积计算公式与在线计算器_三贝计算网_23bei.com...
  18. 对话窗口、面板滚动视图、标签切换视图;QDialog、QScroollArea、
  19. android投影到创维电视,安卓手机投屏到电视的3个方法,赶紧收藏!
  20. 剪切板的使用: 复制 粘贴

热门文章

  1. NIO核心之Channel,Buffer和Selector简介
  2. Docker 容器时区时间不一致问题解决
  3. 最小生成树与最短路径的区别以及实现方法
  4. 试验篇--thttpd安装与调试
  5. explain mysql怎么用_[mysql] mysql explain 使用
  6. ANDROID L日志系统——JAVAAPI与LIBLOG
  7. Android 插件框架实现思路及原理
  8. 【问链-EOS公开课】第八课 EOS 数据库与持久化 API(一)
  9. JZOJ 5490. 【清华集训2017模拟11.28】图染色
  10. three.js 几何体-组合网格_3dmax利用优化和多边形倒角制作饰品组合1