2013-04-25 63 views
0

在我的代码中的某处,我似乎做错了什么,我不知道哪个部分会出错。我已经打印来控制从各种数组中获得的值,并且它似乎匹配。然后当我运行均衡功能(一个la Wikipedia-Histogram Equalization)我的输出图像接近全黑。我试图将this guy's php解释为JavaScript,只是为了测试一些东西,并认为我做了一个体面的工作。但我不是专家。此图像颜色均衡算法中的故障逻辑

的相关部分:

 function imageLoaded(ev) { 
      element = document.getElementById("canvas1"); 
      c = element.getContext("2d"); 

      im = ev.target; // the image 

      // read the width and height of the canvas 
      width = element.width; 
      height = element.height; 

      // stamp the image on the left of the canvas: 
      c.drawImage(im, 0, 0); 
      // get all canvas pixel data 
      imageData = c.getImageData(0, 0, width, height); 

      w2 = width/2; 
      var reds = new Array(); 
      var greens = new Array(); 
      var blues = new Array(); 

      var freqR = new Array(); 
      var freqG = new Array(); 
      var freqB = new Array(); 

      if (imageData){ 

       buildHistograms(reds, greens,blues); 

       buildFrequencies(reds, greens, blues, freqR, freqG, freqB); 

      } 

      var alpha = 255/(w2*height); 

      // run through the image 
      for (y = 0; y < height; y++) { 
       inpos = y * width * 4; // *4 for 4 ints per pixel 
       outpos = inpos + w2 * 4; 
       for (x = 0; x < w2; x++) { 


        //reads pixel data(of img c)to each channel of rgb 
        r = imageData.data[inpos++]; 
        g = imageData.data[inpos++]; 
        b = imageData.data[inpos++]; 
        a = imageData.data[inpos++]; 

        //using histogram eqalization formula: 
        adjR = freqR[r]*alpha; 
        adjG = freqG[g]*alpha; 
        adjB = freqB[b]*alpha; 



      //assigns pixel data of output image 
        imageData.data[outpos++] = adjR; 
        imageData.data[outpos++] = adjG; 
        imageData.data[outpos++] = adjB; 
        imageData.data[outpos++] = a; 
       } 
      } 
      // put pixel data on canvas 
      c.putImageData(imageData, 0,0); 

     } 

     im = new Image(); 
     im.onload = imageLoaded; 
     im.src = "Lenna.png"; 



     function buildHistograms(reds,greens,blues){ 
      //run through image building histogram  
      for (y=0; y < height; y++){ 
       inpos = y * width *4; 
       for (x=0; x < w2; x++){ 
       rd = imageData.data[inpos++]; 
        g = imageData.data[inpos++]; 
        b = imageData.data[inpos++]; 
        a = imageData.data[inpos++]; 
        // Add counts to our histogram arrays for each color. 
        reds.push(rd); 
        greens.push(g); 
        blues.push(b); 
       } 
      } 

      // Sort them by keys into order 
      reds.sort(function(a,b){return a-b}); 
      greens.sort(function(a,b){return a-b}); 
      blues.sort(function(a,b){return a-b}); 


     } 

     function buildFrequencies(reds, greens, blues, freqR, freqG, freqB){ 
     // Build frequency charts for all colors: takes REDS GREENS BLUES from buildHistograms and places them on top of each other accordingly 
      for(i=0; i<=255; i++){ 
       sumR=0; 
       sumG=0; 
       sumB=0; 

       for(j=0; j<= i; j++){ 
        if (reds[j]){sumR+=reds[j];} 
        if (greens[j]){sumG+=greens[j];} 
        if (blues[j]){sumB+=blues[j];} 
       } 

       freqR[i] = sumR; 
       freqG[i] = sumG; 
       freqB[i] = sumB; 

      } 
     } 

任何帮助表示赞赏,感谢。

回答

0

看起来我的构建频率部分是错的。我用这种方式修改它:

var len = reds.length; 


      for (j=0; j < len; j++) { 
        var rCurrVal = reds[j]; 
        var gCurrVal = greens[j]; 
        var bCurrVal = blues[j]; 
        if (freqR.hasOwnProperty(rCurrVal)) { 
         freqR[rCurrVal] += 1; 
        } else { 
         freqR[rCurrVal] = 1; 
        } 
        if (freqG.hasOwnProperty(gCurrVal)) { 
         freqG[gCurrVal] += 1; 
        } else { 
         freqG[gCurrVal] = 1; 
        } 
        if (freqB.hasOwnProperty(bCurrVal)) { 
         freqB[bCurrVal] += 1; 
        } else { 
         freqB[bCurrVal] = 1; 
        } 
      } 


      for (i=0; i<255; i++){ 
       if ($.inArray(i,reds)===-1){freqR[i]=0;} 
       if ($.inArray(i,greens)=== -1){freqG[i]=0;} 
       if ($.inArray(i,blues)=== -1){freqB[i]=0;} 

       if (i>0){ 
        freqR[i]+=freqR[i-1]; 
        freqG[i]+=freqG[i-1]; 
        freqB[i]+=freqB[i-1]; 

       } 
      }