上次用汉明距离来检验图片的相似度,结果并不理想,失败率较高,大概正确率只有60%左右。为了提高识别率,我根据汉明距离算法改编了这种算法,识别成功率高达99%。当然识别速度有所下降,只识别数字速度还是挺快的,根本感觉不到程序耗时。
其中的原理是比较样本图片与需要识别的图片二值化后的像素RGB值的差异,如果对应像素的颜色值相同,则计为0,反之计为1,统计不同像素的个数,再除以图片像素总数,得到不同率,反之则是像素度。将需要识别的图片与我们所有的样本图进行比较,就可以得到样本图中相似度最高的一张样本。(两张图大小一致)
我使用CSDN的验证码测试识别成功率达到了90%以上,失败部分主要是因为验证码二值化去干扰效果不是特别好,导致分割验证码时分割错误,以至于识别失败。
C#核心代码:
/// <summary> /// 相似度比较 /// </summary> /// <param name="map1">标准图</param> /// <param name="map2">欲比较图</param> public static float xsdsf(Bitmap map1, Bitmap map2,bool jc) { int width = map1.Width; int height = map1.Height; long argv = 0; Bitmap imag = new Bitmap(width, height); //转换大小 // map1 = new Bitmap(Resize(map1, width, height));//未打包修改图片大小代码,自行转换,这里屏蔽 // map2 = new Bitmap(Resize(map2, width, height)); if(jc){ //灰度化 // map1 = ToGray(map1);//未打包修改图片灰度化,自行转换,这里屏蔽 // map2 = ToGray(map2); //二值化 // map1 = ConvertTo1Bpp1(map1, "10");//未打包修改图片二值化代码,自行转换,这里屏蔽 // map2 = ConvertTo1Bpp1(map2, "10"); } //将两张图相同像素设置为0,不同像素设置为1 for (int i = 0; i < map1.Width; i++) { for (int j = 0; j < map1.Height; j++) { Color color1 = map1.GetPixel(i, j); Color color2 = map2.GetPixel(i, j); if (color1.B == color2.B) { imag.SetPixel(i, j, Color.FromArgb(0, 0, 0)); } else { imag.SetPixel(i, j, Color.FromArgb(1, 1, 1)); argv++; } } } long xsh = width * height; float butongb = (float)argv / xsh; return 1 - butongb; }
即使因分割图片,去干扰不完全等因素导致识别成功率比较低也没关系,我们可以通过增加样本库来提高识别率。
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/241282.html