直方图均衡化的实现

 

直方图均衡化主要看了《数字图像处理》和wiki百科,我觉得wiki百科更好懂一些

//直方图均衡化,增强对比度

static public Image<Gray, Byte> histogramequalization(Image<Gray, Byte> input)
{
var result = input.CopyBlank();

int [] graylevel = new int[256];
byte [] newgray = new byte[256];
int cdfmin;

//求每个灰度级上的像素个数,结果存储在graylevel数组中
for(int i=0;i<input.Width;i++)
{
for(int j=0;j<input.Height;j++)
{
graylevel[input.Data[j, i, 0]]++;
}
}


//求出每个灰度级对应的累积分布,也就是转换后的像素值
for (int i = 0; i <= 255; i++)
{
int sum=0;

//求得累积分布
for (int j = 0; j <= i; j++)
{
sum = sum + graylevel[j];
}

//求累积分布最小的灰度级
cdfmin = input.Width * input.Height;
for (int j = 0; j <= 255; j++)
{
if (graylevel[j] > 0)
{
if (cdfmin > graylevel[j])
{
cdfmin = graylevel[j];
}
}

}

//求新的灰度值,存入到newgray
//newgray[i] = (byte)((double)(sum-cdfmin) *255/ (input.Width * input.Height-cdfmin) );
newgray[i] = (byte)((double)(sum) * 255 / (input.Width * input.Height));
}


//将原图像中的每个点替换成新的灰度
for (int i = 0; i < input.Width; i++)
{
for (int j = 0; j < input.Height; j++)
{

result.Data[j,i,0]=newgray[input.Data[j,i,0]];

}
}

return result;
}


}
}

 

写这个函数的时候遇到一些问题:

1、EmguCV出问题了,我安装latex的时候,自动把path路径改了,所以出了问题。

2、在写函数的时候把graylevel定义成byte类型了,跟踪了好久才发现这个问题的,比较囧。

posted @ 2014-01-08 12:26  老笨wjr  阅读(268)  评论(0编辑  收藏  举报