- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
用JAVA进行图像识别.
我们来用JAVA制作一个进行图像识别的小程序.输入两个图像路径,就可以进行比对,然后输出相似度接下来是制作过程首先制作界面GUI制作完成后效果如下我们这边将读取进来的图片转化为两个BufferedImage对象,发送到CompareImageTool.CompareImage方法中进行比较接下来我们完成这个对比的方法我们这里要求的是图片相似度,算法有很多种,我们这边采用这样一种方法。首先扫描图片的每个像素,获取所有RGB值,相同的RGB值放在一起。最后得到的是一个保存该图片所有RGB值出现的次数的HashMap代码如下private static HashMap GetRGBMap(BufferedImage bufferedImage) {HashMap map=new HashMap();for(int x=0;xbufferedImage.getWidth();x++){for(int y=0;ybufferedImage.getHeight();y++){double RGBValue=bufferedImage.getRGB(x, y);//如果没有保存该色值,存入if(map.get(RGBValue)==null){map.put(RGBValue, 1);}//将该色值出现次数增加一次else{int Times=(int) map.get(RGBValue);Times+=1;map.put(RGBValue, Times);}}}return map;}那么接下来怎么办呢?怎么计算相似度呢?这边就要用到一点数学知识,我们可以将这个得到的HashMap视为一个特殊的向量,向量维数视作所有出现过的RGB值,分量的值则是出现的次数。这个时候就巧妙的将两张图片,转化为两个含有该图像特征的向量这个时候就好办了,大家肯定学习过这么一条公式 a*b=|a|*|b|*cosa,b?也就是向量点积,等于向量的模相乘再乘上向量夹角。那么这个夹角,就可以视为两条向量之间的相似程度。当然,为了使我们得到的cosa,b的值卡在0,1之间,还需要对向量进行归一化代码如下private static HashMap VectorNormalizing(HashMap RGBMap) {//求图片特征向量1的模长double ModulaLength=0;for(Object i:RGBMap.keySet()){ //先将所有平方相加ModulaLength+=Math.pow((double)(int)RGBMap.get(i), 2);}//求平方根ModulaLength=Math.sqrt(ModulaLength);//将图片特征向量1标准化for(Object i:RGBMap.keySet()){?double a=(double)(int) RGBMap.get(i);a=a/ModulaLength;RGBMap.put(i, a);}return RGBMap;}接下来就是最后一步了!求出所需的cosa,b即是相似程度!代码如下public static float CompareImage(BufferedImage bufferedImage1, BufferedImage bufferedImage2) {HashMap RGBMap1=GetRGBMap(bufferedImage1);HashMap RGBMap2=GetRGBMap(bufferedImage2);//相似度float Similarity=0;?//将两个HashMap视作特征向量进行归一化RGBMap1=VectorNormalizing(RGBMap1);RGBMap2=VectorNormalizing(RGBMap2);//向量点积得到相似度for(Object i:RGBMap1.keySet()){ double Value2;if(RGBMap2.get(i)==null){Value2=0;}else{Value2= (double) RGBMap2.get(i);}double Value1=(double) RGBMap1.get(i);Similarity+=Value1*Value2;}return Similarity*100;}那么程序到这边就做好了!接下来看看效果相似度88.4 可以看出大致是同一张图片关于图像比对,其实有非常多的算法,我这个只是其中一种。大家如果认真看了应该能发现一些问题1.我这边单纯比对的是像素的色值出现比例,那么可能出现两张图片相同色值的像素位置完全不同,却被识别成同一张的情况。不过这种情况基本也不会出现,因为每个像素的RGB值有2^24种,所以可以近似认为色值组成相同,就是同一张图片
文档评论(0)