1. 程式人生 > >JAVA比較兩張圖相似度

JAVA比較兩張圖相似度

利用直方圖原理比較2張圖片相似度
package com.uiwho.com;

import javax.imageio.*;
import java.awt.image.*;
import java.awt.*;//Color  
import java.io.*;

public class PhotoDigest {
	public static void main(String[] args) throws Exception {
		float percent = compare(getData("C:/Users/Administrator/Desktop/1.jpg"),
				getData("C:/Users/Administrator/Desktop/2.png"));
		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 就是所謂圖形學當中的直方圖的概念
		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;
		}
	}
}