HSV颜色直方图

package com.imageretrieval.features;

import java.awt.Color;

import com.imageretrieval.utils.HSV;
import com.imageretrieval.utils.Pixel;

/**
 * 该颜色直方图更接近于人类对图片的识别程度
 * @author VenyoWang
 *
 */
public class HSVColorHistogram {

	public static void main(String[] args) {
		Pixel[][] matrix = getImagePixel("", 200, 200);
		Pixel[][] matrix1 = getImagePixel("", 200, 200);
		
		HSV[][] hsvMatrix = new HSV[matrix.length][];
		HSV[][] hsvMatrix1 = new HSV[matrix1.length][];
		for(int i = 0; i < matrix.length; i++){
			hsvMatrix[i] = new HSV[matrix[i].length];
			hsvMatrix1[i] = new HSV[matrix1[i].length];
			for(int j = 0; j < matrix[i].length; j++){
				float[] fs = Color.RGBtoHSB(matrix[i][j].red, matrix[i][j].green, matrix[i][j].blue, null);
				HSV hsv = new HSV();
				hsv.h = (int)(fs[0] * 255);
				hsv.s = (int)(fs[1] * 255);
				hsv.v = (int)(fs[2] * 255);
				hsvMatrix[i][j] = hsv;
				fs = Color.RGBtoHSB(matrix1[i][j].red, matrix1[i][j].green, matrix1[i][j].blue, null);
				hsv = new HSV();
				hsv.h = (int)(fs[0] * 255);
				hsv.s = (int)(fs[1] * 255);
				hsv.v = (int)(fs[2] * 255);
				hsvMatrix1[i][j] = hsv;
			}
		}
		int[][] histogram = new int[3][256];
		int[][] histogram1 = new int[3][256];
		for(int i = 0; i < hsvMatrix.length; i++){
			for(int j = 0; j < hsvMatrix[0].length; j++){
				histogram[0][hsvMatrix[i][j].h]++;
				histogram[1][hsvMatrix[i][j].s]++;
				histogram[2][hsvMatrix[i][j].v]++;
				histogram1[0][hsvMatrix1[i][j].h]++;
				histogram1[1][hsvMatrix1[i][j].s]++;
				histogram1[2][hsvMatrix1[i][j].v]++;
			}
		}
		
		int[] vector = Util.matrix2vector(histogram);
		int[] vector1 = Util.matrix2vector(histogram1);
		
		System.out.println(calculateSimilarity(vector, vector1));
	}

    public static Pixel[][] getImagePixel(String imagePath, int width, int height) {
		BufferedImage bi = null;
		try {
			bi = resizeImage(imagePath, width, height, BufferedImage.TYPE_INT_RGB);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
		int minx = bi.getMinX();
		int miny = bi.getMinY();
		Pixel[][] rgbMatrix = new Pixel[width - minx][height - miny];
		for (int i = minx; i < width; i++) {
			for (int j = miny; j < height; j++) {
				int pixel = bi.getRGB(i, j);
				int red = (pixel & 0xff0000) >> 16;
				int green = (pixel & 0xff00) >> 8;
				int blue = (pixel & 0xff);
				Pixel p = new Pixel();
				p.red = red;
				p.green = green;
				p.blue = blue;
				rgbMatrix[i - minx][j - miny] = p;
			}
		}
		return rgbMatrix;
	}
	
    public static BufferedImage resizeImage(String srcImgPath, int width, int height, int imageType)
			throws IOException {
		File srcFile = new File(srcImgPath);
		BufferedImage srcImg = ImageIO.read(srcFile);
		BufferedImage buffImg = null;
		buffImg = new BufferedImage(width, height, imageType);
		buffImg.getGraphics().drawImage(srcImg.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);
		return buffImg;
	}

    public static double calculateSimilarity(int[] vector, int[] vector1) {
		double len = 0, len1 = 0, numerator = 0;
		for (int i = 0; i < vector.length; i++) {
			len += Math.pow(vector[i], 2);
			len1 += Math.pow(vector1[i], 2);
			numerator += vector[i] * vector1[i];
		}
		len = Math.sqrt(len);
		len1 = Math.sqrt(len1);

		return numerator / (len * len1);
	}

    public static int[] matrix2vector(int[][] matrix){
		if(matrix.length <= 0 || matrix[0].length <= 0){
			return null;
		}
		int[] vector = new int[matrix.length * matrix[0].length];
		int index = 0;
		for(int i = 0; i < matrix.length; i++){
			for(int j = 0; j < matrix[0].length; j++, index++){
				vector[index] = matrix[i][j];
			}
		}
		return vector;
	}
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏hotqin888的专栏

golang知识图谱NLP实战第三节——实体三元组关系抽取

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hotqin888/article/det...

6113
来自专栏小樱的经验随笔

HDU 2549 壮志难酬

壮志难酬 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java...

27110
来自专栏程序员互动联盟

【编程之美】斐波拉契数列

斐波拉契 意大利的数学家列昂那多·斐波那契在1202年研究兔子产崽问题时发现了此数列.设一对大兔子每月生一对小兔子,每对新生兔在出生一个月后又下崽,假若兔子都不...

3555
来自专栏菩提树下的杨过

Flash/Flex学习笔记(39):弹性运动

动画中的弹性运动 从视觉效果上接近 物理经典力学中的单摆运动或弹簧(胡克定律F=Kx)振动 先看下面的模拟演示: 规律: 小球先从出发点(初始为最左侧)向目标点...

2045
来自专栏GreenLeaves

COALESCE操作符

一、应用场景 1、购买的零件和本地生产的零件都是零件,尽管多重的实体类型在数据存储上略有不同,但是它们有太多的相同之处,因此通常使用一个表格而不是两个。 所以这...

19510
来自专栏WOLFRAM

2016年Wolfram一行代码大赛获奖部分作品

2548
来自专栏文武兼修ing——机器学习与IC设计

关于空难数据集的探索分析导入数据集伤亡分析机型处理时间分析

写在前面: 这是我见过的最严肃的数据集,几乎每一行数据背后都是生命和鲜血的代价。这次探索分析并不妄图说明什么,仅仅是对数据处理能力的锻炼。因此本次的探索分析...

4355
来自专栏calmound

ZOJ 3594 Sexagenary Cycle

题意:天干地支。         天干: Jia, Yi, Bing, Ding, Wu, Ji, Geng, Xin, Ren and Gui        ...

2815
来自专栏Guangdong Qi

iOS 简单易懂的粒子效果

2513
来自专栏WOLFRAM

错觉艺术的巅峰,错觉图形大师M.C. Escher的不可能方块的可能模型

1833

扫码关注云+社区

领取腾讯云代金券