OpenCV-20卷积操作

一、什么是图像卷积

图像卷积就是卷积在图像上按照滑动遍历像素时不断的相乘求和的过程。

绿色为图片, 黄色为卷积核, 粉色为最终得到的卷积特征。

二、步长

步长就是卷积核在图像上移动的步幅,每次移动一个方格则步幅为1。且一般为1。

若步长越大,则 中间的像素点得不到扫描,最终的图像会更小一点。

三、padding

如果需要保持图片大小不变,我们需要在图片周围填充0.

padding指的就是填充0的层数。

我们可以通过公式计算需要填充的0的圈数。

输入体积大小:H1*W1*D1(分别为高度、宽度和通道数)

四个超参数:Filter数量K; (卷积核数量)

Filter大小F; (一般为基数 3*3, 5*5, 7*7)

步长S;

零填充大小P;

输出体积大小H2 * W2 * D2

H2 = (H1 - F + 2P) / S +1

W2 = (W1 - F + 2P) / S +1

D2 = K

如果要保持卷积之后的图片大小不变,可以得到等式:(N+2P-F+1) = N

从而推导出:P = (F-1) / 2 (默认S=1)

四、卷积核的大小

图片卷积中,卷积核一般为奇数,比如3*3, 5*5, 7*7,原因如下:

1)根据上面padding的公式,如果要保持图片大小不变,采用偶数卷积核的话,比如4*4,将会出现填充1.5圈0的情况。

2)奇数维度的过滤器由中心,便于指出过滤器的位置,即OpenCV卷积中的锚点。

五、卷积案例

使用API---fifter2D(src, ddepth, kernel [, dst [,anchor[, delta[, borderType]]])

-- ddepth是卷积之后图片的位深,即卷积之后的图片的数据类型,一般为-1,表示与原图一致。

-- kernel 是卷积核的大小,用元组或者ndarray表示,要求数据类型必须为float型。

-- anchor 锚点,即卷积核的中心点,是可选参数,默认是(-1, -1)

-- delta可选参数,表示卷积之后额外加的一个值,相当于线性方程中的偏差,默认为0。

-- borderType 边界类型,一般不设置。

网络上有许多图片处理的卷积核

示例代码如下:

复制代码
import cv2
import numpy as np

dog = cv2.imread("dog.png")

# 卷积核
# kernel = np.ones((5, 5),np.float32) / 25   # 相当于所有点/25取平均值,图片变得模糊
# 尝试其他的卷积核
kernel = np.array([[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]])

# 卷积操作
new_dog = cv2.filter2D(dog, -1, kernel)
cv2.imshow("dog", dog)
cv2.imshow("new_dog", new_dog)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如下:

相关推荐
2401_87354492几秒前
使用Python处理计算机图形学(PIL/Pillow)
jvm·数据库·python
用户5757303346245 分钟前
🚀 告别“意大利面条”代码:用 LangChain 像搭乐高一样玩转大模型
人工智能
njidf5 分钟前
自动化机器学习(AutoML)库TPOT使用指南
jvm·数据库·python
蕤葳-6 分钟前
深度解析:基于AI人才标准,为职场新人规划一级与二级认证的报考路径
人工智能
只与明月听6 分钟前
RAG深入学习之向量数据库
前端·人工智能·python
月诸清酒9 分钟前
别让你的 Coding Agent 瞎忙活,你最缺的可能是这套 Harness 规则
人工智能
极客老王说Agent10 分钟前
别被OpenClaw的30万Star晃了眼!AI产业逻辑重写后,打工人更该看清谁在“真干活”
人工智能·ai·chatgpt
Bruce204899811 分钟前
OpenClaw 零基础全解析(小白友好版)
人工智能·chatgpt
Bruce204899835 分钟前
OpenClaw 自定义Skill插件开发全流程(2026最新版)
人工智能
极光代码工作室35 分钟前
基于Hadoop的日志数据分析系统设计
大数据·hadoop·python·数据分析·数据可视化