1

我正在做一个项目,在这个项目中我试图使用直方图均衡来做一些事情,比如从这个图像开始

http://zerocool.is-a-geek.net/wp-content/uploads/2011/12/input-300x200.jpg

“http://zerocool.is-a-geek.net/wp-content/uploads/2011/12/hist_before.png”

到这张图片

http://zerocool.is-a-geek.net/wp-content/uploads/2011/12/output-300x200.jpg

“http://zerocool.is-a-geek.net/wp-content/uploads/2011/12/hist_after.png”

但我似乎无法弄清楚。

这是我的增强图像代码,应该实现相同类型的调整..

public void EnhancedImage (File fileName) {

           double sumc = 0;
            for(int r = 0; r < array.length; r++){
                for(int c = 0; c < array[r].length; c++){ 
                    sumc = r+c;
                    if (sumc <= array[r][c]) {
                     sumc = array[r][c];
                    }
                        newc = Math.round(maxshade * ((double)sumc / pixtot));
                        array[r][c] = (int) (newc);
                        if (array[r][c] > 255) {
                            array[r][c] = 255;
                    }
                }

                }

我想使用的算法如下,其中 maxShade 是图像的最大阴影(通常为 255) sumc 是图像中值小于或等于 c 的像素总数,而 pixtot 是像素总数在图片里:

newc := round(maxShade * ((double)sumc / pixtot))

但我不确定我是否做得对……目前我的图像变得非常暗。

任何帮助,将不胜感激!!谢谢。

还有我的pixtot例程:

 pixtot = 0;
           for(int y = 0; y < imageArray.length; y++)
                for(int x = 0; x < imageArray[0].length; x++)
                    pixtot = x+y;
4

1 回答 1

1

你的问题在这里:

pixtot = x+y;

首先,你想要+=,不是=。其次,这是将像素的索引相加,而不是像素的。你想要类似的东西

pixtot += imageArray[y][x];

你犯了同样的概念错误sumc

编辑:

您的代码还有很多其他问题。如果要拉伸动态范围,则要计算minmax,所有像素值的最小值和最大值,然后将每个像素值计算为value = maxshade * (value - min) / (max - min)0这为您提供了ifvalue==minmaxshadeif的结果像素值value==max

然而,这并没有真正给你直方图均衡。为此,您需要计算输入像素值的直方图并计算该直方图中的分位数以计算输出值,这并不容易。

于 2012-09-20T23:37:31.717 回答