我想为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