2012-09-20 52 views
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; 

回答

1

你的问题是在这里:

pixtot = x+y; 

首先,你要+=,不=。其次,这是在加入了指标像素,而不是值的像素的。你想要类似

pixtot += imageArray[y][x]; 

你做出了与sumc相同的概念错误。

编辑:

还有很多其他的问题,你的代码。如果你想舒展的动态范围,要计算minmax,所有的像素值的最小值和最大值,然后计算每个像素值value = maxshade * (value - min)/(max - min)。这就给了你0如果value==minmaxshade如果value==max的结果像素值。

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

+0

我试过pixtot + = imageArray [r] [c];但我得到了一个索引越界异常....那么你也是什么意思与sumc相同的概念错误?只需添加+ =并将我的变量更改为数组值?pixtot应该将图像中的所有像素相加...不是灰度值 – Ignacious

+0

然后,如果要计算像素的总数,而不是像素的总值,则需要“pixtot ++”(当然,使用乘法的方法较短)。 –

+0

好吧即时通讯开始得到这个东西的工作,但是当我运行增强它将图像完全变成黑色......说实话我不知道如果我有一个函数,正确分组灰度值,如CDF函数..我不是确定如何实现它---我需要它来计算所有的灰度值,例如133,然后总计它们,然后检查它们是否小于或等于该槽中的灰度值并运行我的公式.. – Ignacious