Java實現(xiàn)圖片比對算法
更新時間:2022年04月21日 15:27:43 作者:天生要強注定要涼
這篇文章主要為大家詳細介紹了Java實現(xiàn)圖片比對算法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
采用直方圖原理算法比對圖片的細微差別效果比較好,以下兩張區(qū)別很小的圖片識別效果如下:
識別結(jié)果:
主要代碼如下:
import javax.imageio.*; import java.awt.image.*; import java.awt.*; import java.io.*; ? public class PhotoDigest { ? ? public static void main(String[] args) throws Exception { ? ? ? ? float percent = compare(getData("/Users/sun/Downloads/1.jpg"), ? ? ? ? ? ? ? ? getData("/Users/sun/Downloads/3.jpg")); ? ? ? ? if (percent == 0) { ? ? ? ? ? ? System.out.println("無法比較"); ? ? ? ? } else { ? ? ? ? ? ? System.out.println("兩張圖片的相似度為:" + percent + "%"); ? ? ? ? } ? ? } ? ? ? public static int[] getData(String name) { ? ? ? ? try { ? ? ? ? ? ? BufferedImage img = ImageIO.read(new File(name)); ? ? ? ? ? ? BufferedImage slt = new BufferedImage(100, 100, ? ? ? ? ? ? ? ? ? ? BufferedImage.TYPE_INT_RGB); ? ? ? ? ? ? slt.getGraphics().drawImage(img, 0, 0, 100, 100, null); ? ? ? ? ? ? // ImageIO.write(slt,"jpeg",new File("slt.jpg")); ? ? ? ? ? ? int[] data = new int[256]; ? ? ? ? ? ? for (int x = 0; x < slt.getWidth(); x++) { ? ? ? ? ? ? ? ? for (int y = 0; y < slt.getHeight(); y++) { ? ? ? ? ? ? ? ? ? ? int rgb = slt.getRGB(x, y); ? ? ? ? ? ? ? ? ? ? Color myColor = new Color(rgb); ? ? ? ? ? ? ? ? ? ? int r = myColor.getRed(); ? ? ? ? ? ? ? ? ? ? int g = myColor.getGreen(); ? ? ? ? ? ? ? ? ? ? int b = myColor.getBlue(); ? ? ? ? ? ? ? ? ? ? data[(r + g + b) / 3]++; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? ? ? // data 就是所謂圖形學(xué)當中的直方圖的概念 ? ? ? ? ? ? return data; ? ? ? ? } catch (Exception exception) { ? ? ? ? ? ? System.out.println("有文件沒有找到,請檢查文件是否存在或路徑是否正確"); ? ? ? ? ? ? return null; ? ? ? ? } ? ? } ? ? ? public static float compare(int[] s, int[] t) { ? ? ? ? try { ? ? ? ? ? ? float result = 0F; ? ? ? ? ? ? for (int i = 0; i < 256; i++) { ? ? ? ? ? ? ? ? int abs = Math.abs(s[i] - t[i]); ? ? ? ? ? ? ? ? int max = Math.max(s[i], t[i]); ? ? ? ? ? ? ? ? result += (1 - ((float) abs / (max == 0 ? 1 : max))); ? ? ? ? ? ? } ? ? ? ? ? ? return (result / 256) * 100; ? ? ? ? } catch (Exception exception) { ? ? ? ? ? ? return 0; ? ? ? ? } ? ? } }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:
相關(guān)文章
Spring開發(fā)核心之AOP的實現(xiàn)與切入點持久化
面向?qū)ο缶幊淌且环N編程方式,此編程方式的落地需要使用“類”和 “對象”來實現(xiàn),所以,面向?qū)ο缶幊唐鋵嵕褪菍?nbsp;“類”和“對象” 的使用,面向切面編程,簡單的說,就是動態(tài)地將代碼切入到類的指定方法、指定位置上的編程思想就是面向切面的編程2022-10-10java設(shè)計模式之策略模式在促銷活動場景中的使用案例
這篇文章主要為大家介紹了java設(shè)計模式之策略模式在促銷活動場景中案例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05Java中關(guān)于優(yōu)先隊列PriorityQueue的使用及相關(guān)方法
這篇文章主要介紹了Java中關(guān)于優(yōu)先隊列PriorityQueue的使用及相關(guān)方法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08Java中基于DeferredResult的異步服務(wù)詳解
這篇文章主要介紹了Java中基于DeferredResult的異步服務(wù)詳解,DeferredResult字面意思是"延遲結(jié)果",它允許Spring MVC收到請求后,立即釋放(歸還)容器線程,以便容器可以接收更多的外部請求,提升吞吐量,需要的朋友可以參考下2023-12-12