介绍

直方图均衡化:我们把一张图片对应的rgb像素点分成3个(对应rgb)256(0-255)等级,并且将等级绘制为直方图,我们把直方图变得分布均匀,这就是直方图均衡化。

这样的图片往往具有高对比度,我使用js语言实现了该算法。

代码解释

    average: function (imgData) {
        // imgData : 图片数据
        var data = imgData.data, w = imgData.width, h = imgData.height;
        var histogramR = [],
            histogramG = [],
            histogramB = [];
        for(var i=0; i<data.length; i+=4){
            // 统计rgb等级数目
            histogramR[data[i]] = histogramR[data[i]]+1 || 1;
            histogramG[data[i+1]] = histogramG[data[i+1]]+1 || 1;
            histogramB[data[i+2]] = histogramB[data[i+2]]+1 || 1;
        }
        //直方图均衡化
        function getRate(grayHis,total,index) {
            var s = 0;
            for(var i=0;i<index;i++){
                var v = grayHis[i]||0;
                s+=(v/total);
            }
            return Math.floor(s*255);
        }
        var total = w*h,
            newHisR = [],
            newHisG = [],
            newHisB = [];
        for(i=0; i<256; i++){//直方图均衡化
            newHisR[i] = getRate(histogramR,total,i);
            newHisG[i] = getRate(histogramG,total,i);
            newHisB[i] = getRate(histogramB,total,i);
        }
        console.log([histogramR,histogramG,histogramB],[newHisR,newHisG,newHisB]);
        for(i=0; i<h; i++){
            for(var j=0; j<w; j++){
                var v = (i*w+j)<<2;
                data[v] = newHisR[data[v]];
                data[v+1]=newHisG[data[v+1]];
                data[v+1]=newHisB[data[v+2]];
            }
        }
        return imgData;
    }

查看控制台,左边为原图局部数据,右边为执行算法后的数据,明显后者分布更加平稳。 img

直观的感觉如下 img

参考资料