最近我对拉普拉斯金字塔算法(http://persci.mit.edu/pub_pdfs/pyramid83.pdf)感到非常有趣。但一个大问题是原始论文限于2 ^ m + 1 * 2 ^ n + 1个图像。我的问题是:处理任意w * h的最佳方法是什么?我可以想到几个选项:
有人有这方面的经验吗?什么是最实用和最有效的方法?此外,任何有关此问题的论文都会受到欢迎。
答案 0 :(得分:3)
一种方法是创建宽度和高度等于下一个2 ^ m + 1,2 ^ n + 1的图像,但不是对图像进行上采样以填充展开的尺寸,只需将其放入左上角并使用常量值向右和向下填充空白区域(图像的平均值是一个很好的选择)。然后以正常方式编码,将原始图像尺寸与金字塔一起存储。解码,解码然后裁剪为原始大小。
这不会引入任何视觉瑕疵或降级,因为您不会以任何方式拉伸或偏移图像。
由于原始图像右侧和下方的空白区域是一个常数值,因此图像金字塔中每个级别的高通条带将在此区域全为零。因此,如果您使用像运行长度编码这样的压缩方案来存储每个级别,那么这将自动处理掉,这些区域将被压缩到几乎为零。如果没有,则可以简单地存储每个级别的左上角(可能非零)区域,然后在解码时用零填充其余区域。
您可以找到每个级别的非零值的最小和最大x和y边界矩形,并将其与级别一起存储,裁剪为仅包含非零值。解码器也可以进行优化,以便通过仅处理每个级别的左上角,首先实际解码将要被裁剪掉的图像区域。
以下是该技术的说明:
您可以使用平面颜色填充右下区域,而不是在图像的右侧和下方填充图像的水平和垂直镜像副本,而是在两个方向上镜像到右下角,如同这样:
这将避免第一种技术的不连续性,尽管dx将存在不连续性(例如,如果该值从左向右逐渐增加,则它将突然减少)。选择保持dx恒定且ddx为零的镜像将通过线性外推值来避免这种二阶不连续性。
另一种类似于某些JPEG编码器将图像填充到整个MCU块的技术,是采用每行的最后一个像素值并重复它,同样对于列,使用底部用于填充右下区域的图像的最右侧像素:
可以很容易地修改最后一种技术来推断值的梯度甚至梯度的渐变,而不是仅仅为行或列的其余部分重复相同的值。