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