0

我正在尝试在彩色图像上实现直方图/图像均衡。我不确定我是否正确实现了它,因为每次我将它应用于位图图像时屏幕都会变黑。该算法称为histogram equalization


我的代码中进行直方图均衡计算的部分:

    for (int x = 0; x < width; x++) {
        for (int y = 0; y < height; y++) {

            A = (pixels[index] >> 24) & 0xFF;
            R = (pixels[index] >> 16) & 0xFF;
            G = (pixels[index] >> 8) & 0xFF;
            B = pixels[index] & 0xFF;

            R = Math.round(((R - cumR[minR]) / (cumR[maxR] - cumR[minR])) * 255);
            G = Math.round(((G - cumG[minG]) / (cumG[maxG] - cumG[minG])) * 255);
            B = Math.round(((B - cumB[minB]) / (cumB[maxB] - cumB[minB])) * 255);

            returnBitmap.setPixel(x, y, Color.argb(A, R, G, B));

            ++index;
        }
    }

应用我的代码后,图像显示为黑色,为什么不显示均衡图像?

4

2 回答 2

1

您没有正确计算直方图。每个像素不应该有一个直方图点,每个值都有一个直方图点[0..255]。您想计算有多少像素具有该值,而不是红色的总“值”。

这是获取图像直方图(和累积)的好方法。它应该让你开始走上正确的道路。

// generate histogram channels
// histogram arrays should be [0...255]
for (int i = 0; i < pixels.length; i++) {
    R = (pixels[i] >> 16) & 0xFF;
    G = (pixels[i] >> 8) & 0xFF;
    B = pixels[i] & 0xFF;

    histoR[R]++;
    histoG[G]++;
    histoB[B]++;  
}

// generate cumulative histograms
cumR[0] = histoR[0];
cumG[0] = histoG[0];
cumB[0] = histoB[0];
for(int i=1;i<histoR.length;i++){
    cumR[i] = histoR[i] + histoR[i-1];
    cumG[i] = histoG[i] + histoG[i-1];
    cumB[i] = histoB[i] + histoB[i-1];
}
于 2013-08-07T15:10:26.117 回答
0

经过一番研究,我找到了一个Histogram Equalization使用LUT示例Java,它比将其转换为另一种Color Space(例如RGB 到 YUV )更好。

通过最少的修改,我可以使用以下代码:

Java的直方图均衡化

于 2013-08-09T05:10:11.077 回答