图像增强是对图像进行处理,使其比原始图像更适合于特定的应用,它需要与实际应用相结合。对于图像的某些特征如边缘、轮廓、对比度等,图像增强是进行强调或锐化,以便于显示、观察或进一步分析与处理。图像增强的方法是因应用不同而不同的。
有的小伙伴想通过增强验证码图像的方式来识别验证码,或者已经有了识别方式,但是识别不太准确,也有小伙伴想通过深度学习的方式去更好的训练模型,不管怎么样,最终都是为了识别结果,所以,这里讲一下,具体的增强方式,如何去增强,能更好的帮助你识别出结果。
注意:理论上,我们利用基本的图像处理方式,只能解决干扰程度没有那么复杂的验证码图形,如果干扰程度太强,即便你如何使用搭配增强方式也没有任何作用,即使使用深度学习的方式进行识别,也很难去提高你的准确度
注意:有些图像增强的方式,其实是在削减图像质量来达到一定目的,如果削减图像特征太多的话,反而导致图像特征不明显,导致无法识别出验证码,我会详细介绍每种图像增强对于验证码识别的利与弊
接下来为正题,通常图像滤波也是图像模糊的一种形式,是为了减少图像噪音的操作,根据滤波核和运算方式的不同,滤波处理分为线性滤波和非线性滤波,对于需要增强图像内部分特征的情况,肯定是使用非线性滤波更好,通过加强局部特征的方式,可以使验证码识别更为明显,因为本质上是一种图像模糊,所以滤波也存在一定的弊端,会使得本应识别到的图像特征变得更为模糊。如果对于现有滤波还达不到效果的,甚至可以自己自定义滤波器
线性滤波:方框滤波、均值滤波、高斯滤波。
非线性滤波:中指滤波、双边滤波、(?自定义滤波?)
方框滤波的滤波器中的所有元素值均相同,滤波器图像如下:
在python中,opencv提供了方框滤波函数如下:
cv2.boxFilter(src, ddepth, ksize, dst=None, anchor=None, normalize=None, borderType=None)
参数说明:
src: 输入图像(ndarray格式)
ddepth: 处理结果图像的图像深度,一般使用-1表示与原始图像使用相同的图像深度
ksize:滤波器的核尺寸大小
dst:返回图像(ndarray格式)
anchor:锚点
normalize:是否需要归一化处理
borderType:边界模式
方框滤波通过削减椒盐噪声的优势,可以快速清除一些验证码图像的干扰点,如果椒盐噪声多的话,可以使用此函数,同时,
如果进行过多的方框滤波进去过滤的话,也会使得图像模糊,削减过多的特征
案例:
img = cv2.imread(r"a.png") showimg(img) box_img = cv2.boxFilter(img, -1, (3, 3)) showimg(box_img) box_img = cv2.boxFilter(img, -1, (5, 5)) showimg(box_img)
原图
3x3 滤波核效果图
5x5 滤波核效果图
均值滤波与方框滤波类似,均值滤波是指任意一点的像素值,都是周围N*M个像素值的均值,如下图,将左边的滤波器提取出1/25即为方框滤波,均值滤波与方框滤波的区别在于,均值滤波必须归一化处理,而方框滤波没有该限制,均值率输出图像的深度与输入图像的深度一致
在python中,opencv提供了均值滤波函数如下:
cv2.blur(src, ksize, dst=None, anchor=None, borderType=None)
参数说明:
src: 输入图像(ndarray格式)
ksize:滤波器的核尺寸大小
dst:返回图像(ndarray格式)
anchor:锚点
borderType:边界模式
案例:
img = cv2.imread(r"a.png") showimg(img) box_img = cv2.blur(img, (3,3)) showimg(box_img) box_img = cv2.blur(img, (5,5)) showimg(box_img)
原图
3x3 滤波核效果图
5x5 滤波核效果图
相比均值滤波和方框滤波,高斯滤波对边缘特征有更好的保留,理论上,能够更好的减弱噪声并保留小信号,高斯滤波在进行邻域平均后,对每个元素添加了权重,滤波核展示如下:
在python中,opencv提供了高斯滤波函数如下:
cv2.GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None)
参数说明:
src: 输入图像(ndarray格式)
ksize:滤波器的核尺寸大小
sigmaX: 高斯核在X方向上的Sigma值
dst:返回图像(ndarray格式)
sigmaY: 高斯核在Y方向上的Sigma值
borderType:边界模式
案例:
img = cv2.imread(r"a.png") showimg(img) box_img = cv2.GaussianBlur(img, (3, 3), 0.8, dst=None, sigmaY=None, borderType=None) showimg(box_img) box_img = cv2.GaussianBlur(img, (5, 5), 0.8, dst=None, sigmaY=None, borderType=None) showimg(box_img)
原图
3x3 滤波核效果图
5x5 滤波核效果图
双边滤波对于图像边缘特征的保留更为明显,在相邻的元素色彩上,将给予更大的权值,在较大的元素色彩差异上,将给予更小的权值,在python中,opencv提供了双边滤波函数如下:
cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None)
参数说明:
src: 输入图像(ndarray格式)
d:滤波过程中相邻元素的直径范围
sigmaColor: 颜色空间滤波器的sigma值
sigmaSpace: 坐标空间滤波器的sigma值
dst:返回图像(ndarray格式)
borderType:边界模式
案例:
img = cv2.imread(r"a.png") showimg(img) box_img = cv2.bilateralFilter(img, 0, 50, 50) showimg(box_img) box_img = cv2.bilateralFilter(img, 0, 150, 150) showimg(box_img) box_img = cv2.bilateralFilter(img, 10, 150, 150) showimg(box_img)
原图
sigmaColor=50, sigmaSpace=50
sigmaColor=150, sigmaSpace=150
d=10, sigmaColor=150, sigmaSpace=150
顾名思义,将每个元素替换为核领域范围内的中值,一般情况下,用来消除图像中的异常值,在python中,opencv提供了中值滤波函数如下:
cv2.medianBlur(src, ksize, dst=None)
参数说明:
src: 输入图像(ndarray格式)
ksize: 滤波器的尺寸
dst:返回图像(ndarray格式)
案例:
img = cv2.imread(r"a.png") showimg(img) box_img = cv2.medianBlur(img, 3) showimg(box_img) box_img = cv2.medianBlur(img, 5) showimg(box_img)
原图
3x3 滤波核效果图
5x5 滤波核效果图
自定义滤波需要自己实现滤波器的参数,不同的滤波器搭配也能实现出不错的效果在python中,opencv提供了自定义滤波函数如下:
cv2.filter2D(src, ddepth, kernel, dst=None, anchor=None, delta=None, borderType=None)
参数说明:
src: 输入图像(ndarray格式)
ddepth:图像的深度
kernel: 自定义的滤波器
dst:返回图像(ndarray格式)
anchor:锚点,默认(-1,-1)即核中心
delta:偏置
borderType:边界模式
案例:
img = cv2.imread(r"a.png")
kernel = np.array((
[0.0625, 0.125, 0.0625],
[0.125, 0.25, 0.125],
[0.0625, 0.125, 0.0625]), dtype = np.float32)
showimg(img)
box_img = cv2.filter2D(img, -1, kernel)
showimg(box_img)
原图
效果图



