一、高斯金字塔操作
1.下采样(向下构建金字塔)
-
对当前层图像进行高斯模糊(消除下采样的锯齿);
-
剔除偶数行和偶数列,图像尺寸变为原来的 1/2(宽、高各减半)。
dst = cv2.pyrDown(src[, dst[, dstsize[, borderType]]])
src:必需,输入图像(可以是灰度图或彩色图,numpy 数组格式)
dst: 可选,输出图像(一般省略,函数会自动返回)
dstsize: 可选,输出图像尺寸(不建议手动设置,默认是原尺寸的 1/2)
borderType:可选,边界填充方式(默认 cv2.BORDER_DEFAULT,无需修改)
代码:
python
face =cv2.imread('2.png',cv2.IMREAD_GRAYSCALE)
cv2.imshow('face',face)
cv2.waitKey(0)
face_down_1=cv2.pyrDown(face)#下采样G1
cv2.imshow('down_1',face_down_1)
cv2.waitKey(0)
原图: 下采样后:


2.上采样(向上重构图像)
-
将图像尺寸放大 2 倍(补零填充);
-
对放大后的图像再次高斯模糊,还原像素间的关联
cv2.pyrUp():封装了上采样 + 高斯模糊的逻辑,用于从金字塔高层还原图像。与下采样的用法差不多
代码:
python
face_up_1 = cv2.pyrUp(face)
cv2.imshow('up_1',face_up_1)#G1′
cv2.waitKey(0)
face_up_2 =cv2.pyrUp(face_up_1)
cv2.imshow('up_2',face_up_2)#G2′
cv2.waitKey(0)
###对下采用后图像进行上采样,图像变模糊,无法复原
face_down_1_up= cv2.pyrUp(face_down_1)#下采样G1
face_down_2_up=cv2.pyrUp(face_down_2)#下采样G2
cv2.imshow('down_1_up',face_down_1_up)
cv2.imshow('down_2_up',face_down_2_up)
cv2.waitKey(0)
总结:
1.高斯金字塔的核心是高斯模糊 + 下采样的逐层迭代,目的是获取不同尺度的图像;
2.cv2.pyrDown() 和 cv2.pyrUp() 是 OpenCV 实现高斯金字塔的快捷函数,无需手动实现模糊和采样;
3.下采样会丢失图像信息,上采样仅能还原尺寸,无法完全恢复原始细节。
3.拉普拉斯金字塔
代码:
1.L0 = face - face_down_1_up:拉普拉斯金字塔第 0 层,本质是原始图像(G0)减去 "G1 上采样后的图像",结果是 G0 的细节残差(边缘、纹理等);
2.L1 = face_down_1 - face_down_2_up:拉普拉斯金字塔第 1 层,是 G1 减去 "G2 上采样后的图像",结果是 G1 的细节残差;
3.这里的减法是像素级减法,只有尺寸完全匹配才能执行(所以前面需要校准尺寸)。
python
face_down_1_up = face_down_1_up[:543, :]
L0=face - face_down_1_up
fuyuan = face_down_1_up + L0:把 "模糊的上采样图像" 和 "细节残差 L0" 相加,就能还原出原始图像
python
L1 = face_down_1- face_down_2_up
fuyuan=face_down_1_up+L0
cv2.imshow('L0',L0)
cv2.imshow('L1',L1)
cv2.waitKey(0)
cv2.imshow('fuyuan',fuyuan)
cv2.waitKey(0)
-
拉普拉斯金字塔是高斯金字塔的残差金字塔,核心是通过「当前层 - 上采样下一层」提取图像细节;
-
拉普拉斯金字塔本身不能独立构建,必须依赖高斯金字塔,且最后一层与高斯金字塔最后一层相同;
-
拉普拉斯金字塔的核心价值是保留细节,可用于图像融合、重构等场景,重构后的图像能高度还原原图。
二、直方图
1.概念:是分析图像像素分布的核心工具,常用来判断图像的亮度、对比度、曝光度,也是图像增强(如直方图均衡化)的基础。
**cv2.calcHist(images,channels,mask,histsize,ranges)**计算图像的直方图,用于表示图像中像索灰度级别的分布情况。
参数 :
images :原图像图像格式为uint8或noat32。当传入函数时应用中括号[]括来例如[img]
channels :表示传入的图像通道数。如果输入图像是灰度图它的值就是[0]。如果是彩色图像的传入的参数可以是[0][1][2]它们分别对应着BGR。
mask :掩模图像。统计整粗图像的直方图就把它为None。但是如果你想统计图像某一邮分的直方阁,你就制作一个掩模图像并使用它。
histSize :BINS的数目。也需用中括号括来(分成多少个区间)
BINS :上面的直方图显示了每个像索值的像索数,即从0到255。即您需要256个值才能显示上述直方图。
但是请考虑一下,如果您不需要单独查找所有像索值的像素数,而是在像索值问隔内查找像素数,
该怎么办?例如,您需要找到介于0到15之间的像素数,然后是16到31、32到47...、240到255。
您只需要16个值来表示直方图。
因此,只需将整个直方图拆分为16个子部分,每个子部分的值就是其中所有像素计数的总和。
这每个子部分都称为"BIN"。在第一种情况下,条柱数为256(每个像素一个),而在第二种情况下,官只有16。
ranges:像索值范围常为[0-256]
python
phone = cv2.imread('2.png',cv2.IMREAD_GRAYSCALE)
#将图像转换为一维数组
a = phone.ravel()
plt.hist(a,bins=256)
plt.show()
## 显示直方图
phone_hist =cv2.calcHist([phone],[0], None,[16],[0,256])
plt.plot(phone_hist)#使用calcHist的值绘制曲线留
plt.show()
1.ravel()函数将多维数组拉成一维数组
2.plt.hist(a,bins=256)使用hatplotlib的 hist函数绘制直方图。
参数解释:
a:一维数组,即图像的像素值组成的数组。
bins=256:指定直方图的条数,即灰度级的数量。
得到的图像:


