让代码更简单

C#图片相似度算法

重要:本文最后更新于2018-05-13 14:06:28,某些文章具有时效性,若有错误或已失效,请在下方留言或联系代码狗

上次用汉明距离来检验图片的相似度,结果并不理想,失败率较高,大概正确率只有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;
 }

即使因分割图片,去干扰不完全等因素导致识别成功率比较低也没关系,我们可以通过增加样本库来提高识别率。

感觉很棒!可以赞赏支持我哟~

7 打赏

评论 (0)

登录后评论
QQ咨询 邮件咨询 狗哥推荐