图片卷积
图像滤波是尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。
线性滤波是图像处理最基本的方法,它允许我们对图像进行处理,产生很多不同的效果。首先,我们需要一个二维的滤波器矩阵(卷积核)和一个要处理的二维图像。然后,对于图像的每一个像素点,计算它的邻域像素和滤波器矩阵的对应元素的乘积,然后加起来,作为该像素位置的值。这样就完成了滤波过程。
对图像和滤波矩阵逐个元素相乘再求和的操作就相当于将一个二维的函数移动到另一个二维函数的所有位置,这个操作就叫卷积
卷积需要4个嵌套循环,所以它并不快,除非我们使用很小的卷积核。这里一般使用3x3或者5x5。而且,对于滤波器/卷积核,也有一定的规则要求:
- 滤波器的大小应该是奇数,这样它才有一个中心,例如3x3,5x5或者7x7。有中心了,也有了半径的称呼,例如5x5大小的核的半径就是2
- 滤波器矩阵所有的元素之和应该要等于1,这是为了保证滤波前后图像的亮度保持不变。当然了,这不是硬性要求了。
- 如果滤波器矩阵所有元素之和大于1,那么滤波后的图像就会比原图像更亮,反之,如果小于1,那么得到的图像就会变暗。如果和为0,图像不会变黑,但也会非常暗。
- 对于滤波后的结构,可能会出现负数或者大于255的数值。对这种情况,我们将他们直接截断到0和255之间即可。对于负数,也可以取绝对值。
均值滤波
将卷积核内的所有灰度值加起来,然后计算出平均值,用这个平均值填充卷积核正中间的值,这样做可以降低图像的噪声,同时也会导致图像变得模糊
示例代码
import cv2
img = cv2.imread('./timg.jpg', cv2.IMREAD_COLOR)
cv2.imshow('img', img)
dst = cv2.blur(img, (3, 3))
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
高斯模糊
采用均值滤波降噪会导致图像模糊的非常厉害,有没有一种方式既能保留像素点真实值又能降低图片噪声呢?那就是加权平均的方式. 离中心点越近权值越高,越远权值越低.
但是权重的大小设置非常麻烦,那么有没有一种方式能够自动生成呢? 这个就是需要用到高斯函数
高斯函数呈现出的特征就是中间高,两边低的钟形
高斯模糊通常被用来减少图像噪声以及降低细节层次。
示例代码
import cv2
def updateSigma(val):
'''
高斯模糊
:param val: 卷积大小
:return:
'''
# 参数1:图像 参数2:卷积核大小 参数3:标准差越大,去除高斯噪声能力越强,图像越模糊
gaussian_blur = cv2.GaussianBlur(img, (5, 5), val)
cv2.imshow("gaussian", gaussian_blur)
img = cv2.imread('./timg.jpg', cv2.IMREAD_GRAYSCALE)
cv2.imshow('src', img)
# 创建一个窗口
cv2.namedWindow('gaussian', cv2.WINDOW_AUTOSIZE)
# 创建一个窗口进度条: 参数1:名称 参数2:窗口名称 参数3: 起始值 参数4: 最大值, 参数5:回调函数
cv2.createTrackbar("sigma", "gaussian", 0, 255, updateSigma)
updateSigma(0)
cv2.waitKey(0)
cv2.destroyAllWindows()
中值滤波
对邻近的像素点进行灰度排序,然后取中间值,它能有效去除图像中的椒盐噪声
操作原理: 卷积域内的像素值从小到大排序 取中间值作为卷积输出
示例代码
import cv2
img = cv2.imread('./timg.jpg', cv2.IMREAD_COLOR)
cv2.imshow('img', img)
dst = cv2.medianBlur(img, 3)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
Sobel算子
Sobel算子是像素图像边缘检测中最重要的算子之一,在机器学习、数字媒体、计算机视觉等信息科技领域起着举足轻重的作用。在技术上,它是一个离散的一阶差分算子,用来计算图像亮度函数的一阶梯度之近似值。在图像的任何一点使用此算子,将会产生该点对应的梯度矢量
- 水平梯度
G x = [ − 1 0 1 − 2 0 2