学习DIP第38天
转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不满意。有些网站转载了我的博文,很开心的是自己写的东西被更多人看到了,但不开心的是这段话被去掉了,也没标明转载来源,虽然这并没有版权保护,但感觉还是不太好,出于尊重文章作者的劳动,转载请标明出处!!!!
文章代码已托管,欢迎共同开发:https://github.com/Tony-Tan/DIPpro
/********************************************************************************************
直方图基本操作
*******************************************************************************************/
void InitMappingTable(void * arry,int size,int Data_type){
if(Data_type==TABLE_INT)
for(int i=0;i<size;i++)
((int*)arry)[i]=0;
else if(Data_type==TABLE_CHAR)
for(int i=0;i<size;i++)
((char*)arry)[i]=0;
else if(Data_type==TABLE_DOUBLE)
for(int i=0;i<size;i++)
((double*)arry)[i]=0;
}
void InitHistogram(int *hist){
for(int i=0;i<GRAY_LEVEL;i++)
hist[i]=0;
}
void setHistogram(double *src,int *hist,int width,int height){
InitHistogram(hist);
for(int j=0;j<height;j++)
for(int i=0;i<width;i++){
int tempv=src[j*width+i];
hist[tempv]++;
}
}
int findHistogramMax(int *hist){
for(int i=GRAY_LEVEL-1;i>=0;i--){
if(hist[i]!=0)
return i;
}
return -1;
}
int findHistogramMin(int *hist){
for(int i=0;i<GRAY_LEVEL;i++){
if(hist[i]!=0)
return i;
}
return -1;
}
void fillMaptable(double * map){
for(int i=1;i<GRAY_LEVEL;i++){
if(map[i]==0)
map[i]=map[i-1];
}
}
/********************************************************************************************
直方图均衡
*******************************************************************************************/
//均衡直方图,将原图直方图,经过公式得到目标直方图
void EqualizationHist(int *src_hist,double *dst_map){
int temphist[GRAY_LEVEL];
InitHistogram(temphist);
int max=findHistogramMax(src_hist);
int min=findHistogramMin(src_hist);
temphist[min]=src_hist[min];
for(int i=min+1;i<=max;i++)
temphist[i]=temphist[i-1]+src_hist[i];
for(int i=min;i<=max;i++)
temphist[i]-=temphist[min];
int total=temphist[max];
for(int i=min;i<=max;i++){
dst_map[i]=((double)GRAY_LEVEL-1.0)*temphist[i]/total;
}
}
//直方图均很,用输入图像得到输出图像
void HistogramEqualization(double *src,double *dst,int width,int height){
int hist[GRAY_LEVEL];
setHistogram(src, hist, width, height);
double GrayMappingTable[GRAY_LEVEL];
InitMappingTable(GrayMappingTable,GRAY_LEVEL,TABLE_DOUBLE);
EqualizationHist(hist, GrayMappingTable);
for(int i=0;i<width;i++)
for(int j=0;j<height;j++)
dst[j*width+i]=GrayMappingTable[(int)src[j*width+i]];
}灰度图像--图像增强 直方图均衡化(Histogram equalization)
原文地址:http://blog.csdn.net/tonyshengtan/article/details/43448787