OpenCV学习笔记——卷积与滤波

卷积

1、表达式

卷积是一种数学算子。表达式为:

以上是一维卷积,而在图像处理中,我们常用二维卷积。表达式为:

在这里插入图片描述
(其中,g称为滤波器,一般为3*3矩阵)

2、计算方法

让滤波器g(x,y)左右上下翻转,得到g(-x,-y),然后从左到右、从上到下扫过原始数据。**让滤波器的每行每列与原始数据对应的每行每列做乘积并求和。**得到的数即为卷积结果,将其放于一个新的表中。

g(x,y)翻转的原因是为了满足在与“1”数组相乘时,得到原滤波器。

如上图(转载自谢小小XH),左边的二维数组称为原始数据,右边的二维数组成为滤波器,所做的卷积操作实际上就是7*1+8*1+9*2+……+24*1+25*1=314。对于图像处理来说,卷积的实质就是对像素的处理

3、为什么要引入卷积

卷积可以对某块图像进行突出化的处理。从仿生的角度上来讲,正如人类盯着某一个物体看的时候,这个物体之外的东西或多或少都会被我们忽略(即虚化)。而滤波器就相当于一个权重分配的取值表(类似于我们盯着的那个物品的形状),当原始数据(类似于我们眼睛接受到的全部光线)经过滤波器的卷积后,我们关心的部分就会被突出,而其他部分会被忽略或减弱

例如,我们关心老鼠的背部,那么滤波器会被设定为老鼠背部的权重大其他部分权重小

那么当滤波器移动到老鼠背部的时候,所得最终结果的值将较

当滤波器移动到其他部分(如头部)时,所得结果的值较

以上图例来自于https://blog.csdn.net/cufewxy1/article/details/80485886?utm_source=app该博客很好的讲述了CNN和卷积的基本概念。

平滑滤波

平滑滤波的主要作用是消除噪声,其实质是采用卷积操作,对原始图像进行处理。我学习的平滑滤波主要有三种:平均滤波、高斯滤波、中值滤波。

1、四领域与八领域

在这里插入图片描述
排除中间像素点后的上、下、左、右四个像素点称为四领域

排除中间像素点后的其他八个像素点称为八领域

2、平均滤波

在一个小区域内(通常3*3)像素值平均。公式:

在这里插入图片描述

平均滤波使图像边缘也被平均化,导致图像细节受损,图像变模糊

3、高斯滤波

在一个小区域内(通常3*3)像素值加权平均,称为“加权平均滤波”。公式:

在这里插入图片描述
在这里插入图片描述
而形如上右的滤波器又被称为高斯滤波器。高斯滤波器还可以被拓展为双边滤波器

在这里插入图片描述

高斯滤波既能消除噪声有保留了图像的细节,最为常用

4、中值滤波

确定窗口后按灰度大小对像素进行排序,取灰度中位数对应的像素值代替原窗口中心的像素值。选择窗口的方法很多样——如:四邻域八邻域T字型等。

在这里插入图片描述

能很好的消除孤立噪声,特别是胡椒状噪点

数学形态学滤波

与卷积对应的平滑滤波不同,数学形态学滤波主要是通过几何操作来进行滤波的。其包含两种最基本操作:膨胀腐蚀。腐蚀和膨胀都会使图像出现一定的颗粒化

膨胀指的是对于所有A的元素按B中元素相对位置变化的方式进行平移,然后取并集。
腐蚀指的是对于所有A的元素按B中元素相对位置逆变化的方式进行平移,然后取交集。
在这里插入图片描述
如上图,第二张图就是将第一张图经过膨胀变换得到的,实质是黑的区域的扩张白的区域的减少
第三张图是第一张图经过腐蚀变换得到的,实质是黑的区域的减少白的区域的扩张

除了膨胀与腐蚀,数学形态学滤波还有开闭运算
在这里插入图片描述

利用OpenCV实现图像平滑滤波

1、相关函数
dst = cv2.blur(src, ksize)					#平均滤波
dst = cv2.GaussianBlur(src, ksize,sigmaX)	#高斯滤波
dst = cv2.medianBlur(src, ksize)			#中值滤波
#src:原始图像
#ksize:滤波器大小

其中,ksize常用(3,3)(5,5)大小的滤波器。

dst = cv2.bilateralFilter(src, d, sigemaColor, sigmaSpace)	#双边滤波
#src:原始图像
#d:过滤期间使用的各像素领域的直径
#sigmaColor:色彩空间的sigma参数,常取150~200
#sigmaSpace:做表空间的sigma参数,常取150~200

在这里插入图片描述

2、代码
import cv2
import numpy as np


def gauss_noise(image, mean=0, var=0.001):
    """
    添加高斯噪声
    mean : 均值
    var : 方差
    """
    image = np.array(img/255, dtype=float)
    noise = np.random.normal(mean, var ** 0.5, image.shape)
    out = image + noise
    if out.min() < 0:
        low_clip = -1
    else:
        low_clip = 0
    out = np.clip(out, low_clip, 1.0)
    out = np.uint8(out*255)
    cv2.imshow("Gauss", out)
    return out


filename = r"e:\lena.jpg"
img = cv2.imread(filename)
img = gauss_noise(img)	#插入高斯噪声

blur = cv2.blur(img, (5,5))
gauss = cv2.GaussianBlur(img, (5,5), 0)
median = cv2.medianBlur(img, 5)
bilateral = cv2.bilateralFilter(img, 5, 150, 150)

cv2.imshow('Image', blur)
cv2.imshow('Blurred', blur)
cv2.imshow('Gauss', blur)
cv2.imshow('Median filtered', median)
cv2.imshow('Bilateral filtered', bilateral)

cv2.waitKey()
cv2.destroyAllWindows()

感谢CSDN免费开课一学即懂的计算机视觉(第一季),感谢屈桢深老师的讲解。本文部分图片及代码均取自于以上课程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值