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()

输出结果如下:

相关推荐
志栋智能12 小时前
超自动化巡检:量化运维成效的标尺
运维·网络·人工智能·自动化
AI科技星12 小时前
紫金山天文台与6G 超导太赫兹实验对比【乖乖数学】
人工智能·线性代数·机器学习·量子计算·agi
摩尔线程12 小时前
摩尔线程携手紫光计算机发布《语音识别全栈国产化技术实践白皮书》
人工智能·语音识别·摩尔线程
字节跳动开源12 小时前
局中局!给 Agent 装上 OpenViking,它们竟然学会了“记仇”和“伪装”?
人工智能·开源·llm
Exploring12 小时前
通过 Vibe Coding,我开发的第一款鸿蒙 App 上架了,欢迎大家下载体验
人工智能
杀生丸学AI13 小时前
【VALSE 2026】AI领域年度重要进展
人工智能
2401_8246976613 小时前
如何实现SQL存储过程状态监控_编写实时运行监控仪表盘
jvm·数据库·python
iAm_Ike13 小时前
c++怎么在写入文件流时通过peek预读功能实现复杂的逻辑判断【实战】
jvm·数据库·python
沪漂阿龙13 小时前
面试题:文本表示方法详解——One-hot、Word2Vec、上下文表示、BERT词向量全解析(NLP基础高频考点)
人工智能·神经网络·自然语言处理·bert·word2vec
dFObBIMmai13 小时前
mysql如何确保主从数据完全同步_开启半同步复制机制
jvm·数据库·python