我想爲RGB圖像執行直方圖均衡。對於這一點,在第一I使用以下步驟生成所述直方圖:使用java的直方圖均衡
1)地圖的強度的範圍爲[0255],通過取灰度值作爲 VAL = img.getRGB(J,I)&爲0xFF;
2)計數對應於每個強度值(0-255)
3)畫出直方圖的像素的數量。
4)執行均衡
5)現在我關注的問題是,映射到對應於均衡後的直方圖的RGB圖像。我怎麼做?都是灰色的。任何解決方案?
我想爲RGB圖像執行直方圖均衡。對於這一點,在第一I使用以下步驟生成所述直方圖:使用java的直方圖均衡
1)地圖的強度的範圍爲[0255],通過取灰度值作爲 VAL = img.getRGB(J,I)&爲0xFF;
2)計數對應於每個強度值(0-255)
3)畫出直方圖的像素的數量。
4)執行均衡
5)現在我關注的問題是,映射到對應於均衡後的直方圖的RGB圖像。我怎麼做?都是灰色的。任何解決方案?
我曾在Java中做過這樣的事情。輸入是一個灰度值緩衝圖像bi。 bi的直方圖將被均衡。這是代碼。
int width =bi.getWidth();
int height =bi.getHeight();
int anzpixel= width*height;
int[] histogram = new int[255];
int[] iarray = new int[1];
int i =0;
//read pixel intensities into histogram
for (int x = 1; x < width; x++) {
for (int y = 1; y < height; y++) {
int valueBefore=bi.getRaster().getPixel(x, y,iarray)[0];
histogram[valueBefore]++;
}
}
int sum =0;
// build a Lookup table LUT containing scale factor
float[] lut = new float[anzpixel];
for (i=0; i < 255; ++i)
{
sum += histogram[i];
lut[i] = sum * 255/anzpixel;
}
// transform image using sum histogram as a Lookup table
for (int x = 1; x < width; x++) {
for (int y = 1; y < height; y++) {
int valueBefore=bi.getRaster().getPixel(x, y,iarray)[0];
int valueAfter= (int) lut[valueBefore];
iarray[0]=valueAfter;
bi.getRaster().setPixel(x, y, iarray);
}
}
仔細閱讀問題。輸入圖像是RGB不灰度。 – rayryeng
但我希望它的彩色圖像不是灰度 –
典型的方法是將RGB轉換爲另一種顏色空間,如HSV,然後將上述算法應用於亮度通道V. – Settembrini
您能向我們展示您迄今爲止所寫的任何關於您完成的步驟的代碼嗎?另外,如果將RGB值的每個組合用作直方圖中的一個單獨的bin,則將無法將此直方圖存儲在內存中,因爲您需要一個「256^3 x 64」字節(假設爲整數)的數組,並且不幸的是,這太好了,沒有任何區別力。在計算直方圖之前量化分箱是最好的。 – rayryeng