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

得到的图像:

相关推荐
那个村的李富贵5 小时前
光影魔术师:CANN加速实时图像风格迁移,让每张照片秒变大师画作
人工智能·aigc·cann
腾讯云开发者6 小时前
“痛点”到“通点”!一份让 AI 真正落地产生真金白银的实战指南
人工智能
CareyWYR6 小时前
每周AI论文速递(260202-260206)
人工智能
hopsky7 小时前
大模型生成PPT的技术原理
人工智能
禁默8 小时前
打通 AI 与信号处理的“任督二脉”:Ascend SIP Boost 加速库深度实战
人工智能·信号处理·cann
心疼你的一切8 小时前
昇腾CANN实战落地:从智慧城市到AIGC,解锁五大行业AI应用的算力密码
数据仓库·人工智能·深度学习·aigc·智慧城市·cann
AI绘画哇哒哒8 小时前
【干货收藏】深度解析AI Agent框架:设计原理+主流选型+项目实操,一站式学习指南
人工智能·学习·ai·程序员·大模型·产品经理·转行
数据分析能量站8 小时前
Clawdbot(现名Moltbot)-现状分析
人工智能
那个村的李富贵8 小时前
CANN加速下的AIGC“即时翻译”:AI语音克隆与实时变声实战
人工智能·算法·aigc·cann
二十雨辰9 小时前
[python]-AI大模型
开发语言·人工智能·python