欢迎来到天天文库
浏览记录
ID:43658926
大小:78.50 KB
页数:5页
时间:2019-10-12
《用JAVA进行图像识别_计算机软件及应用_IT计算机_专业资料》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、我们来用JAVA制作一个进行图像识别的小程序.输入两个图像路径,就可以进行比对,然后输出相似度接下來是制作过程首先制作界而GUI制作完成示效果如下图片路径1图片路径2谴输入两个图片路径对比相似度接下來开始实现功能在点击对比按钮后先从两个输入框中获取两个图像路径载入内存中代码如卞protectedvoidComparelmage(){try{BufferedlmagebufferedImagel=lmagelO.read(newFile(image1_textField.getText()));Bufferedlmagebufferedlmage2=lmagelO.rea
2、d(newFile(image2_textField.getText()));〃获得相似度floatSimilarity=Comparelmagelbol.Comparelmage(bufferedlmage1,bufferedlmage2);//在标签上显示label.setlext("图片相似度:"+Similarity);)catch(lOExceotione)f我们这边将读取进来的图片转化为两个Bufferedlmage对象,发送到ComparelmageTool.Compareimage方法中进行比较接下来我们完成这个对比的方法我们这里耍求的是图片相似度,算法
3、有很多种,我们这边釆用这样一种方法。首先扫描图片的每个像索,获取所有RGB值,相同的RGB值放在一起。最后得到的是一个保存该图片所冇RGB值出现的次数的HashMap代码如下privatestaticHashMapGetRGBMap(Bufferedlmagebufferedlmage){HashMapmap=newHashMapO;for(intx=O;x4、GB(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值,分量的值则是出现的次数。这个时候就巧妙的将两张图片,转化为两个含冇该图像特征的向虽这个时5、候就好办了,大家肯定学习过这么一条公式a*b=6、a7、*8、b9、*cos也就是向量点积,等于向量的模相乘再乘上向蜃夹角。那么这个夹角,就可以视为两条向量之间的相似程度。当然,为了使我们得到的cos的值卡在0,1之间,还需要対向量进行归一化代码如下privatestaticHashMapVectorNormalizing(HashMapRGBMap){〃求图片特征向量1的模长doubleModulaLength=0;for(Objecti:RGBMap.keySet()){〃先将所有平方相加ModulaLength+=Math.pow((double)(i10、nt)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;}接下来就是最后一步了!求出所需的cos即是相似程度!Bufferedlmage代码如下publicstaticfloatComparelmage(Bufferedlmagebufferedlm11、agel,bufferedlmage2){HashMapRGBMapI=GetRGBMap(bufferedlmage1);HashMapRGBMap2=GetRGBMap(bufferedlmage2);//相似度floatSimilarity=O;〃将两个HashMap视作特征向量进行归一化RGBMapI=VectorNormalizing(RGBMap1);RGBMap2=VectorNormalizing(RGBMap2);〃向量点积得到相似度for(Objecti:RGBMap1.keySet()){doubleValue2;i
4、GB(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值,分量的值则是出现的次数。这个时候就巧妙的将两张图片,转化为两个含冇该图像特征的向虽这个时
5、候就好办了,大家肯定学习过这么一条公式a*b=
6、a
7、*
8、b
9、*cos也就是向量点积,等于向量的模相乘再乘上向蜃夹角。那么这个夹角,就可以视为两条向量之间的相似程度。当然,为了使我们得到的cos的值卡在0,1之间,还需要対向量进行归一化代码如下privatestaticHashMapVectorNormalizing(HashMapRGBMap){〃求图片特征向量1的模长doubleModulaLength=0;for(Objecti:RGBMap.keySet()){〃先将所有平方相加ModulaLength+=Math.pow((double)(i
10、nt)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;}接下来就是最后一步了!求出所需的cos即是相似程度!Bufferedlmage代码如下publicstaticfloatComparelmage(Bufferedlmagebufferedlm
11、agel,bufferedlmage2){HashMapRGBMapI=GetRGBMap(bufferedlmage1);HashMapRGBMap2=GetRGBMap(bufferedlmage2);//相似度floatSimilarity=O;〃将两个HashMap视作特征向量进行归一化RGBMapI=VectorNormalizing(RGBMap1);RGBMap2=VectorNormalizing(RGBMap2);〃向量点积得到相似度for(Objecti:RGBMap1.keySet()){doubleValue2;i
此文档下载收益归作者所有