直方图均衡化的实现
直方图均衡化主要看了《数字图像处理》和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类型了,跟踪了好久才发现这个问题的,比较囧。