一種非常簡單而有效的顏色特征使由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之類就行了。只是些四則運算。
或者找其它類庫。