图像金字塔

实验用的数据分辨率过大,不利于算法的收敛,因此做法都是Hierarchical的,不直接求解原分辨率,而是使用采样来建立图像金字塔,再从上到下进行求解。目前想到的有两种:

1)图像缩放    

//opencv function
void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation= INTER_LINEAR );
//src – 原图像
//dst – 结果图像
//dsize – 结果图像大小.dsize = Size(round(fx*src.cols), round(fy*src.rows))
//fx - X方向上缩放系数
//fy - Y方向上缩放系数
//interpolation - 插值方法

    插值方法:取值有以下两种

    – INTER_NEAREST - 最近邻插值

    – INTER_LINEAR - 双线性插值(默认)

    – INTER_AREA - 使用像素面积关系重采样。广泛用于图像抽取的时候

    – INTER_CUBIC - 在4*4的邻域内双三次插值

    – INTER_LANCZOS4 - 在8*8的邻域内的Lanczos插值

    输出图像大小可以根据用户自己设定。当$fx > 1 (fy > 1)$时,在相应的方向上放大图像。当$fx < 1 (fy < 1)$时,缩小图像。

 

 2)高斯金字塔

//opencv function
void pyrUp(InputArray src, OutputArray dst, const Size& dstsize=Size())
//src – 原图像
//dst – 目的图像.与原图像具有相同的数据类型
//dstsize – 目的图像大小.默认的值为Size(src.cols*2, src.rows*2) .

    任何情况下,需要保证:

    $|dstsize.width - src.cols * 2| \leq  (dstsize.width{\quad}mod{\quad2})$

    $|dstsize.height - src.rows * 2| \leq  (dstsize.height{\quad}mod{\quad2})$

     pyrUp 图像的上采样 输出图像,宽度和高度应是输入图像的2倍。filter 卷积滤波器的类型,目前仅支持 CV_GAUSSIAN_5x5 函数。pyrUp 使用Gaussian 金字塔分解对输入图像向上采样。首先通过在图像中插入 0 偶数行和偶数列,然后对得到的图像用指定的滤波器进行高斯卷积,其中滤波器乘以4做插值。所以输出图像是输入图像的 4 倍大小。

//opencv function
void pyrDown(InputArray src, OutputArray dst, const Size& dstsize=Size())
//src – 原图像
//dst – 目的图像。与原图像数据类型抑制
//dstsize – 目的图像大小. 默认值为Size((src.cols+1)/2, (src.rows+1)/2)

    任何情况下,始终要满足:

    $|dstsize.width*2- src.cols| \leq 2$

    $|dstsize.height*2- src.rows| \leq 2$

    pyrDown 图像的下采样。输出图像宽度和高度是输入图像的一半 ,传入前已经完成初始化 filter 卷积滤波器的类型,目前仅支持 CV_GAUSSIAN_5x5 函数(默认值)。pyrDown 使用 Gaussian 金字塔分解对输入图像向下采样。首先它对输入图像用指定滤波器进行卷积,然后通过拒绝偶数的行与列来下采样图像。

    两种方法不同在于采样方法,pyrUp和pyrDown使用的是高斯卷积先滤波,去掉那些高频的细节信息,去掉偶数行和列得到分辨率为原图一半的结果,这个结果与原图的差异就是细节。要正确的恢复原来大小的图,这个细节也需要保存起来,和结果图一起进行恢复。可能肉眼看不出结果图那些丢失的细节,但是结果还是有差别的。

 

posted on 2012-03-19 20:18  拼装小火车  阅读(2271)  评论(0编辑  收藏  举报