今天下午来复习滤波器和边缘检测,广义上我将它的概念认知到也就是卷积操作,通过对原始图片数据进行加权求和获得新的矩阵。
1.卷积
1.1 :图片卷积
图像卷积就是卷积核在图像上按行滑动遍历像素时不断的相乘求和的过程。
1.2:步长
步长就是卷积核在原始图片上滑动的步幅,一般为了充分对图片进行扫描,将步长设为1。
1.3:填充(padding)
卷积之后图片的长宽会变小. 如果要保持图片大小不变, 需要在图片周围填充0. padding指的就是填充的0的圈数。
1.4:卷积核的大小
图片卷积中, 卷积核一般为奇数, 比如 3 * 3, 5 * 5, 7 * 7.为什么一般是奇数呢, 出于以下两个方面的考虑:
-
根据padding的计算公式, 如果要保持图片大小不变, 采用偶数卷积核的话, 比如4 * 4, 将会出现填充1.5圈零的情况。
-
奇数维度的过滤器有中心,便于指出过滤器的位置, 即OpenCV卷积中的锚点。
1.5:卷积案例
-
filter2D(src, ddepth, kernel, dst[, anchor, delta, borderType)
-
ddepth是卷积之后图片的位深, 即卷积之后图片的数据类型, 一般设为-1, 表示和原图类型一致.
-
kernel是卷积核大小, 用元组或者ndarray表示, 要求数据类型必须是float型.
-
anchor 锚点, 即卷积核的中心点, 是可选参数, 默认是(-1,-1)
-
delta 可选参数, 表示卷积之后额外加的一个值, 相当于线性方程中的偏差, 默认是0.
-
borderType 边界类型.一般不设.
-
# OpenCV图像卷积操作
import cv2
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
#导入图片
img = cv2.imread('img/111.png')
# img = Image.open('img/111.png')
# 相当于原始图片中的每个点都被平均了一下, 所以图像变模糊了.
kernel = np.ones((5, 5), np.float32) / 25
# 边缘提取核
kernel1 = np.float32([(-1,-1,-1),(-1,8,-1),(-1,-1,-1)])
# 浮雕效果
kernel2 = np.float32([(-2,1,0),(-1,1,1),(0,1,2)])
# 锐化效果
kernel3 = np.float32([(0,-1,