7.1 卷积操作 图片卷积 图像卷积就是卷积核在图像上按行滑动遍历像素时不断地相乘求和的过程。 原图 Image:
步长就是卷积核在图像上移动的步幅。在上一个例子中,卷积核每次移动一个像素步长的结果,如果将这个步长修改为2个像素,结果又不一样。 为了充分扫描图片,步长一般设置为1。
从上面的例子中我们发现,卷积之后图片的长宽会变小。如果要保持图片大小不变,我们需要在图片周围填充0,padding指的就是填充的0的圈数。
我们可以通过公式计算出需要填充的0的圈数:
例题: 现给定一张28x28的图片,卷积核大小为5x5,步长为1,padding为0,计算一次卷积后得到的图片大小? 解:
∴ 一次卷积后得到的图片大小为 24x24
综上:
如果要保持卷积之后图片大小不变,可以得出等式:
(N+2∗P−F+1)=N
从而可以推导出:
P={F-1 \over 2}
综上:
图片卷积中,卷积核一般为奇数,比如 3x3 5x5 7x7 为什么选用奇数卷积核,需要从以下两个方面进行考虑:
# OpenCV图像卷积操作
import cv2
import numpy as np
img = cv2.imread('./dog.jpg')
# kernel必须是float类型
# 相当于原始图片中的每个点都被平均了一次,所以图片变模糊了
kernel = np.ones((5, 5), np.float32) / 25
# 2D卷积
dst = cv2.filter2D(img, -1, kernel)
cv2.imshow('2Dfilter', np.hstack((img, dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()
使用不同的卷积核提取不同的特征:
# 轮廓卷积
import cv2
import numpy as np
img = cv2.imread('./dog.jpg')
kernel = np.array([[-1,-1,-1],[-1,8,-1],[-1,-1,-1]])
dst = cv2.filter2D(img, -1, kernel)
cv2.imshow('2Dfilter', np.hstack((img, dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()
# 浮雕卷积
import cv2
import numpy as np
img = cv2.imread('./dog.jpg')
kernel = np.array([[-2,1,0],[-1,1,1],[0,1,2]])
dst = cv2.filter2D(img, -1, kernel)
cv2.imshow('2Dfilter', np.hstack((img, dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()
# 锐化卷积
import cv2
import numpy as np
img = cv2.imread('./dog.jpg')
kernel = np.array([[0,-1,0],[-1,5,-1],[0,-1,0]])
dst = cv2.filter2D(img, -1, kernel)
cv2.imshow('2Dfilter', np.hstack((img, dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()