欢迎来到天天文库
浏览记录
ID:59145679
大小:59.78 KB
页数:5页
时间:2020-09-11
《用JAVA进行图像识别.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、我们来用JAVA制作一个进行图像识别的小程序.输入两个图像路径,就可以进行比对,然后输出相似度接下来是制作过程首先制作界面GUI制作完成后效果如下接下来开始实现功能在点击对比按钮后先从两个输入框中获取两个图像路径载入内存中代码如下protectedvoidCompareImage(){try{BufferedImagebufferedImage1=ImageIO.read(newFile(image1_textField.getText()));BufferedImagebufferedImage2=ImageIO.read(newFile(imag
2、e2_textField.getText()));//获得相似度floatSimilarity=CompareImageTool.CompareImage(bufferedImage1,bufferedImage2);//在标签上显示label.setText("图片相似度:"+Similarity);}catch(IOExceptione){//TODOAuto-generatedcatchblockInfo_Label.setText("读取图片出错!");e.printStackTrace();}}我们这边将读取进来的图片转化为两个Buffer
3、edImage对象,发送到CompareImageTool.CompareImage方法中进行比较接下来我们完成这个对比的方法我们这里要求的是图片相似度,算法有很多种,我们这边采用这样一种方法。首先扫描图片的每个像素,获取所有RGB值,相同的RGB值放在一起。最后得到的是一个保存该图片所有RGB值出现的次数的HashMap代码如下privatestaticHashMapGetRGBMap(BufferedImagebufferedImage){HashMapmap=newHashMap();for(intx=0;x4、Width();x++){for(inty=0;y5、这边就要用到一点数学知识,我们可以将这个得到的HashMap视为一个特殊的向量,向量维数视作所有出现过的RGB值,分量的值则是出现的次数。这个时候就巧妙的将两张图片,转化为两个含有该图像特征的向量这个时候就好办了,大家肯定学习过这么一条公式a*b=6、a7、*8、b9、*cos 也就是向量点积,等于向量的模相乘再乘上向量夹角。那么这个夹角,就可以视为两条向量之间的相似程度。当然,为了使我们得到的cos的值卡在0,1之间,还需要对向量进行归一化代码如下privatestaticHashMapVectorNormalizing(HashMap10、RGBMap){//求图片特征向量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;RGBMa11、p.put(i,a);}returnRGBMap;}接下来就是最后一步了!求出所需的cos即是相似程度!代码如下publicstaticfloatCompareImage(BufferedImagebufferedImage1,BufferedImagebufferedImage2){HashMapRGBMap1=GetRGBMap(bufferedImage1);HashMapRGBMap2=GetRGBMap(bufferedImage2);//相似度floatSimilarity=0; //将两个HashMap视作特征向量进行归一化R12、GBMap1=VectorNormalizing(RGBMap1);RGBMap2=VectorNormal
4、Width();x++){for(inty=0;y5、这边就要用到一点数学知识,我们可以将这个得到的HashMap视为一个特殊的向量,向量维数视作所有出现过的RGB值,分量的值则是出现的次数。这个时候就巧妙的将两张图片,转化为两个含有该图像特征的向量这个时候就好办了,大家肯定学习过这么一条公式a*b=6、a7、*8、b9、*cos 也就是向量点积,等于向量的模相乘再乘上向量夹角。那么这个夹角,就可以视为两条向量之间的相似程度。当然,为了使我们得到的cos的值卡在0,1之间,还需要对向量进行归一化代码如下privatestaticHashMapVectorNormalizing(HashMap10、RGBMap){//求图片特征向量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;RGBMa11、p.put(i,a);}returnRGBMap;}接下来就是最后一步了!求出所需的cos即是相似程度!代码如下publicstaticfloatCompareImage(BufferedImagebufferedImage1,BufferedImagebufferedImage2){HashMapRGBMap1=GetRGBMap(bufferedImage1);HashMapRGBMap2=GetRGBMap(bufferedImage2);//相似度floatSimilarity=0; //将两个HashMap视作特征向量进行归一化R12、GBMap1=VectorNormalizing(RGBMap1);RGBMap2=VectorNormal
5、这边就要用到一点数学知识,我们可以将这个得到的HashMap视为一个特殊的向量,向量维数视作所有出现过的RGB值,分量的值则是出现的次数。这个时候就巧妙的将两张图片,转化为两个含有该图像特征的向量这个时候就好办了,大家肯定学习过这么一条公式a*b=
6、a
7、*
8、b
9、*cos 也就是向量点积,等于向量的模相乘再乘上向量夹角。那么这个夹角,就可以视为两条向量之间的相似程度。当然,为了使我们得到的cos的值卡在0,1之间,还需要对向量进行归一化代码如下privatestaticHashMapVectorNormalizing(HashMap
10、RGBMap){//求图片特征向量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;RGBMa
11、p.put(i,a);}returnRGBMap;}接下来就是最后一步了!求出所需的cos即是相似程度!代码如下publicstaticfloatCompareImage(BufferedImagebufferedImage1,BufferedImagebufferedImage2){HashMapRGBMap1=GetRGBMap(bufferedImage1);HashMapRGBMap2=GetRGBMap(bufferedImage2);//相似度floatSimilarity=0; //将两个HashMap视作特征向量进行归一化R
12、GBMap1=VectorNormalizing(RGBMap1);RGBMap2=VectorNormal
此文档下载收益归作者所有