0

私のコードのどこかで何か間違ったことをしているようで、どの部分が間違っているのかわかりません。さまざまな配列から取得した値をコンソールに出力しましたが、一致しているようです。次に、イコライゼーション関数 (ウィキペディア ヒストグラム イコライゼーション) を実行すると、出力イメージは真っ黒に近くなります。私はこの男の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;

            }
        }

どんな助けでも大歓迎です、ありがとう。

4

1 に答える 1

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];

                }
            }
于 2013-04-25T16:55:32.187 に答える