多相位图像插值算法(Lanczos、sinc)

转:http://blog.csdn.net/swimmingfish2004/article/details/7312361

Lanczos Algorithm Analyse

在公司时候研究过的Lanczos图像缩略算法,今天整理出来给大家分享,分析的是imagemagic里面的lanczos resize的源码。

1 图像缩放原理简介

图像缩放的基本原理就是根据原图像的像素值通过一定的规则计算得到目标图像的像素值。在图像缩放的过程中,最重要的就是确定下面两个问题:一是计算目的图像中的每一个像素值时,应该选取原图像中哪些像素值;二是这些选取出的像素值在计算目的像素时权重如何确定。

2 lanczos算法介绍

通常根据确定参与计算的像素权重的方式来分类各种图像interpolation algorithm。Lanczos算法用到的数学公式如下:

我们可以画出a=2,a=3时的L(x)图像

假定我们的一维函数用f(x)来表示,I(x)来表示由n个f(x)的值通过lanczos filter来得到其值,则I(x)的计算如下:

二维、三维的表示类似。 下面只给出一个二维的计算公式:

简言之,我们使用lanczos算法的主要作用就是由其确定各个参与计算的像素值的权重。

3 现实时需要考量的点

3.1计算目的像素时需要选取哪些像素点

在lanczos算法中是选取一个矩形区域来计算新的像素点

3.2选取像素计算点时从哪里开始

在lanczos algorithm中应该图像中间的像素比图像两边的像素重要,因此在选取使用的像素时是由中间开始来选取的。

4 MagicImage中Lanczos算法实现的分析

4.0最重要的文件

Magic/resize.c

4.1 主要流程调用

4.1.1 ZoomImage

MagickExport Image *ZoomImage(const Image *image, const unsigned long columns, const unsigned long rows, ExceptionInfo *exception)

这个函数中,输入:image指向原始的图像,columns和rows表示缩放后的像素大小,输出:缩放后的图像

ZoomImage中调用ResizeImage函数

4.1.2 ResizeImage

MagickExport Image *ResizeImage(const Image *image, const unsigned long columns, const unsigned long rows, const FilterTypes filter,const double blur, ExceptionInfo *exception)

这个函数中,输入:filter是指缩放函数使用的类型,blur是指模糊化的系统

输出:缩放后的图像

在这个函数中完成缩放功能:主要分为四个步骤:

第一步:先生成一个缩放后图像的像素空矩阵和一个过渡图像的像素空矩阵,连同原始图片的像素矩阵这里一共有三个像素矩阵,比如,将一幅10*10像素的图像缩放成6*6像素的图象:在这里产生了三个像素矩阵:10*10的原像素矩阵,6*6的目的像素矩阵(数据不正确),6*10或10*6的过渡像素矩阵(数据不正确)

第二步:获取过滤算法的参数,比如使用什么样的interpolation算法、模糊化参加是多少等等。这样具体就是调用AcquireResizeFilter函数来填充一个resize_filter结构。

第三步:就是调用:HorizontalFilter函数和VerticalFilter函数,分别计算行的缩放和列的缩放

第四步:返回缩放好的像素矩阵并释放相应的内存结构

4.1.3 AcquireResizeFilter

MagickExport ResizeFilter *AcquireResizeFilter(const Image *image, const FilterTypes filter,const MagickRealType blur, const MagickBooleanType cylindrical,ExceptionInfo *exception)

这个函数中输出:一个填充好的resize_filter结构

主要的数据结构有:mapping二维数组,用来指定使用的interpolation algorithm和filter type

Filters二维数组,用来指定过滤器所用的函数和初始值,如我们选用Lanczos algorithm,由表可知,所使用的函数为sinc,初始值为1.0,使用的sinc函数为3的sinc函数,即:

L(x) = sinc(x)*sinc(x/3) = sin(x) * sin(x/3)/3 当-3<x<3时,x取其它值时L(x)=  0


1

2

3

4

5

resize_filter->blur//设置模糊度

resize_filter->support = 3.0

resize_filter->scale = 1.0

resize_filter->filter = sinc

resize_filter->window = sinc

4.1.4 HorizontalFilter

计算x_factor,y_factor,公式如下:

x_factor = 缩放后的水平像素值/原图片的水平像素值

y_factor = 缩放后的垂直像素值/原图片的垂直像素值

在本例中,x_factor = 0.6,y_factor = 0.6

