直方圖均衡化

概念:通過拉伸像素強度分布范圍來增強圖像對比度的一種方法,如下圖,將左邊直方圖的中間的一些強度值拉伸,對綠色橢圓部分應用均衡化后得到右邊的直方圖,要想把左邊的直方圖映射到另一個直方圖,需使用一個累計分布函數

直方圖拉伸.png

步驟:
1、統計像素灰度的個數,范圍在0-255之間,所以數組長度可以取266
2、計算像素灰度密度
3、使用累積分布函數計算右邊的直方圖
4、使用最大值255進行歸一化
5、對原圖像映射賦值灰度值

代碼

typedef struct
{
    int mSize;//圖像大小
    int mChannels;//通道數
    int mDepth;//
    int mType;
    int mCol;
    int mRow;
    unsigned char *mData;
} V_Image;

void Histogram_equalization(V_Image** img)
{
    float *pixelNum=(float *) calloc(256,sizeof(float));
    float *pixelCumu=(float *) calloc(256,sizeof(float));
    int index,row,col;
    //初始化數組為0
    for(index=0; index<256; index++)
    {
        pixelNum[index]=0;
        pixelCumu[index]=0;
    }
    //統計像素灰度個數
    for(row=0; row<(*img)->mRow; row++ )
    {
        for(col=0; col<(*img)->mCol; col++ )
        {
            pixelNum[(*img)->mData[row*((*img)->mCol)+col]+1]++;
        }
    }

    //計算像素灰度密度
    for(index=0; index<256; index++)
    {
        pixelNum[index]=pixelNum[index]/(((*img)->mRow)*((*img)->mCol)*1);
    }

    //計算累計直方圖分布
    for(index=0; index<256; index++)
    {
        if(index==0)
            pixelCumu[index]=pixelNum[index];
        else
            pixelCumu[index]=pixelCumu[index-1]+pixelNum[index];
    }
    //累計分布取整
    for(index=0; index<256; index++)
    {
        pixelCumu[index]=ceil(255*pixelCumu[index]);
    }
    //對圖像灰度值均衡化
    for(row=0; row<(*img)->mRow; row++ )
    {
        for(col=0; col<(*img)->mCol; col++ )
        {
            (*img)->mData[row*((*img)->mCol)+col]=pixelCumu[(*img)->mData[row*((*img)->mCol)+col]];
        }
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容