OpenCV-python学习笔记(十一)——图像金字塔

十一、图像金字塔

图像金字塔是由一幅图像的多个不同分辨率的子图所构成的图像集合

金字塔自底向上分辨率逐渐降低的图像集合。通常情况下,每向上移动一级,图像的宽和高都降低为原来的二分之一
在这里插入图片描述

11.1 理论

图像金字塔是高分辨率图像(大尺寸)产生低分辨率的近似图像(小尺寸)

可以先对原始图像进行滤波,得到原始图像的近似图像,将近似图像的偶数行和欧数列删除以获得向下采样的结果。

(1)邻域滤波器: 采用邻域平均技术求原始图像的近似图像,此滤波器能产生平均金字塔

(2)高斯滤波器: OpenCV函数cv.pyrDown()所采用的方式。

下图为高斯金字塔生成的过程
在这里插入图片描述

向上采样的过程中,要在结果图像中补充大量像素点,对新生成的像素点进行赋值,叫做差值处理

完成插值的方式有很多种,通常在每个像素点的右侧插入值为0的列,在下方插入值为0 的行,再使用高斯滤波器对补零后的图像进行滤波处理,获取向上采样的结果图像,因为四分之三像素点的值都是零,所以,高斯滤波器系数要乘以4,保证得到的像素值范围在其原有像素值范围内。

向上向下操作是不可逆操作

11.2 pyrDown函数及使用

cv2.pyrDown()函数 实现金字塔向下采样

dst=cv2.pyrDown (src[,dstsize[,borderType]])

dstsize: 目标图像大小

borderType: 边界类型,默认值为BORDER_DEFAULT,且这里仅支持BORDER_DEFAULT。

cv2.pyrDown()函数对原始图像进行高斯滤波变换,获取原始图像的近似图像,使用的高斯滤波器为:
在这里插入图片描述

该函数通过抛弃偶数行和偶数列来实现向下采样

示例:向下采样结果

import cv2
o=cv2.imread ("lena.png",cv2.IMREAD_GRAYSCALE)
r1=cv2.pyrDown (o)
r2=cv2.pyrDown (r1)
r3=cv2.pyrDown (r2)
print ("o.shape=",o.shape)
print ("r1.shape=",r1.shape)
print ("r2.shape=",r2.shape)
print ("r3.shape=",r3.shape)
cv2.imshow ( "original",o)
cv2.imshow ("r1",r1)
cv2.imshow ("r2",r2)
cv2.imshow ("r3",r3)
cv2.waitKey ()
cv2.destroyAllWindows ()

结果:
在这里插入图片描述

11.3 pyrUp函数及使用

cv2.pyrUp()函数 实现金字塔向上采样

dst=cv2.pyrUp ( src[,dstsize[,borderType]])

参数含义与向下采样函数一致

图像尺寸满足下列要求: 目标图像大小为(src.cols2,src.rows2)

|dst.width-src.cols2| ≤ mod (dst.widh,2)
|dst.height-src.rows
2| ≤ mod ( dst.height,2)

向上采样时,在像素的右侧和下方插入零值列和零值行,得到一个偶数列和偶数行都是零值的新图像New,用向下采样所使用的高斯滤波器对新图像New进行滤波,得到向上采样的结果图像,但是,为了保持像素区间在向上采样后与原始图像保持一致,高斯滤波器系数要乘以4.

11.4 采样可逆性的研究

下图为向上采样和向下采样前后大小变化关系图
在这里插入图片描述

向下向上采样后恢复为原始大小
在这里插入图片描述

注意: 虽然一幅图像在先后经过向下采样、向上采样后,会恢复为原始大小,但是向上采样和向下采样不是互逆的。也就是说,虽然在经历两次采样操作后,得到的结果图像与原始图像的大小一致,肉眼看起来也相似,但是二者的像素值并不是一致的。

示例: 对一幅图像向下向上采样,观察采样的结果及结果图像与原始图像的差异

import cv2
o=cv2.imread ( "lena.png")
down=cv2.pyrDown (o)
up=cv2.pyrUp ( down)
diff=up-o                   #构造diff图像,查看up与o的区别
print ( "o.shape=",o.shape)
print ( "up.shape=",up.shape)
cv2.imshow ("original",o)
cv2.imshow ("up",up)
cv2.imshow ( "difference",diff)
cv2.waitKey ()
cv2.destroyAllWindows ()

结果:
在这里插入图片描述

左图为原始图像,中间图为原始图像向下采样后再向上采样得到的图像,虽然与原始图像相同,但是其像素值不同,右图为两者差值,故知道其像素值不一样。

11.5 拉普拉斯金字塔

由以上可以知道,我们在向上采样后无法恢复原始图像,所以,为了在向上采样时能够恢复具有较高分辨率的原始图像,就要获取在采样过程中所丢失的信息,这些丢失的信息构成了拉普拉斯金字塔

Li=Gi-pyrUp (Gi+1)

Li:拉普拉斯金字塔的第i层

Gi:高斯金字塔的第i层

拉普拉斯金字塔中的第i层,等于“高斯金字塔中的第i层”与“高斯金字塔中的第i+1层向上采样结果之差
在这里插入图片描述

#向下采样(高斯金字塔的构成)
G1=cv2.pyrDown (GO)
G2=cv2.pyrDown (G1)
G3=cv2.pyrDown (G2)
#拉普拉斯金字塔
L0=G0-cv2.pyrUp (G1)
L1=G1-cv2.pyrUp (G2)
L2=G2-cv2.pyrUp (G3)
#向上采样恢复高分辨率图像
G0=LO+cv2.pyrUp (G1)
G1=L1+cv2.pyrUp (G2)
G2=L2+cv2.pyrUp (G3)

猜你喜欢

转载自blog.csdn.net/weixin_56321457/article/details/126112431