static MagickBooleanType HorizontalFilter(const ResizeFilter *resize_filter, const Image *image,Image *resize_image,const MagickRealType x_factor, const MagickSizeType span,MagickOffsetType *quantum,ExceptionInfo *exception)

这个函数的输入:quantum = 0,span = 6+6

image_view与resize_view,这两个值与CMYK颜色空间有关

Contributions数组:这个数组负责filter器的装入,即这个数组的值由GetResizeFilterWeight函数调用sinc函数,添入相应的计算值

其计算过程如下:

计算的顺序,先水平计算完所有红色框的内容,向右移一列,再水平计算绿色框的数据,即先水平再垂直。

所以为循环的


1

2

3

4

5

6

for (columns)

{

    for(rows)

        {

        }

}

4.1.5 VerticalFilter

详见HorizontalFilter

另外的资料

2. 3. 4 缩放模块
  视频缩放包括放大( up scaling ) 和缩小( downsca ling )两个方面,而进行缩放的基本方法为空间插值。下式为对图像进行插值的一般数学表达式,其中g ( i,j)为缩放图像中待插值点的像素值,f ( k,l)为原始图像中坐标( k,l)处的像素值,h( i- k,j - l)为插值基函数。

  插值基函数的选择可以有很多种,通常有二维的矩形函数、线性函数、三次函数及S inc 函数等,它们分别对应于最近邻插值、线性插值、三次插值以及理想插值(实际中利用S inc函数截断后插值) ,其插值效果为从差到好排列,但实现难度也依次提高。在实际处理中是利用滤波器来实现插值基函数,而且由于这些插值的对称性,可以将其分解为横向和纵向插值两部分分开进行,如二维线性插值函数对应双线性插值( Bilinear Interpo lation),三次函数对应双三次插值( B icub ic Interpo lation) ,对于Sinc 插值函数实际中为多相位插值( Po lyphase Interpo lation)。本文使用多相位插值法实现图像缩放,实际上在4 ? 4领域大小内进行多相位插值和三次插值几乎是一样的,只是对应插值函数值略微不同。多相位插值法是通过对输出点对应原图中的领域进行Lanczos2 函数移相插值来产生输出点的。如图11所示。


图11 Lanczos2 函数
  假设g ( u,v )为经缩放后输出图像中一点,其还原到原图像的最近点为f ( i,j) 且两者在原图中相差( x,y )的坐标,则输出点g ( u,v)的数学表达如下,从其可以看出实际上分为两步实现分别进行垂直滤波和水平滤波。


  其中有关系式: i = ( u ×W in ) /W out,j = ( v ×H in) /H out; x = ( u × W in)% W out,y = ( v ×H in)%H out。W in 和Wout分别为缩放前后的图像宽度,H in和H out分别为缩放前后的图像高度。图12为4 ×4领域水平垂直相位,其中的水平相位值分别为PH 0,PH 1,PH 2,PH 3,垂直相位值分别为PV0,PV1,PV2,PV3。只要根据上述关系式求得x,y 值就能获得8 个相位值,就能实现多相位滤波。


图12 4×4 领域水平垂直相位
  图13为本文设计的图像缩放器中滤波器部分框图,其中的垂直水平查找表里分别存放着4个不同相位的Lanczos2 函数值。

