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

得到的图像:

相关推荐
陈大鱼头10 小时前
[译]费尽心思来保障 OpenClaw ?那跟直接用 GPT 有什么区别?
人工智能
Fleshy数模10 小时前
玩转OpenCV:视频椒盐噪声处理与图像形态学操作实战
人工智能·opencv·音视频
程序媛一枚~10 小时前
✨✨✨使用Python,OpenCV及图片拼接生成❤️LOVE❤️字样图,每张小图加随机颜色边框,大图加随机大小随机颜色边框
图像处理·python·opencv·numpy·图像拼接
幂律智能10 小时前
Agent × 流程引擎融合架构:从静态流程到智能流程编排
人工智能·架构·agent
无垠的广袤10 小时前
ChatECNU 大语言模型与 PicoClaw 部署
人工智能·语言模型·自然语言处理·嵌入式·树莓派
爱淋雨的男人11 小时前
自动驾驶感知相关算法
人工智能·算法·自动驾驶
互联网科技看点11 小时前
AI算力爆发叠加数据资产风口,铂拉锐科技布局去中心化数字生态
人工智能·科技·去中心化
如若12311 小时前
flash-attn 安装失败?从报错到成功的完整排雷指南(CUDA 12.8 + PyTorch 2.7)
人工智能·pytorch·python
七牛云行业应用11 小时前
GPT-5.4能力前瞻:解析原生电脑操控(Computer Use)原理与Agent架构构建
人工智能·chatgpt·大语言模型·ai agent·mcp协议
带娃的IT创业者11 小时前
Prompt Engineering 进阶:让 AI 写出人类味道(完整指南)
人工智能·大模型·llm·prompt·写作技巧·ai 教学