一种非常简单而有效的颜色特征使由Stricker 和Orengo所提出的颜色矩(color moments) 这种方法的数学基础在于图像中任何的颜色分布均可以用它的矩来表示。此外,由于颜色分布信息主要集中在低
创新互联建站专业为企业提供娄底网站建设、娄底做网站、娄底网站设计、娄底网站制作等企业网站建设、网页设计与制作、娄底企业网站模板建站服务,十余年娄底做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
阶矩中,因此仅采用颜色的一阶矩(mean)、二阶矩(variance)和三阶矩(skewness)足以表达图像的颜色分布。与颜色直方图相比,该方法的另一个好处在于无需对特征进行向量化。因此,图像的颜色矩一共只需要9个分量(3个颜色分量,每个分量上3个低阶矩),与其他的颜色特征相比是非常简洁的。在实际应用中为避免低次矩较弱的分辨能力,颜色矩常和其它特征结合使用,而且一般在使用其它特征前起到过滤缩小范围(narrow down)的作用。
java.awt.Color 类用于封装默认 sRGB 颜色空间中的颜色,或者用于封装由 ColorSpace
标识的任意颜色空间中的颜色。每种颜色都有一个隐式的 alpha 值 1.0,或者有一个在构造方法中提供的显式的 alpha 值。alpha
值定义了颜色的透明度,可用一个在 0.0 - 1.0 或 0 - 255 范围内的浮点值表示它。alpha 值为 1.0 或 255
则意味着颜色完全是不透明的,alpha 值为 0 或 0.0 则意味着颜色是完全透明的。在使用显式的 alpha 值构造 Color
时,或者在获取某个 Color 的颜色/alpha 分量时,从不将颜色分量预乘 alpha 分量。
希望可以帮助到你.
import java.util.Arrays;
import java.util.Scanner;
public class Histogram{
private String title;
private double start, stop;
private double[] data;
public Histogram(String title, double start, double stop, double[] data, int numBars){
this.title = title;
this.start = start;
this.stop = stop;
this.data = data;
}
public String toString(){
int len = data.length;
String[] arr = new String[len];
double tmp = start;
double each = (stop - start) / (len - 1);
double max = Double.MIN_VALUE;
for(int i = 0; i len; i++)
{
double di = data[i];
max = di max ? di : max;
}
for(int i = 0; i len; i++)
{
String x = "";
int num = Integer.parseInt(String.format("%.0f", data[i] * 40 / max));
for(int j = 0; j num; j++)
{
x += "#";
}
arr[i] = tmp + " " + x + " " + data[i];
tmp += each;
}
return String.format("%s%s20^", title,
Arrays.toString(arr).replaceAll("\\x20", "")
.replaceAll("[\\[\\],]", "\r\n"));
}
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
System.out.println("Enter a histogram.");
System.out.println("Title: ");
String title = scan.nextLine();
System.out.println("Start value: ");
double start = Double.parseDouble(scan.nextLine());
System.out.println("End value: ");
double stop = Double.parseDouble(scan.nextLine());
System.out.println("Data: ");
String d = scan.nextLine();
scan.close();
String[] ds = d.split("\\s+");
double[] data = new double[ds.length];
for(int i = 0; i data.length; i++){
data[i] = Double.parseDouble(ds[i]);
}
Histogram hist = new Histogram(title, start, stop, data, data.length);
System.out.println(hist.toString());
}
}
//因为要计算H-S的直方图,所以需要得到一个HSV空间的图像
cvtColor(srcImage, hsvImage, CV_BGR2HSV);
imshow("【HSV空间的原图】", hsvImage);
//为计算直方图配置变量
//首先是需要计算的图像的通道,就是需要计算图像的哪个通道(bgr空间需要确定计算 b或g货r空间)
int channels[] = { 0, 1 };
//然后是配置输出的结果存储的 空间 ,用MatND类型来存储结果
MatND dstHist;
//接下来是直方图的每一个维度的 柱条的数目(就是将数值分组,共有多少组)
//如果这里写成int histSize = 256; 那么下面调用计算直方图的函数的时候,该变量需要写 histSize
int histSize[] = { 30, 32 };
//最后是确定每个维度的取值范围,就是横坐标的总数
//首先得定义一个变量用来存储 单个维度的 数值的取值范围
float HRanges[] = { 0, 180 };
float SRanges[] = { 0, 256 };
const float *ranges[] = { HRanges, SRanges };
可以啊,用Java2D绘图库很容易的,都是些线、矩形、扇形、字符串而已,以前项目中这么作过,如果不作通用类库的话结构也可以不考虑那么些,直接作个专用方法,传数据对象进去,返回图像BufferedImage之类就行了。只是些四则运算。
或者找其它类库。