图13 图像缩放器中的滤波器
(本文转自电子工程世界:http://www.eeworld.com.cn/FPGA/2011/0330/article_1947_2.html)

时间: 2024-10-07 13:14:29

多相位图像插值算法(Lanczos、sinc)的相关文章

几种插值算法对比研究

[研究内容] 目前比较常用的几种插值算法 [正文] 目前比较常用的插值算法有这么几种:最邻近插值,双线性二次插值,三次插值, Lanczos插值等等,今天我们来对比一下这几种插值效果的优劣. 1,最邻近插值 最邻近插值算法也叫做零阶插值算法,主要原理是让输出像素的像素值等于邻域内 离它距离最近的像素值.例如下图中所示,P1距离0灰度值像素的距离小于100灰度值的 距离,因此,P1位置的插值像素为0.这个算法的优点是计算简单方便,缺点是图像容 易出现锯齿. 2,双线性二次插值 在介绍双线性插值前,

图像缩放——双线性插值算法

在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值.如果选择一个坐标系统使得  的四个已知点坐标分别为 (0, 0).(0, 1).(1, 0) 和 (1, 1),那么插值公式就可以化简为: 用矩阵运算来表示的话就是: 图像的空间变换,也称几何变换或几何运算,包括图像的平移.旋转.镜像变换.转置.缩放等.空间变换可如下表示:设(u,v)为源图像上的点,(x,y)为目标图像上的点,则空间变换就是将源图像上(u,v)处的颜色值与目标图像上(x,y)处

图像处理之三种常见双立方插值算法

http://blog.csdn.net/jia20003/article/details/40020775 图像处理之三种常见双立方插值算法 双立方插值计算涉及到16个像素点,其中(i', j')表示待计算像素点在源图像中的包含 小数部分的像素坐标,dx表示X方向的小数坐标,dy表示Y方向的小数坐标.具体 可以看下图: 根据上述图示与双立方插值的数学表达式可以看出,双立方插值本质上图像16个像素点 权重卷积之和作为新的像素值. 其中R(x)表示插值表达式,可以根据需要选择的表达式不同.常见有基

关于拉格朗日和内维尔插值算法的python实现

先是逐步插值,主体十分简单,关键在于算法部分,我运用了矩阵的数据结构来存储每次迭代后的新值.角标的循环初看可能有些复杂,自己动手走一遍就会很清楚啦 1 #coding=gbk 2 ''' 3 Created on 2014-8-31 4 5 @author: Administrator 6 ''' 7 8 def Neville(xt,m,n,x): 9 for i in range(1,n): 10 for j in range(1,n): 11 w[i-j][i]=(x-xt[i-j])/(

OpenGL 实现Interpolation插值算法

这是一个静态插值算法的效果,图形学中插值算法应用十分广,如动画,photoshop, autocAD等软件画曲线,还有shader中的渐变上色也是一个硬件支持的插值算法. Interpolation是很低层的算法,在图形学中可以说无处不在. 本程序通过设置两个vector,然后就可以在这两个vector之间插入点,得到不同的效果 如两个vector不同长度可以得到: 如果长度相同,就可以得到一个扇形: 全部自家定义的函数实现的,主要代码: 一)计算两个向量的夹角,返回夹角大小: float ca

lanczos算法及C++实现(二)实对称阵奇异值分解的QR算法

本文属作者原创,转载请注明出处: http://www.cnblogs.com/qxred/p/qralgorithm.html 首先推荐两个参考文献 https://www.math.kth.se/na/SF2524/matber15/qrmethod.pdf http://people.inf.ethz.ch/arbenz/ewp/Lnotes/chapter4.pdf 1. 基本的QR算法 我们先讨论一般对阵矩阵的QR算法,再讨论对称三对角阵的QR算法 给定一个实对称阵X,假设其特征值分解

[矩阵计算]Lanczos方法:求稀疏矩阵特征值

更新: 29 JUL 2016 由QR方法知,求矩阵$A$的特征值,大多需要先将其三对角化(详细方法见徐树方先生的教材.此处外链一个例子),即 $$ T=Q^TAQ $$ 即找到正交矩阵$Q$使得$T$成为三对角矩阵.然而若$A$为大型稀疏矩阵,常用的方法如Householder和Givens变换都无法充分利用$A$的稀疏性,因此考虑直接计算$T$和$Q$的矩阵元以利用$A$的稀疏性加速运算. 一.Lanczos方法基本原理 将以上分解式中的$Q$写成 $$ Q=[q_1,q_2,\cdots,

lanczos算法及C++实现(三)实对称三对角阵特征值分解的分治算法

本文属作者原创,转载请注明出处 http://www.cnblogs.com/qxred/p/dcalgorithm.html 本系列目录: lanczos算法及C++实现(一)框架及简单实现 lanczos算法及C++实现(二)实对称阵奇异值分解的QR算法 lanczos算法及C++实现(三)实对称三对角阵特征值分解的分治算法 0. 参考文献 https://en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm A. Mel

图像处理之基础---图像缩放中的一些 灰度插值算法

在图像缩放,旋转等一些图像处理中,对图像进行插值是不可缺少的一个步骤,下面对一些常用的插值算法进行介绍: 1.最近邻插值 这种插值方法是最简单的一种插值算法,图像输出的像素值的大小直接设为与其最邻近的点的大小即可,这个算法最简单,不需要多说,可以表示为 f(x,y) = g(  round(x)  ,   round(y)  ) 原图