去噪:用于验证码图片识别的类续(C#代码) 自从发表了用于验证码图片识别的类(C#代码)后,不断有网友下载这个类后,问如何用于一些特定的验证码。总结一下网友们的提问,很多都是不会从复杂背景中提到干净的字符图片来,这主要就是一个去噪问题,即除去图片上的背景、干扰点、干扰线等信息。这当中要用到很多图像学数学算法,首先声明,本人不是学图像学的,以下方法理论说得不对,敬请多批评指正。 1、如何设前景/背景的分界值 UnCodebase 类中有一个GetPicValidByValue( int dgGrayValue) 函数,可以得到前景的有效区域,常有人问我前景/背景的分界值 dgGrayValue 是如何确定的(常用的是灰度 128)。这个值的获取是有数学算法,叫最大类间方差法,即图像的前后景的平方差为最大时的值就是我们关心的分界值,对付如 这样较复杂的背景非常管用,下面是具体的C#代码。 /// /// 得到灰度图像前景背景的临界值 最大类间方差法,yuanbao,2007.08 /// /// 前景背景的临界值 public int GetDgGrayValue() { int[] pixelNum = new int[256]; //图象直方图,共 256 个点 int n, n1, n2; int total; //total 为总和,累计值 double m1, m2, sum, csum, fmax, sb; //sb 为类间方差,fmax 存储最大方差值 int k, t, q; int threshValue = 1; // 阈值 int step = 1; //生成直方图 for (int i =0; i < bmpobj.Width ; i++) { for (int j = 0; j < bmpobj.Height; j++) { //返回各个点的颜色,以 RGB 表示 pixelNum[bmpobj.GetPixel(i,j).R]++; //相应的直方图加 1 } } //直方图平滑化 for (k = 0; k <= 255; k++) { total = 0; for (t = -2; t <= 2; t++) //与附近2 个灰度做平滑化,t 值应取较小的值 { q = k + t; if (q < 0) //越界处理 q = 0; if (q > 255) q = 255; total = total + pixelNum[q]; //total 为总和,累计值 } pixelNum[k] = (int)((float)total / 5.0 + 0.5); //平滑化,左边2 个+中间1 个+右边2 个灰度,共5 个,所以总和除以5,后面加0.5 是用修正值 } //求阈值 sum = csum = 0.0; n = 0; //计算总的图象的点数和质量矩,为后面的计算做准备 for (k = 0; k <= 255; k++) { sum += (double)k * (d...