模糊/平滑图片来消除图片噪声
OpenCV函数:cv2.blur(), cv2.GaussianBlur(), cv2.medianBlur(), cv2.bilateralFilter()
均值滤波(会模糊会边缘)
blur(src, ksize, dst=None, anchor=None, borderType=None)
ksize:卷积核大小
方框滤波
方框滤波跟均值滤波很像,如下面的公式。用cv2.boxFilter()函数实现,事实上,当可选参数normalize为True的时候,方框滤波就是均值滤波,如3×3的核,a就等于1/9;normalize为False的时候,a=1,相当于求区域内的像素和。
boxFilter(src, ddepth, ksize, dst=None, anchor=None, normalize=None, borderType=None):
高斯滤波
GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None)
参数3 σx值越大,模糊效果越明显。
中值滤波
中值又叫中位数,是所有值排序后取中间的值。
所以那种孤立的斑点,如0或255很容易消除掉,适用于去除椒盐噪声和斑点噪声。
medianBlur(src, ksize, dst=None)
双边滤波
模糊操作基本都会损失掉图像细节信息,尤其前面介绍的线性滤波器,图像的边缘信息很难保留下来。然而,边缘edge信息是图像中很重要的一个特征,所以这才有了双边滤波。
双边滤波中双边的意思是同时考虑两条边(因素),这两条边分别是空间域和值域。这里的空间域是指考虑空间位置关系,根据距离核心位置的距离的远近给予不同的加权值,原理和高斯滤波一样。而值域是指考虑邻域范围内的像素差值计算出滤波器系数,类似于α-截尾均值滤波器(去掉百分率为α的最小值和最大之后剩下像素的均值作为滤波器)。
其中sigmaColor越大,就表明该像素邻域内有越宽广的颜色会被混合到一起,产生较大的相等颜色区域。sigmaSpace越大,则表明越远的像素会对kernel中心的像素产生影响,从而使更大的区域中足够相似的颜色获取相同的颜色。
bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None)
d:每个像素邻域的直径
sigmaColor:
sigmaSpace:
# -*-encoding:utf-8-*- import pytesseract from PIL import Image from PIL import ImageFilter from PIL import ImageFont from PIL import ImageDraw import numpy as np from PIL import Image import cv2 def main(): # 颜色空间转换 img = cv2.imread("learn.jpg") # =================================均值滤波(会模糊会边缘) # blur(src, ksize, dst=None, anchor=None, borderType=None) # ksize: 卷积核大小 res = cv2.blur(img,(3, 3)) # =================================方框滤波 boxFilter = cv2.boxFilter(img, -1, (3, 3), normalize=True) res = cv2.boxFilter(img, -1, (3, 3), normalize=False) # =================================高斯滤波 res = cv2.GaussianBlur(img, (5, 5), 1) # 高斯滤波 # 参数3 σx值越大,模糊效果越明显。 # =================================中值滤波 # 中值又叫中位数,是所有值排序后取中间的值。 # medianBlur(src, ksize, dst=None) res = cv2.medianBlur(img, 5) # 中值滤波 # =================================双边滤波 # 模糊操作基本都会损失掉图像细节信息,尤其前面介绍的线性滤波器, # 图像的边缘信息很难保留下来。然而,边缘edge信息是图像中很重要的一个特征,所以这才有了双边滤波。 res= cv2.bilateralFilter(img, 9, 75, 75) # 双边滤波 # cv2.imshow('img', img) # cv2.imshow('boxFilter', boxFilter) cv2.imshow('res', res) cv2.waitKey(0) if __name__ == '__main__': main()