您的位置:首页 > 运维架构

OpenCV学习之直方图均衡化

2017-08-04 13:47 169 查看
直方图均衡化

如果一副图像的像素占有很多的灰度级而且分布均匀,那么这样的图像往往有高对比度和多变的灰度色调。直方图均衡化就是一种能仅靠输入图像直方图信息自动达到这种效果的变换函数。它的基本思想是对图像中像素个数多的灰度级进行展宽,而对图像中像素个数少的灰度进行压缩,从而扩展像原取值的动态范围,提高了对比度和灰度色调的变化,使图像更加清晰。

//直方图均衡化
#include "cv.h"
#include "highgui.h"
int main(int argc, char** argv)
{
int i;
IplImage* src = cvLoadImage("Lena.tiff", 1);
IplImage* imgChannel[4] = { 0, 0, 0, 0 };
IplImage* dst = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 3);

if (src)
{
for (i = 0; i < src->nChannels; i++)
{
imgChannel[i] = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);  //要求单通道图像才能直方图均衡化
}
//通道分离
cvSplit(src, imgChannel[0], imgChannel[1], imgChannel[2], imgChannel[3]);//BGRA
for (i = 0; i < dst->nChannels; i++)
{
//直方图均衡化,原始图像和目标图像必须是单通道
cvEqualizeHist(imgChannel[i], imgChannel[i]);
}

//通道组合
cvMerge(imgChannel[0], imgChannel[1], imgChannel[2], imgChannel[3], dst);
cvNamedWindow("src", 1);
cvShowImage("src", src);
cvNamedWindow("Equalize", 1);
cvShowImage("Equalize", dst);

cvWaitKey(0);
//释放资源
for (i = 0; i < src->nChannels; i++)
{
if (imgChannel[i])
{
cvReleaseImage(&imgChannel[i]);
//imgChannel[i] = 0;
}
}
cvReleaseImage(&dst);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息