直方图均衡化原理及编码实现

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
0
归一化:
概率密度函数为:
p() =
概率分布函数为:
P() =
()
0
1
∫ ()
A0 0
设变换:
s = T()
为斜率有限的非减连续可微函数,它将输入图像A(, )转换为输出图像
B(, )。
输入图像的直方图为H ()与输出图像的直方图为H ()之间的关系可由如
所以:

s = T() =
∫ () = C()
0 0
其中
1
P() =
∫ ()
A0 0
为了使 s 的取值范围为[0, ]:
C=L
由此得,使直方图均衡化的灰度变换函数是概率分布函数。
在离散情况下
s = T(r) = ( )
其中
k
( ) = ∑
=0


为图像中总像素个数。
编码实现(OpenCV):
1. 计算图像直方图,并归一化
2. 计算变换函数 s = T()
3. 根据 s = T() 计算新的灰度值 s
OpenCV 源码:
/**********************************************************/
CvHistogram* hist = cvCreateHist(1, sizes, CV_HIST_ARRAY);
cvCalcHist(&dst, hist);
cvNormalizeHist(hist, 1);
//归一化
// 2.计算变换函数 s=T(r)
double val = 0.0;
uchar T[DEPTH] = {0};
plotHist1D(src, srcHistImg, CV_RGB(100, 100, 100));
// 画直方图
cvNamedWindow("srcHist");
cvShowImage("srcHist", srcHistImg);
// 1.计算直方图
int bins = DEPTH;
int sizes[] = {bins};
#define DEPTH 256
int main(void)
{
IplImage *src = cvLoadImage("D:\\picture\\素材\\9.jpg",
CV_LOAD_IMAGE_GRAYSCALE);
IplImage *dst = cvCloneImage(src);
// 显示原始图片
直方图均衡化
Author:Mark
Date:6.4.2011
原理:
直方图均衡化是通过灰度变换将一幅图像转换为另一幅具有均衡直方图,即
在每个灰度级上都具有相同的象素点数的过程。
对图像A(, ),灰度范围为[0, ],其图像的直方图为H (),图像 A 的总像
素点数为:

A0 = ∫ ()
for(int index = 0; index < DEPTH; index++)
{
val += cvQueryHistValue_1D(hist, index);
T[index] = (uchar)(val*255);
}
// 3.灰度变换
uchar* pPixelLine = NULL;
for(int x = 0; x < dst->height; x++)
下过程导出
根据直方图的含义,经过灰度变换后对应的小面积元相等
() = ()
解得:
() ()
=
=
/ ′()
其中:
T ′ () = ds/dr
所以,当 的分子分母只差一个比例常数时, 就恒定。即,

T ′ () =
()
0
cvNamedWindow("src");
cvShowImage("src", src);
// 原始图像直方图
IplImage *srcHistImg = cvCreateImage(cvSize(256, 200), 8, 3);
cvSet(srcHistImg, CV_RGB(255, 255, 255));
cvNamedWindow("dst");
cvShowImage("dst", dst);
// 直方图均衡化后图像的直方图
IplImage *dstHistImg = cvCreateImage(cvSize(256, 200), 8, 3);
cvSet(dstHistImg, CV_RGB(255, 255, 255));
cvReleaseImage(&srcHistImg);
cvReleaseImage(&dstHistImg);
cvReleaseHist(&hist);
cvDestroyAllWindows();
return 0;
}
原始图片:
直方图:
直方图均衡化后结果:
直方图:
// 画直方图
//列
{
pPixelLine = (uchar *)(dst->imageData + x*dst->widthStep);
for(int y = 0; y < dst->width; y++)
{
pPixelLine[y] = T[pPixelLine[y]];
}
//行
}
// 显示直方图均衡化后图像
// 说明:直方图参考例程
// 作者:Mark
// 时间:6.4.2011
/**********************************************************/
#include <cv.h>
#include <highgui.h>
#include "histogram.h"
plotHist1D(dst, dstHistImg, CV_RGB(100, 100, 100)百度文库;
cvNamedWindow("dstHist");
cvShowImage("dstHist", dstHistImg);
cvWaitKey(0);
cvReleaseImage(&src);
cvReleaseImage(&dst);
相关文档
最新文档