在图像处理学习中会涉及到直方图,直方图很好地表现了图像的灰度信息;同时我们注意到在暗图像中,直方图的分量集中在灰度级的低端;亮图像的灰度值集中在直方图灰度值的高端;低对比度的图像有较窄的直方图,并集中于直方图的中间部分;高对比度的图像中直方图的分量覆盖很宽的范围,而且像素的分布没有太不均匀,只能看到少量垂线比其他高许多。通过图像增强可以有效地减弱这些缺陷
图 1
图 2
如图1,细胞表面的一些地方较为模糊,图2,整体图片偏亮
来看先来看第一张图的直方分布图:
分量集中在灰度值较高地地方。
第二张图的直方分布图:
直方图
来看一下两张图片的直方分布图片:
下面两张是经图像增强处理图片:
图 3
可以明显看到图片比之前的要清晰;
再来看其直方分布图:
图 4
人脸的直方分布图:
首先,我们设连续的灰度r和z,同时令
同时我们设一个随机变量s:
其中w为积分变量;
接着定义随机变量z:
其中t为积分变量;
由这两个公式可得
当输入函数
在实际中图像的直方图灰度分量是离散的,处理离散量时,只求得到一个近似的直方图:
其中MN是图像总的像素点,
接下来上代码:
#include<opencv2\opencv.hpp>
#include<opencv\cv.h>
#include<opencv2\core\core.hpp>
#include<stdlib.h>
#include<math.h>
using namespace cv;
using namespace std;
void enhance(Mat src, Mat dir)
{
FILE *fp;
fp = fopen("src.txt", "w");
int srcpixel[256] = { 0 };
int dirpixel[256] = { 0 };
int p;//temp
double srcprob[256];
double dirprob[256] = {0};
double zhong = src.rows*src.cols;
for (int i = 0; i < src.rows; i++)
{
for (int j = 0; j < src.cols; j++)
{
p = src.at<uchar>(i, j);
srcpixel[p]++;
}
}
for (int i = 0; i < 255; i++)
{
srcprob[i] = srcpixel[i]/ zhong;
fprintf(fp, "%lf ", srcprob[i]);
printf("srcpixel[%d]=%f\n", i, srcprob[i]);
}
double o=0;
dirprob[0] = srcprob[0];
for (int i = 1; i < 256; i++)
{
dirprob[i] = dirprob[i - 1] + srcprob[i];
}
for (int i = 0; i < src.rows; i++)
{
for (int j = 0; j < src.cols; j++)
{
p = src.at<uchar>(i, j);
dir.at<uchar>(i, j) = 255 * dirprob[p];
}
}
fclose(fp);
// srcpixel[256] = { 0 };
fp = fopen("dir.txt", "w");
for (int i = 0; i < src.rows; i++)
{
for (int j = 0; j < src.cols; j++)
{
p = dir.at<uchar>(i, j);
dirpixel[p]++;
}
}
for (int i = 0; i < 255; i++)
{
srcprob[i] =dirpixel[i] / zhong;
fprintf(fp, "%lf ", srcprob[i]);
printf("srcpixel[%d]=%f\n", i, srcprob[i]);
}
fclose(fp);
}
int main(int argc,char *argv[])
{
Mat src= imread("3.jpg",0);
Mat dir(src.rows,src.cols,CV_8UC1);
imshow("src", src);
//cvtColor(pic, pic, CV_BGR2GRAY);
//imshow("12", pic);
enhance(src, dir);
imshow("drt", dir);
imwrite("22.jpg", dir);
waitKey();
}
这里 src,dir表示原来图像和目标图像,先遍历出各灰度值的像素个数,计算出概率prob,通过公式转化成目标图像的概率
fprintf将灰度值概率记下,方便用openGL或excel画出直方图进行比对
;
笔者能力有限,如有不足或错误欢迎指出