文章目录
滤波算法
cv.filter2D()
这个就是我们用来滤波的函数,作用大概就是根据传入的图片和kernel来对图片进行卷积
参数:
src
: 原图像ddepth
: 目标图像深度(指数据类型)kernel
: 卷积核anchor
: 卷积锚点delta
: 偏移量,卷积结果要加上这个数字borderType
: 边缘类型
卷积函数(目前只能处理单通道图片)
(now:这个函数实现的不好,滤波效果很差,不用了)
def imgConvolve(image, kernel):
'''
:param image: 图片矩阵
:param kernel: 滤波窗口
:return:卷积后的矩阵
'''
img_h = int(image.shape[0])
img_w = int(image.shape[1])
kernel_h = int(kernel.shape[0])
kernel_w = int(kernel.shape[1])
# padding
padding_h = int((kernel_h - 1) / 2)
padding_w = int((kernel_w - 1) / 2)
convolve_h = int(img_h + 2 * padding_h)
convolve_W = int(img_w + 2 * padding_w)
# 分配空间
img_padding = np.zeros((convolve_h, convolve_W))
# 中心填充图片
img_padding[padding_h:padding_h + img_h, padding_w:padding_w + img_w] = image[:, :]
# 卷积结果
image_convolve = np.zeros(image.shape)
# 卷积
for i in range(padding_h, padding_h + img_h):
for j in range(padding_w, padding_w + img_w):
image_convolve[i - padding_h][j - padding_w] = int(
np.sum(img_padding[i - padding_h:i + padding_h+1, j - padding_w:j + padding_w+1]*kernel))
return image_convolve
准备
导入图像
img_bubble=cv.imread('bubble.jpg',0)# 单通道读入
img_rice=cv.imread('rice.png',0)# 单通道读入
bubble:
rice:
Sobel算子
竖边滤波
可以过滤出图像中竖直方向的边
kernel_col = np.array([[-1,0,1],# 提取竖边的卷积核
[-1,0,1],
[-1,0,1]])
dst = cv.filter2D(img_rice, -1, kernel_col)
plt.figure(figsize=(8,8)) #设置窗口大小
plt.suptitle('col filter') # 图片名称
plt.subplot(2,2,1)
plt.imshow(img_rice,cmap='gray')
# cv.imshow('rice',img_rice)
plt.subplot(2,2,2)
plt.imshow(dst,cmap='gray')
# cv.imshow('median',dst)
# cv.waitKey(0)
横边滤波
可以过滤出图像中水平方向的边
kernel_row = np.array([[-1,-1,-1],# 提取横边的卷积核
[0,0,0],
[1,1,1]])
dst = cv.filter2D(img_rice, -1, kernel_row)
plt.figure(figsize&#