96SEO 2026-02-20 08:20 0
href="https://www.cnblogs.com/ljbguanli/p/19620522"

xmlns="http://www.w3.org/2000/svg"> style="-webkit-tap-highlight-color: 0)">d="M5,0
rgba(0,
简介:个人学习分享,如有错误,欢迎批评指正。
拉普拉斯金字塔,把高分辨率图像分解成小分辨率的子图,然后根据之前保留的残差图重构出原始高分辨率图,给定一个输入,然后得到的结果还是原输入。
拉普拉斯金字塔可以看作
0,就可以减少数据存储所需空间,同时图像的基本信息不变。
实际存储只需要记录每个尺度下的少量高频
低分辨率的低频(图面积还小)。
除了压缩,拉普拉斯金字塔还有很多应用,如图像拼接(image
blending)等。
图像金字塔是由一幅图像的多个不同分辨率的子图所构成的图像集合(如下图所示)。
该组图像是由单个图像通过不断地降采样所产生的,最小的图像可能仅仅有一个像素点。
src="https://i-blog.csdnimg.cn/direct/890e8688de614b78894f81d73ff565da.png">
通常情况下,图像金字塔的底部是待处理的高分辨率图像(原始图像),而顶部则为其低分辨率的近似图像。
向金字塔的顶部移动时,图像的尺寸和分辨率都不断地降低。
通常情况下,
每向上移动一级,图像的宽和高都降低为原来的二分之一。
id="1_16">1.向上采样和向下采样生成金字塔的过程
向下采样过程
首先原始图像滤波,得到原始图像的近似图像,然后将近似图像的偶数行和偶数列删除以获取向下采样的结果。
有多种滤波器可以选择。
例如:
该滤波器能够产生平均金字塔。
高斯滤波器:采用高斯滤波器对原始图像进行滤波,得到高斯金字塔。向上采样过程
首先对像素点以补零的方式完成插值。
通常是在每列像素点的右侧插入值为零的列,在每行像素点的下方插入值为零的行。
如下图所示:左侧是要进行向上采样的
个像素点,右侧是向上采样时进行补零后的处理结果。
src="https://i-blog.csdnimg.cn/direct/855a1226fbf94a559c66cb0239d0d2ca.png">
接下来,使用向下采样时所用的高斯滤波器(高斯核)对补零后的图像进行滤波处理,以获取向上采样的结果图像。
但是需要注意,此时图像中四分之三像素点的值都是零。
所以,要将高斯滤波器系数乘以
4,以保证得到的像素值范围在其原有像素值范围内。
id="_37">
二、高斯金字塔高斯金字塔,概念比较简单,对高分辨率图像先做高斯模糊,再将图像大小缩小到原来的
src="https://i-blog.csdnimg.cn/direct/1f3b346285014b5a85f8ef95a8b65d95.png#pic_center"
width="500">
缩小这一步实现上比较简单,只要去掉所有奇数行或者偶数行即可。
尤其是注意高斯金字塔的第一层和最后一层,第一层就是原始图像,分辨率最高;最后一层是分辨率最小的图像,也是后续拉普拉斯金字塔中的起点。
代码:
function">pyramid_downsample
class="token
function">downsampled
class="token
punctuation">(
ucharclass="token
punctuation">::
vectorclass="token
function">build_gaussi_pyramid
class="token
punctuation">(
sourceclass="token
punctuation">(
sourceclass="token
punctuation">::
vectorclass="token
punctuation">;
gaussi_pyramidclass="token
punctuation">(
layers_numclass="token
punctuation">;
gaussi_pyramidclass="token
function">emplace_back
class="token
punctuation">(
source_cropedclass="token
function">fast_gaussi_blur
class="token
punctuation">(
source_cropedclass="token
function">pyramid_downsample
class="token
punctuation">(
source_cropedclass="token
放到高斯金字塔中
gaussi_pyramidclass="token
function">emplace_back
class="token
punctuation">(
source_cropedclass="token
punctuation">}
如图
src="https://i-blog.csdnimg.cn/direct/fd9cc505289243ce846e0e49dfab7d86.png">
OpenCV
cv2.pyrUp(),分别用于实现图像高斯金字塔操作中的向下采样和向上采样,其语法形式为:
punctuation">.pyrDown
class="token
punctuation">.
pyrUpclass="token
punctuation">)
BORDER_DEFAULT。
注意:如果先对原始图像进行向上采样,再进行向下采样,不会得到原始图像,即不可逆!
因为在此操作的过程中,经过删除列和行,会有信息的丢失。
向下采样运行结果图,如下:
src="https://i-blog.csdnimg.cn/direct/30c17fcc7da24448a196985b1085ea77.png">
向上采样运行结果图,如下所示,明显可以发现图像已模糊
src="https://i-blog.csdnimg.cn/direct/3178da7ee48749c88e0a6321a5076dc3.png">
id="_117">
三、拉普拉斯金字塔前面我们已经介绍过,一幅图像在经过向下采样后,再对其进行向上采样,是无法恢复为原始状态的。
为了在向上采样时能够恢复具有较高分辨率的原始图像,就要获取在采样过程中所丢失的信息,这些丢失的信息就构成了拉普拉斯金字塔。
拉普拉斯金字塔的定义形式为:
class="katex-mathml">Li=Gi−pyrUp(Gi+1)Li class="mclose">)class="katex">
pyrUp(Gi
class="katex-mathml">LiL_i mtight">i class="vlist-s"> class="">class="katex">
class="base">
class="vlist"
class="katex-mathml">GiG_i
mtight">i
class="vlist-s">
class="">
class="katex-mathml">GiG_i
mtight">i
class="vlist-s">
class="">
+1层。
拉普拉斯金字塔中的第
层的向上采样结果”之差。
如下图所示,展示了高斯金字塔和拉普拉斯金字塔的对应关系。
src="https://i-blog.csdnimg.cn/direct/0aa1a940837049299c861f01f0fc6934.png">
可以发现,先下采样,后上采样,丢失了很多细节(下采样和上采样不是可逆的,而上采样是病态多解问题)。
那么同分辨率相减,多层叠加起来就是拉普拉斯金字塔!
可以发现,不同尺度下关注的细节是不一样的!
如下图,将最小分辨率和最高分辨率的拉普拉斯图同尺度比较,可以发现,低分辨率关注的是接近于
的基础纹理(大纹理),而高分辨率下关注的细节是更精细的纹理(小纹理)
src="https://i-blog.csdnimg.cn/direct/99cbb40aa97041a9b7980e90e1328b37.png#pic_center"
2
建立拉普拉斯金字塔的代码如下:
有一些小细节,例如,存储拉普拉斯结果的数据类型是
就太浪费了,精度也不会更高,毕竟后面用于压缩,能省一点是一点;char
punctuation">::vector punctuation">:: operator">< function">build_laplace_pyramid punctuation">:: punctuation">:: punctuation">:: operator">< punctuation">; punctuation">(class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
function">pyramid_upsample
punctuation">(
gaussi_pyramidfunction">pyramid_upsample_interpolate
punctuation">(
upsampledpunctuation">::
vectoroperator"><
res_typepunctuation">(
lengthpunctuation">)
residualpunctuation">;
laplace_pyramidfunction">emplace_back
punctuation">(
residualpunctuation">(
laplace_pyramidpunctuation">}
id="_178">
四、重构拉普拉斯金字塔的作用在于,能够恢复高分辨率的图像。
下图演示了如何通过拉普拉斯金字塔恢复高分辨率图像。
其中,右图是对左图的简化。
src="https://i-blog.csdnimg.cn/direct/74e1b1a41ff74befb1fed3605698ad0b.png">
上图中各个标记的含义如下:
class="katex-mathml">G0、G1、G2、G3G_0、G_1、G_2、G_3
mtight">0
class="vlist-s">
class="">
mtight">1
class="vlist-s">
class="">
mtight">2
class="vlist-s">
class="">
mtight">3
class="vlist-s">
class="">
分别是高斯金字塔的第class="katex-mathml">L0、L1、L2L_0、L_1、L_2 mtight">0 class="vlist-s"> class=""> mtight">1 class="vlist-s"> class=""> mtight">2 class="vlist-s"> class="">class="base">
class="vlist"
class="mord
class="vlist"
class="mord
class="vlist"
cv2.pyrDown()函数)。
cv2.pyrUp()函数)。
language-python">拉普拉斯金字塔恢复高分辨率图像的步骤:
punctuation">.
pyrDownclass="token
punctuation">.
pyrDownclass="token
punctuation">.
pyrDownclass="token
punctuation">.
pyrUpclass="token
punctuation">.
pyrUpclass="token
punctuation">.
pyrUpclass="token
punctuation">.
pyrUpclass="token
punctuation">.
pyrUpclass="token
punctuation">.
pyrUpclass="token
虽然是简单的相加减关系,但是可以此过程的中间操作图像,进行创新
实际效果也确实还可以,增强了不少细节
src="https://i-blog.csdnimg.cn/direct/1e87520dbed5471c9622cb28a1d9428c.png#pic_center"
x2。
并且,每个尺度下重构的图像都是无损还原!
全部代码
punctuation">.imread
class="token
string">"pyramid.jpg"
class="token
punctuation">.
pyrDownclass="token
punctuation">.
pyrDownclass="token
punctuation">(
down0class="token
punctuation">.
pyrDownclass="token
punctuation">(
down1class="token
string">"逐个向下采样后的图像尺寸:"
class="token
punctuation">.
shapeclass="token
punctuation">.
shapeclass="token
punctuation">.
shapeclass="token
punctuation">.
shapeclass="token
punctuation">.
pyrUpclass="token
punctuation">(
down2class="token
punctuation">.
pyrUpclass="token
punctuation">.
pyrUpclass="token
string">"逐个向上采样后的图像尺寸:"
class="token
punctuation">.
shapeclass="token
punctuation">.
shapeclass="token
punctuation">.
shapeclass="token
punctuation">.
pyrUpclass="token
punctuation">(
down1class="token
punctuation">.
pyrUpclass="token
punctuation">(
down2class="token
string">"拉普拉斯变换后的图像尺寸:"
class="token
punctuation">.
shapeclass="token
punctuation">.
shapeclass="token
punctuation">.
pyrUpclass="token
punctuation">(
down1class="token
punctuation">.
pyrUpclass="token
punctuation">(
down2class="token
string">"拉普拉斯变换恢复的图像尺寸:"
class="token
punctuation">.
shapeclass="token
punctuation">.
shapeclass="token
punctuation">.
imshowclass="token
punctuation">.
imshowclass="token
punctuation">.
imshowclass="token
punctuation">.
imshowclass="token
punctuation">.
waitKeyclass="token
punctuation">.
destroyAllWindowsclass="token
punctuation">.
imshowclass="token
punctuation">.
imshowclass="token
punctuation">.
imshowclass="token
punctuation">.
waitKeyclass="token
punctuation">.
destroyAllWindowsclass="token
punctuation">.
imshowclass="token
punctuation">.
imshowclass="token
punctuation">.
waitKeyclass="token
punctuation">.
destroyAllWindowsclass="token
punctuation">.
imshowclass="token
punctuation">.
imshowclass="token
punctuation">.
waitKeyclass="token
punctuation">.
destroyAllWindowsclass="token
punctuation">)
前面知道,拉普拉斯金字塔分解和重构,输入什么,输出的就是输入,并没有什么意思,但是这对于压缩而言,具有意义。
从分解到重构是无损失的,那如果有损失呢?
每个尺度下都损失一部分不重要的分量,保留主要分量,然后按照拉普拉斯金字塔重构,得到的结果虽然是有损的,但变化不大,且由于去除了一部分不重要的分量,存储上可以做优化。
那去掉哪一部分呢?
图像中
低频分量占主要部分,是图像的主要内容,但由于重构只需要最低分辨率下的小图,这一部分存储占的比例很小。
图像中
高频分量是占少数的,在这里就是多尺度下的拉普拉斯金字塔,但通过观察发现,每个尺度下的细节是很少的,如下,我们真正需要保存的就是细节中的更高频分量,那些接近于
src="https://i-blog.csdnimg.cn/direct/2cd25ebbb2864b27b3cad51643041e2d.png#pic_center"
width="200">
最高分辨率时的细节
下图是阈值为
时,每个尺度的拉普拉斯金字塔保留的点的比例,和信息损失,可见,在高分辨率下,PSNR
src="https://i-blog.csdnimg.cn/direct/3f6a69d222e34cc08428f1ebe923902d.png#pic_center"
src="https://i-blog.csdnimg.cn/direct/ac6ecc8ea4da4915a400f7ab33531a42.png#pic_center"
压缩前后的对比;右侧是细节对比
可以发现,虽然整体内容上看不大出来区别,但细节上确实有一定损失的,而且因为根据阈值筛选是全局的操作,因此不保证之前的弱边缘还能保持连续。
以上是对图像信息的压缩,那如果是存储呢?
根据
金字塔压缩信息的特点,对有损图像进行存储优化,实际需要保存的信息就是
金字塔每一层中,大于某个阈值的点坐标,以及这个点在多个通道上的灰度值
src="https://i-blog.csdnimg.cn/direct/aafc9b39f8424f3ba29f1d611fe28248.png">
是有损存储,压缩之后所需空间非但没有降低,还增大了!
如果增加金字塔的层数,毕竟尺度越大的高频细节越稀疏,同时提高阈值,过滤更多的无关细节,分辨率
src="https://i-blog.csdnimg.cn/direct/832526536e2e4c3a809a3746f5500ba3.png#pic_center"
width="500">
laplace_compressed:
opencv
按照上面的存储格式,实际存储的结果,只存储了最低分辨率的结果以及压缩之后的拉普拉斯金字塔信息;
reconstructed:
一样存储成二进制格式,存储宽、高、通道数目和图像内容等信息;
从上面可以看出几个初步结论:
laplace金字塔和低分辨率图像写入的二进制文件,二者包含的图像信息是一样多的,但存储上确实有效,我上面的尝试是可行的!
char数据,因此在存储上没有任何优化,这也说明了上一条的必要性。
reconstructed的存储所需空间很相近,说明宽、高、通道数目和图像内容足够描述原来的图像信息
。
但是由于压缩的太狠了,所以信息损失地有点多!
重建的最高分辨率相比原图只有
src="https://i-blog.csdnimg.cn/direct/f2294422951a4ae499b3ce02589ae701.png#pic_center"
多尺度细节保留的点的比例,和对应信息损失
src="https://i-blog.csdnimg.cn/direct/8cacbcf6b95842818ae230e267cda23a.png#pic_center"
src="https://i-blog.csdnimg.cn/direct/6f09780cc9ce41a0b29cdf28b9c20cf6.png#pic_center"
width="200">
压缩之后
虽然效果不是很好,却是一次很好的实践!
id="_361">六、图像融合
拼接
金字塔分解和重构,我是想不到还可以用于图像融合的。
还是从一些博客中提到用来图像拼接之类的引用。
假设,现在有以下左右两幅图,我想把左图
src="https://i-blog.csdnimg.cn/direct/28e2ed5c583b458d8a7216035c5511f4.png#pic_center"
class="katex-mathml">O=M∗L+(1−M)∗RO=M*L+(1-M)*R 0.0077em">Rclass="base">
src="https://i-blog.csdnimg.cn/direct/0b9e72b029ff444387855061089ef491.png#pic_center"
图
直接拼在一起,可以得到下图
src="https://i-blog.csdnimg.cn/direct/08a4d555efb2494f8dac7210fe41819d.png#pic_center"
width="400">
很明显,中间过渡的部分存在一条缝!
因为左图和右图在亮度和颜色上都不同,怎么解决?
一个很直观的想法就是,把中间那条缝给模糊掉,比如使用高斯模糊等手段对
图,使得左图右图交界处相互渗透,平滑灰度突变的结果,再将二者融合,灰度突变也许就不会这么明显了。
(为什么是对
图做模糊,而不是对左图右图?
因为要保留左图和右图的细节,不宜平滑二者细节,于是平滑
的平滑不影响原来的细节强弱)
直接实验
src="https://i-blog.csdnimg.cn/direct/6b5e5769ff504d8ab01b7338d0bbf67f.png#pic_center"
src="https://i-blog.csdnimg.cn/direct/1413ed455b8345c3b0f5db56972a0cb4.png#pic_center"
src="https://i-blog.csdnimg.cn/direct/e149a636ca2a46e3897f2cbbb1a9e19a.png#pic_center"
好像又更好了!
缝隙已经不大看的出来了,但是二者亮度差还是有点大,加大力度!
src="https://i-blog.csdnimg.cn/direct/c162cedb8bff4eaf86e0766ff3546c90.png#pic_center"
src="https://i-blog.csdnimg.cn/direct/b5dd0b2e780a4514b49f974b63c8d8d9.png#pic_center"
我的天!
现在缝隙已经消失了,而且从左边到右边的过渡也自然多了,完成任务!
虽然上面逐渐增强高斯模糊的力度,但是存在两个问题
高斯模糊的半径
600x600,消耗太大了!
第一个问题——这就可以用到金字塔,构建多尺度,不必每次都增大高斯模糊的半径,降低分辨率可以近似“更大半径的高斯模糊”的效果。
想象一下,有一张分辨率高分辨率图像,构建高斯金字塔,每个尺度下根据上面的方法,对当前尺度下的
拼接这个尺度的左图、右图,每个尺度下都可以得到一个拼接的结果,但实际上我们只需要最高分辨率时的拼接结果,如何结合那些更小分辨率的结果?
考虑这次的
做模糊,但是拼接的不是各尺度的高斯金字塔的图像,拼接的是各尺度的
金字塔
金字塔重建,这样从低分辨率到高分辨率重建就可以得到一张最高分辨率的图像,
发生了什么?
每个尺度下其实都对不同尺度关注的细节做了
平滑了拼接处的大纹理的过渡,近似于高分辨率下就是一大段的平滑效果…最高分辨率下的
平滑的程度比较弱,处理的就是那些更小的纹理的过渡——这样多个尺度不断平滑,使得多个尺度的细节过渡都更自然,因此,最后得到的高分辨率结果就是过渡自然的结果。
第二个问题——选多狠的高斯模糊是最合适的呢,waiting…
根据上面的分析,对
做图像拼接的过程做个总结
步骤
class="katex-mathml">GLG_L
mtight">L
class="vlist-s">
class="">
class="katex-mathml">GRG_R
0.0077em">R
class="vlist-s">
class="">
class="katex-mathml">LapLLap_{L} mtight">L class="vlist-s"> class="">class="base">
class="vlist"
class="katex-mathml">LapRLap_{R}
0.0077em">R
class="vlist-s">
class="">
class="katex-mathml">GmaskG_{mask} 0.0315em">k class="vlist-s"> class="">class="base">
class="vlist"
class="katex-mathml">GmaskG_{mask}
0.0315em">k
class="vlist-s">
class="">
拼接左、右图的class="katex-mathml">LapLLap_{L}
mtight">L
class="vlist-s">
class="">
class="katex-mathml">LapRLap_{R}
0.0077em">R
class="vlist-s">
class="">
class="katex-mathml">LapfusedLap_{fused} mtight">d class="vlist-s"> class="">class="base">
class="vlist"
class="katex-mathml">GLG_L
mtight">L
class="vlist-s">
class="">
class="katex-mathml">GRG_R
0.0077em">R
class="vlist-s">
class="">
class="katex-mathml">GmaskG_{mask}
0.0315em">k
class="vlist-s">
class="">
class="katex-mathml">OminO_{min}
mtight">min
class="vlist-s">
class="">
class="katex-mathml">OminO_{min}
mtight">min
class="vlist-s">
class="">
开始,根据class="katex-mathml">LapfusedLap_{fused}
mtight">d
class="vlist-s">
class="">
构建得到最高分辨率的拼接结果。
直接实验:
src="https://i-blog.csdnimg.cn/direct/6411d9730fac4d589a8b28f9de7dcb17.png#pic_center"
3
src="https://i-blog.csdnimg.cn/direct/2bf3629b32de4c7389b546209c5c6a09.png#pic_center"
src="https://i-blog.csdnimg.cn/direct/526eb03d8d8542b3ac03e19923eb5942.png#pic_center"
可以发现,随着拉普拉斯金字塔层数的增大,拼接的效果是越来越好的。
这也近似于之前使用了更狠的高斯模糊。
虽然看起来效果还不错,但这是建立在左图右图“能”拼接的基础上,比如上面的例子,左图跟右图在拼接处是比较吻合的,没有一高一低的情况。
因此基于
金字塔的图像拼接限制挺大的,对左图和右图匹配性有很高的要求,一般需要先经过配准。
参考资料:
图像处理基础(十)拉普拉斯金字塔、压缩、图像融合
你真正了解图像金字塔吗?
详细介绍拉普拉斯金字塔和高斯金字塔(pyrDown()
pyrUp()),参考《OpenCV轻松入门:面向Python》
结~~~
class="post-meta-container">
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback