我正在尝试在彩色图像上实现直方图/图像均衡。我不确定我是否已将其正确实现,因为每次将其应用于位图图像时屏幕都会变黑。该算法称为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;
}
}
一旦我的代码被应用,图像就显示为黑色,为什么它不显示均衡的图像?
答案 0 :(得分: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];
}
答案 1 :(得分:0)
经过一些研究,我能够使用Histogram Equalization
的{{1}}示例找到LUT
,这比将其转换为另一个Java
更好,例如RGB to YUV
通过最少的修改,我能够使用以下代码: