您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > AI人工智能 > 用JAVA进行图像识别
我们来用JAVA制作一个进行图像识别的小程序.输入两个图像路径,就可以进行比对,然后输出相似度接下来是制作过程首先制作界面GUI制作完成后效果如下我们这边将读取进来的图片转化为两个BufferedImage对象,发送到CompareImageTool.CompareImage方法中进行比较接下来我们完成这个对比的方法我们这里要求的是图片相似度,算法有很多种,我们这边采用这样一种方法。首先扫描图片的每个像素,获取所有RGB值,相同的RGB值放在一起。最后得到的是一个保接下来开始实现功能在点击对比按钮后先从两个输入框中获取两个图像路径载入内存中代码如下protectedvoidCompareImage(){try{BufferedImagebufferedImage1=ImageIO.read(newFile(image1_textField.getText()));BufferedImagebufferedImage2=ImageIO.read(newFile(image2_textField.getText()));//获得相似度floatSimilarity=CompareImageTool.CompareImage(bufferedImage1,bufferedImage2);//在标签上显示label.setText(图片相似度:+Similarity);}catch(IOExceptione){存该图片所有RGB值出现的次数的HashMap代码如下privatestaticHashMapGetRGBMap(BufferedImagebufferedImage){HashMapmap=newHashMap();for(intx=0;xbufferedImage.getWidth();x++){for(inty=0;ybufferedImage.getHeight();y++){doubleRGBValue=bufferedImage.getRGB(x,y);//如果没有保存该色值,存入if(map.get(RGBValue)==null){map.put(RGBValue,1);}//将该色值出现次数增加一次else{intTimes=(int)map.get(RGBValue);Times+=1;map.put(RGBValue,Times);}}}returnmap;}那么接下来怎么办呢?怎么计算相似度呢?这边就要用到一点数学知识,我们可以将这个得到的HashMap视为一个特殊的向量,向量维数视作所有出现过的RGB值,分量的值则是出现的次数。这个时候就巧妙的将两张图片,转化为两个含有该图像特征的向量这个时候就好办了,大家肯定学习过这么一条公式a*b=|a|*|b|*cosa,b也就是向量点积,等于向量的模相乘再乘上向量夹角。那么这个夹角,就可以视为两条向量之间的相似程度。当然,为了使我们得到的cosa,b的值卡在0,1之间,还需要对向量进行归一化代码如下privatestaticHashMapVectorNormalizing(HashMapRGBMap){//求图片特征向量1的模长doubleModulaLength=0;for(Objecti:RGBMap.keySet()){//先将所有平方相加ModulaLength+=Math.pow((double)(int)RGBMap.get(i),2);}//求平方根ModulaLength=Math.sqrt(ModulaLength);//将图片特征向量1标准化for(Objecti:RGBMap.keySet()){doublea=(double)(int)RGBMap.get(i);a=a/ModulaLength;RGBMap.put(i,a);}returnRGBMap;}接下来就是最后一步了!求出所需的cosa,b即是相似程度!代码如下publicstaticfloatCompareImage(BufferedImagebufferedImage1,BufferedImagebufferedImage2){HashMapRGBMap1=GetRGBMap(bufferedImage1);HashMapRGBMap2=GetRGBMap(bufferedImage2);//相似度floatSimilarity=0;//将两个HashMap视作特征向量进行归一化RGBMap1=VectorNormalizing(RGBMap1);RGBMap2=VectorNormalizing(RGBMap2);//向量点积得到相似度for(Objecti:RGBMap1.keySet()){doubleValue2;if(RGBMap2.get(i)==null){Value2=0;}else{Value2=(double)RGBMap2.get(i);}doubleValue1=(double)RGBMap1.get(i);Similarity+=Value1*Value2;}returnSimilarity*100;}那么程序到这边就做好了!接下来看看效果相似度88.4可以看出大致是同一张图片关于图像比对,其实有非常多的算法,我这个只是其中一种。大家如果认真看了应该能发现一些问题1.我这边单纯比对的是像素的色值出现比例,那么可能出现两张图片相同色值的像素位置完全不同,却被识别成同一张的情况。不过这种情况基本也不会出现,因为每个像素的RGB值有2^24种,所以可以近似认为色值组成相同,就是同一张图片。2.可能会有这样的情况,将一张图的全部RGB值都增加,比如将红色分量整体提升1,那么肉眼绝对看不出来区别,相似度却会被认为是0,虽然正常情况不会这样,但是为了能使该程序的容错能力更强。还可以增加颜色相似度的比较,比如rgb(100,100,100)和rgb(110,110,110)的两个像素点可以视为颜色比较相近,而不是一棍子打死认为完全不同。大家有兴趣可以对该程序进行改善
本文标题:用JAVA进行图像识别
链接地址:https://www.777doc.com/doc-2202424 .html