我试图在Java中对灰度图像进行直方图均衡化。描述如下:迭代图像,使用每个像素的RGB的一个频带作为查找表的索引,以确定图像的新像素值。将每个像素的RGB设置为对应于新像素值的RGB。
实现这一点,我得到了一个蓝色的图像:
删除
(预期结果)
删除
下面是我到目前为止掌握的代码:
private void histogramEqualize(BufferedImage im, int[] lut) {
for (int x = 0; x < im.getWidth(); x++) {
for (int y = 0; y < im.getHeight(); y++) {
Color c = new Color(im.getRGB(x, y));
Color eq = new Color(lut[c.getRed()], c.getGreen(), c.getBlue());
im1.setRGB(x, y, eq.getRGB());
}
}
}
public int[] getLookupTable(int[] h, int n) {
// h: Histogram for im1 in either the red band or luminance.
lut = new int[256];
double sf = 255/n;
int sumH = 0;
int sk = 0;
for(int i=0; i<h.length; i++) {
sumH += h[i];
sk = (int)(sf*sumH);
lut[i] = sk;
}
return lut;
}
我还尝试将Color eq = new Color(lut[c.getRed()], c.getGreen(), c.getBlue());
更改为Color eq = new Color(lut[c.getRed()], lut[c.getGreen()], lut[c.getBlue()]);
,但这导致了一个黑色的图像。
发布于 2017-10-25 20:58:30
您已经提到要在灰度图像上应用直方图均衡化,但是您使用的是像素的RGB颜色值。
对于灰度图像,可以将图像中的灰度级别标准化,以便进行直方图均衡化,如下所示:
1)通过计算灰度像素在图像中的出现次数,迭代每个灰度像素值,生成每个灰度级的直方图数据。
2)求出上述直方图的累积分布。
3)迭代原始图像中的灰度像素值,用相应的归一化值替换它们的值。
where L=255, that is total gray scale levels,
M = Image height,
N = Image width,
MxN to get total number of pixels in image.
cdfmin = min value of cumulative distribution data in step 2.
这将得到新的归一化图像矩阵。
如果要在RGB图像上应用直方图均衡化,则需要将RGB颜色空间转换为HSV颜色空间,并在不改变其色调和饱和度的情况下在值通道上应用与灰度图像相同的步骤。
https://stackoverflow.com/questions/46945687
复制