图像验证码识别(五)——去除噪点

本文介绍了在验证码识别中去除噪点的重要性,探讨了常见的滤波算法在验证码降噪上的局限性,并提出了一种8邻域降噪算法和连通域降噪算法的组合策略,以有效去除小到大的噪点,提高识别准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

降噪在计算机和信号学中用到的非常多,在多媒体技术中,降噪主要是去除图片上的干扰噪点,玩过单反的都知道,当ISO调太高的时候,图片会产生颗粒感,这些颗粒就是噪点。当然,验证码图片上的噪点有大有小,只要是用来干扰机器识别的,会对后面的图片处理以及识别造成干扰。

常见的降噪算法一般都是一些滤波算法——均值滤波、中值滤波、自适应维纳滤波器和小波滤波等,不过在这里由于大多数验证码字符本身不是标准的打印体,而且字符相对较小,直线感很强,所以滤波算法降噪的效果不是很好。比如有些字符本身就比较模糊,在笔画弯折的地方很浅,使用滤波算法之后很容易将连贯的字符分成两个部分,另外如果验证码图片很小,有可能滤波之后整个验证码字符都被视为噪点了。

所以这里我自己实现了两种算法,都比较简单,但是经过试验,去除验证码噪点的效果很好,基本上能够应付所有的验证码噪点。

一、8邻域降噪

先介绍第一种方法,这种方法类似均值滤波,不过对于每个pixel,不是取其周围像素的灰度平均值,而是统计其周围像素点的灰度值为0或255的个数。从前面经过二值化处理可知,如果一个pixel是验证码或者干扰因素的一部分,那么这个pixel在二值化结果中其灰度值一定是0,即黑色;如果一个pixel是背景,则其灰度值应该是255是白色。因此对于孤立的噪点,其周围应该都是白色,或者大多数点都是白色pixel,比如下面的图片:


所以对一个噪点来讲,其周围的pixel应该全是白色的背景才对,准确来讲就是一个噪点pixel是黑色的并且外包的8个相邻pixel全是白色。当然,如果图片分辨率够高,一个噪点实际上可能是有很多个pixel组成,所以此时的判断条件应该放宽,即一个pixel是黑色的并且相邻的8个pixel白色的大于一个固定值,那么这个pixel就是噪点。对于不同的验证码,这个阀值是不固定的,所以在这可以设置大小,多试几次,找到最佳的阀值。

经过测试,8领域降噪法对于小的噪点的去除是很有效的,而且计算量不大,下面是一些结果图


左边的时原图,右边的是降噪以后的图,当然降噪没有降干净,这是因为这个方法对小噪点比较好,如果阀值设的比较大,很多验证码字符也会受到很大影响,因为验证码可能就是一些断断续续的点连出来的,阀值设太大,尽管噪点没了,验证码也会没了。

代码如下,所有关于像素的处理,都是基于opencv库:

[cpp]  view plain  copy
  1. void Image::NaiveRemoveNoise(int pNum)  
  2. {  
  3.     //naive remove noise  
  4.     int i,j,m,n,nValue,nCount;  
  5.     int nWidth = getWidth();  
  6.     int nHeight = getHeight();  
  7.     //set boundry to be white  
  8.     for (i = 0; i < nWidth ; ++i)  
  9.     {  
  10.         setPixel(i,0,WHITE);  
  11.         setPixel(i,nHeight-1,WHITE);  
  12.     }  
  13.     for (i = 0; i < nHeight ; ++i)  
  14.     {  
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值