高阶opencv基础

一、高斯金字塔操作

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:指定直方图的条数,即灰度级的数量。

得到的图像:

相关推荐
Elastic 中国社区官方博客1 小时前
Elasticsearch:如何使用 LLM 在摄入数据时提取需要的信息
大数据·人工智能·elasticsearch·搜索引擎·ai·全文检索
才思喷涌的小书虫1 小时前
打破 3D 感知瓶颈:OVSeg3R 如何推动开集 3D 实例分割应用落地
人工智能·目标检测·计算机视觉·3d·具身智能·数据标注·图像标注
言之。1 小时前
2026 年 1 月 15 日 - 21 日国内外 AI 科技大事及热点深度整理报告
人工智能·科技
weisian1512 小时前
进阶篇-4-数学篇-3--深度解析AI中的向量概念:从生活到代码,一文吃透核心逻辑
人工智能·python·生活·向量
这儿有一堆花2 小时前
AI视频生成的底层逻辑与技术架构
人工智能·音视频
Fairy要carry2 小时前
面试-Encoder-Decoder预训练思路
人工智能
杭州泽沃电子科技有限公司2 小时前
“不速之客”的威胁:在线监测如何筑起抵御小动物的智能防线
人工智能·在线监测
MistaCloud2 小时前
Pytorch进阶训练技巧(二)之梯度层面的优化策略
人工智能·pytorch·python·深度学习
农夫山泉2号2 小时前
【rk】——rk3588推理获得logits
人工智能·rk3588·ppl