卷积是一种数学算子。表达式为:
以上是一维卷积,而在图像处理中,我们常用二维卷积。表达式为:
让滤波器g(x,y)
左右上下翻转,得到g(-x,-y)
,然后从左到右、从上到下扫过原始数据。**让滤波器的每行每列与原始数据对应的每行每列做乘积并求和。**得到的数即为卷积结果,将其放于一个新的表中。
g(x,y)
翻转的原因是为了满足在与“1”数组相乘时,得到原滤波器。
如上图(转载自谢小小XH),左边的二维数组称为原始数据,右边的二维数组成为滤波器,所做的卷积操作实际上就是7*1+8*1+9*2+……+24*1+25*1=314
。对于图像处理来说,卷积的实质就是对像素的处理。
卷积可以对某块图像进行突出化的处理。从仿生的角度上来讲,正如人类盯着某一个物体看的时候,这个物体之外的东西或多或少都会被我们忽略(即虚化)。而滤波器就相当于一个权重分配的取值表(类似于我们盯着的那个物品的形状),当原始数据(类似于我们眼睛接受到的全部光线)经过滤波器的卷积后,我们关心的部分就会被突出,而其他部分会被忽略或减弱!
例如,我们关心老鼠的背部,那么滤波器会被设定为老鼠背部的权重大,其他部分权重小。
那么当滤波器移动到老鼠背部的时候,所得最终结果的值将较大:
当滤波器移动到其他部分(如头部)时,所得结果的值较小:
以上图例来自于https://blog.csdn.net/cufewxy1/article/details/80485886?utm_source=app该博客很好的讲述了CNN和卷积的基本概念。
平滑滤波的主要作用是消除噪声,其实质是采用卷积操作,对原始图像进行处理。我学习的平滑滤波主要有三种:平均滤波、高斯滤波、中值滤波。
排除中间像素点后的其他八个像素点称为八领域。
在一个小区域内(通常3*3)像素值平均。公式:
平均滤波使图像边缘也被平均化,导致图像细节受损,图像变模糊。
在一个小区域内(通常3*3)像素值加权平均,称为“加权平均滤波”。公式:
而形如上右的滤波器又被称为高斯滤波器。高斯滤波器还可以被拓展为双边滤波器:
高斯滤波既能消除噪声有保留了图像的细节,最为常用。
确定窗口后按灰度大小对像素进行排序,取灰度中位数对应的像素值代替原窗口中心的像素值。选择窗口的方法很多样——如:四邻域、八邻域、T字型等。
能很好的消除孤立噪声,特别是胡椒状噪点。
与卷积对应的平滑滤波不同,数学形态学滤波主要是通过几何操作来进行滤波的。其包含两种最基本操作:膨胀和腐蚀。腐蚀和膨胀都会使图像出现一定的颗粒化。
膨胀指的是对于所有A的元素按B中元素相对位置变化的方式进行平移,然后取并集。
腐蚀指的是对于所有A的元素按B中元素相对位置逆变化的方式进行平移,然后取交集。
如上图,第二张图就是将第一张图经过膨胀变换得到的,实质是黑的区域的扩张和白的区域的减少;
第三张图是第一张图经过腐蚀变换得到的,实质是黑的区域的减少和白的区域的扩张。
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
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免费开课一学即懂的计算机视觉(第一季),感谢屈桢深老师的讲解。本文部分图片及代码均取自于以上课程。