Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >HSV颜色直方图

HSV颜色直方图

作者头像
Venyo
发布于 2018-03-15 05:26:00
发布于 2018-03-15 05:26:00
1.2K00
代码可运行
举报
文章被收录于专栏:Venyo 的专栏Venyo 的专栏
运行总次数:0
代码可运行
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;
	}
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
环形颜色分布直方图
package com.imageretrieval.features; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.imageretrieval.utils.Coordinate; import com.imageretrieval.utils.ImageUtil; import com.imageretrieval.utils
Venyo
2018/03/15
9860
RBG颜色直方图
package com.imageretrieval.features; import java.awt.Color; import com.imageretrieval.utils.Pixel; public class RGBColorHistogram { public static void main(String[] args) { Pixel[][] matrix = getImagePixel("", 200, 200); Pixel[][] matrix1 = getIma
Venyo
2018/03/15
5810
颜色聚合向量
package com.imageretrieval.features; /** * 颜色聚合向量<br> * 参考链接:http://www.docin.com/p-396527256.html * * @author VenyoWang * */ public class ColorCoherenceVector { private static int BIN_WIDTH = 4; public static void main(String[] args) { int[][
Venyo
2018/03/15
8860
均匀LBP纹理特征
package com.imageretrieval.features; /** * 均匀LBP纹理特征<br> * 参考链接:http://blog.csdn.net/lu597203933/article/details/17184503 * @author VenyoWang * */ public class UniformLBP { public static void main(String[] args) { int[] vector = getFeatureVector(
Venyo
2018/03/15
7250
旋转不变的感知哈希
package com.imageretrieval.features; import com.imageretrieval.utils.ImageUtil; /** * 旋转不变的感知哈希<br> * @author VenyoWang * */ public class RHash { public static void main(String[] args) { String hash = getFeatureValue(""); String hash1 = getFeat
Venyo
2018/03/15
1.4K0
pHash的Java实现
此算法中的DCT变换是从 http://blog.csdn.net/luoweifu/article/details/8214959抄过来的,因为这种需要大量的复杂的数学运算,我看不来,完全不懂...都已经还给老师了... package com.imageretrieval.features; import com.imageretrieval.utils.ImageUtil; /** * pHash<br> * 参考链接:http://blog.csdn.net/zouxy09/article/
Venyo
2018/03/15
2.5K0
小玩意|图片转ASCII
今天,我们来完成一个小玩意,将图片转成ASCII,最后使用Base64转换成灰色图。如,将图
孟君
2022/11/21
1.5K0
小玩意|图片转ASCII
java学习笔记(中级篇)—java实现高质量图片压缩
使用java几十行代码实现一个高质量图片压缩程序,再也不用去自己找网络的压缩程序啦!而且很多网上的工具还有水印或者其他的限制,自己动手写一个简单的应用,是再合适不过了。
chlinlearn
2019/08/06
2.2K0
Android开发:使用Java对手机截图图片进行任意区域的颜色对比度处理操作
开发项目过程中,对于手机屏幕截图,需要对获取到的截图的任意部分进行区域颜色对比度的识别操作,由此判定任意指定区域是否满足某对比度基本标准,但是该功能在网上任何地方都没有找到过Java方面的代码,于是根据RGB转换测试的原理:即获取每个像素点的RGB,通过RGB对比度定义公式进行像素点的集合换取。
程序员洲洲
2024/06/06
1530
未来有望干掉 Python 和 JavaScript 的编程语言
Python 和 JavaScript 是两门非常有影响力的编程语言,二者都是我们在打造跨平台应用时会用到的主流语言。由于 Python 和 JavaScript 都是脚本语言,因此它们有很多共同的特性,都需要解释器来运行,都是动态类型,都支持自动内存管理,都可以调用 eval()来执行脚本等等脚本语言所共有的特性。在过去这些年来,Python 和 JavaScript 占据着主导型地位,但有句话说得好,长江后浪推前浪,青出于蓝胜于蓝。如果将来有一天,Python 和 JavaScript 被打败赶下榜单,那这个挑战者会是谁呢?退休的软件工程师 Richard Kenneth Eng 为我们分享了他的看法,罗列了那些他认为有望打败 Python 和 JavaScript 的编程语言。
逆锋起笔
2020/02/21
5930
未来有望干掉 Python 和 JavaScript 的编程语言
未来能取代Python和JavaScript 的程序语言会是什么?
Python 和 JavaScript 是目前最火的两大编程语言,但是 2020 年,什么编程语言将会取而代之呢?
用户7886150
2020/11/20
6960
基于 OpenCV 与 Java 两个语言版本实现获取某一图片特定区域的颜色对比度
对比度是指图像中不同区域之间的明暗差异程度,它是图像质量中的重要指标之一。除了颜色对比度之外,常见的对比度包括:
程序员洲洲
2024/06/07
4420
基于 OpenCV 与 Java 两个语言版本实现获取某一图片特定区域的颜色对比度
纯血鸿蒙APP实战开发——根据icon自适应背景颜色
小帅聊鸿蒙
2025/02/11
1160
纯血鸿蒙APP实战开发——根据icon自适应背景颜色
骰子作画
package Hebut_HappyBirthday; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.lang.invoke.ConstantCallSite; import java.util.ArrayList; import javax.imageio.ImageIO; public cla
xiaohejun
2020/02/18
6040
单调栈结构 && 84. Largest Rectangle in Histogram&&最大子矩阵的大小
Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.
大学里的混子
2019/02/24
5450
OS实现智能背景
我们要计算图片,需要将图片像素通过颜色空间转换为二进制数据,再将二进制数据转换为颜色,从而获取到这张图片的所有颜色数据。
花落花相惜
2021/12/04
4360
OpenCV源码系列|图像自选融合
应用场景:挖取a图小块放在b图中,美图秀秀呀,抠图软件制作等 视觉效果: 代码实现: #include "opencv2/photo.hpp" #include "opencv2/imgproc.hpp" #include "opencv2/imgcodecs.hpp" #include "opencv2/highgui.hpp" #include "opencv2/core.hpp" #include <iostream> // we're NOT "using namespace std;" he
用户9831583
2022/06/16
3400
OpenCV源码系列|图像自选融合
怎么搭建直播平台,合理使用验证码工具类
Person-Holding-Smartphone_gVdPb2YBGXfQ (2).jpeg package com.ywfcake.demo.util; import lombok.extern.slf4j.Slf4j; import java.awt.*; import java.awt.image.BufferedImage; import java.util.HashMap; import java.util.Map; import java.util.Random; /**  * @Aut
yunbaokeji柯基
2020/10/09
1.9K0
怎么搭建直播平台,合理使用验证码工具类
java图形验证码生成工具类及web页面校验验证码
许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。
Bobby
2019/04/09
1.6K0
新技能 Get,使用直方图处理进行颜色校正
作者 | 小白 来源 | 小白学视觉 在这篇文章中,我们将探讨如何使用直方图处理技术来校正图像中的颜色。 像往常一样,我们导入库,如numpy和matplotlib。此外,我们还从skimage 和scipy.stats库中导入特定函数。 import numpy as npimport matplotlib.pyplot as pltfrom skimage.io import imread, imshowfrom skimage import img_as_ubytefrom skima
AI科技大本营
2023/04/14
4870
新技能 Get,使用直方图处理进行颜色校正
相关推荐
环形颜色分布直方图
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档