图像对比度增强的方法可以分成两类:一类是直接对比度增强方法;另一类是间接对比度增强方法。

直方图拉伸和直方图均衡化是两种最常见的间接对比度增强方法。

直方图拉伸是通过对比度拉伸对直方图进行调整,从而“扩大”前景和背景灰度的差别,以达到增强对比度的目的,这种方法可以利用线性或非线性的方法来实现;

直方图均衡化则通过使用累积函数对灰度值进行“调整”以实现对比度的增强。

1.直方图拉伸

就是扩大将图像灰度的域值的一个过程,但是经常是基于灰度图像进行处理,以前在MATlab上对比度增强调用直方图函数就几行代码,但都是灰度图像上处理,需要在彩色图像进行处理,看别人的思想是从RGB-YUV-RGB的过程,在YUV空间增强再转回来,我跟着原理写代码,出了很多问题。详见http://blog.csdn.net/abcjennifer/article/details/7428737

/*
*@Function: Color image contrast enhancement
*@Date: 2012-4-5
*@Author: 张睿卿
*/ int ImageStretchByHistogram(IplImage *src1,IplImage *dst1)
/*************************************************
Function: 通过直方图变换进行图像增强,将图像灰度的域值拉伸到0-255
src1: 单通道灰度图像
dst1: 同样大小的单通道灰度图像
*************************************************/
{
assert(src1->width==dst1->width);
double p[],p1[],num[]; memset(p,,sizeof(p));
memset(p1,,sizeof(p1));
memset(num,,sizeof(num));
int height=src1->height;
int width=src1->width;
long wMulh = height * width; //statistics
for(int x=;x<src1->width;x++)
{
for(int y=;y<src1-> height;y++){
uchar v=((uchar*)(src1->imageData + src1->widthStep*y))[x];
num[v]++;
}
}
//calculate probability
for(int i=;i<;i++)
{
p[i]=num[i]/wMulh;
} //p1[i]=sum(p[j]); j<=i;
for(int i=;i<;i++)
{
for(int k=;k<=i;k++)
p1[i]+=p[k];
} // histogram transformation
for(int x=;x<src1->width;x++)
{
for(int y=;y<src1-> height;y++){
uchar v=((uchar*)(src1->imageData + src1->widthStep*y))[x];
((uchar*)(dst1->imageData + dst1->widthStep*y))[x]= p1[v]*+0.5;
}
}
return ;
} void CCVMFCView::OnYcbcrY()
{
IplImage* Y = cvCreateImage(cvGetSize(workImg),IPL_DEPTH_8U,);
IplImage* Cb= cvCreateImage(cvGetSize(workImg),IPL_DEPTH_8U,);
IplImage* Cr = cvCreateImage(cvGetSize(workImg),IPL_DEPTH_8U,);
IplImage* Compile_YCbCr= cvCreateImage(cvGetSize(workImg),IPL_DEPTH_8U,);
IplImage* dst1=cvCreateImage(cvGetSize(workImg),IPL_DEPTH_8U,); int i;
cvCvtColor(workImg,dst1,CV_BGR2YCrCb);
cvSplit(dst1,Y,Cb,Cr,); ImageStretchByHistogram(Y,dst1); for(int x=;x<workImg->height;x++)
{
for(int y=;y<workImg->width;y++)
{
CvMat* cur=cvCreateMat(,,CV_32F);
cvmSet(cur,,,((uchar*)(dst1->imageData+x*dst1->widthStep))[y]);
cvmSet(cur,,,((uchar*)(Cb->imageData+x*Cb->widthStep))[y]);
cvmSet(cur,,,((uchar*)(Cr->imageData+x*Cr->widthStep))[y]); for(i=;i<;i++)
{
double xx=cvmGet(cur,i,);
((uchar*)Compile_YCbCr->imageData+x*Compile_YCbCr->widthStep)[y*+i]=xx;
}
}
} cvCvtColor(Compile_YCbCr,workImg,CV_YCrCb2BGR);
m_ImageType=;
Invalidate();
}

其中int ImageStretchByHistogram(IplImage *src1,IplImage *dst1)  是可以运行的,实现了灰度图像增强;

void CCVMFCView::OnYcbcrY()  我处理不好,只好呼唤睿卿 本人了。附上一个基于opencv已经实现灰度图像增强的代码.http://blog.csdn.net/zhaiwenjuan/article/details/6596011

#include "stdafx.h" 

#include "cv.h"
#include "highgui.h"
#include
#include
int ImageStretchByHistogram(IplImage *src,IplImage *dst); int _tmain(int argc, _TCHAR* argv[])
{
IplImage * pImg;
pImg=cvLoadImage("c:/lena.jpg",-); //创建一个灰度图像
IplImage* GrayImage = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, );
IplImage* dstGrayImage = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, );
cvCvtColor(pImg, GrayImage, CV_BGR2GRAY);
ImageStretchByHistogram(GrayImage,dstGrayImage); cvNamedWindow( "dstGrayImage", ); //创建窗口
cvNamedWindow( "GrayImage", ); //创建窗口
cvShowImage( "dstGrayImage", dstGrayImage ); //显示图像
cvShowImage( "GrayImage", GrayImage ); //显示图像
cvWaitKey(); //等待按键 cvDestroyWindow( "dstGrayImage" );//销毁窗口
cvDestroyWindow( "GrayImage" );//销毁窗口
cvReleaseImage( &pImg ); //释放图像
cvReleaseImage( &GrayImage ); //释放图像
cvReleaseImage( &dstGrayImage ); //释放图像 return ;
} int ImageStretchByHistogram(IplImage *src,IplImage *dst)
/*************************************************
Function:
Description: 因为摄像头图像质量差,需要根据直方图进行图像增强,
将图像灰度的域值拉伸到0-255
Calls:
Called By:
Input: 单通道灰度图像
Output: 同样大小的单通道灰度图像
Return:
Others: http://www.xiaozhou.net/ReadNews.asp?NewsID=771
DATE: 2007-1-5
*************************************************/
{
//p[]存放图像各个灰度级的出现概率;
//p1[]存放各个灰度级之前的概率和,用于直方图变换;
//num[]存放图象各个灰度级出现的次数; assert(src->width==dst->width);
float p[],p1[],num[];
//清空三个数组
memset(p,,sizeof(p));
memset(p1,,sizeof(p1));
memset(num,,sizeof(num)); int height=src->height;
int width=src->width;
long wMulh = height * width; //求存放图象各个灰度级出现的次数
// to do use openmp
for(int x=;x {
for(int y=;y {
uchar v=((uchar*)(src->imageData + src->widthStep*y))[x];
num[v]++;
}
} //求存放图像各个灰度级的出现概率
for(int i=;i<;i++)
{
p[i]=num[i]/wMulh;
} //求存放各个灰度级之前的概率和
for(int i=;i<;i++)
{
for(int k=;k<=i;k++)
p1[i]+=p[k];
} //直方图变换
// to do use openmp
for(int x=;x {
for(int y=;y {
uchar v=((uchar*)(src->imageData + src->widthStep*y))[x];
((uchar*)(dst->imageData + dst->widthStep*y))[x]= p1[v]*+0.5;
}
} return ; }

2.既然直方图拉伸这条路走不通,只好试试,另一条,直方图均衡化了,还好我比较熟。

//图像增强- 彩色直方图均衡化
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#include"opencv2/imgproc/imgproc.hpp" using namespace std;
//彩色图像的直方图均衡化
IplImage* EqualizeHistColorImage(IplImage *pImage)
{
IplImage *pEquaImage = cvCreateImage(cvGetSize(pImage), pImage->depth, ); // 原图像分成各通道后再均衡化,最后合并即彩色图像的直方图均衡化
const int MAX_CHANNEL = ;
IplImage *pImageChannel[MAX_CHANNEL] = {NULL}; int i;
for (i = ; i < pImage->nChannels; i++)
pImageChannel[i] = cvCreateImage(cvGetSize(pImage), pImage->depth, ); cvSplit(pImage, pImageChannel[], pImageChannel[], pImageChannel[], pImageChannel[]); for (i = ; i < pImage->nChannels; i++)
cvEqualizeHist(pImageChannel[i], pImageChannel[i]); cvMerge(pImageChannel[], pImageChannel[], pImageChannel[], pImageChannel[], pEquaImage); for (i = ; i < pImage->nChannels; i++)
cvReleaseImage(&pImageChannel[i]); return pEquaImage;
}
int main( int argc, char** argv )
{
const char *pstrWindowsSrcTitle = "原图";
const char *pstrWindowsHisEquaTitle = "直方图均衡化后"; // 从文件中加载原图
IplImage *pSrcImage = cvLoadImage("lena.jpg", CV_LOAD_IMAGE_UNCHANGED);
IplImage *pHisEquaImage = EqualizeHistColorImage(pSrcImage); cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE);
cvNamedWindow(pstrWindowsHisEquaTitle, CV_WINDOW_AUTOSIZE);
cvShowImage(pstrWindowsSrcTitle, pSrcImage);
cvShowImage(pstrWindowsHisEquaTitle, pHisEquaImage); cvWaitKey(); cvDestroyWindow(pstrWindowsSrcTitle);
cvDestroyWindow(pstrWindowsHisEquaTitle);
cvReleaseImage(&pSrcImage);
cvReleaseImage(&pHisEquaImage);
return ;
}

opencv----彩色图像对比度增强的更多相关文章

  1. (二)OpenCV-Python学习—对比度增强

    ·对于部分图像,会出现整体较暗或较亮的情况,这是由于图片的灰度值范围较小,即对比度低.实际应用中,通过绘制图片的灰度直方图,可以很明显的判断图片的灰度值分布,区分其对比度高低.对于对比度较低的图片,可 ...

  2. ISP图像调试工程师——对比度增强(熟悉图像预处理和后处理技术)

    经典对比度增强算法: http://blog.csdn.net/ebowtang/article/details/38236441

  3. opencv —— equalizeHist 直方图均衡化实现对比度增强

    直方图均匀化简介 从这张未经处理的灰度图可以看出,其灰度集中在非常小的一个范围内.这就导致了图片的强弱对比不强烈. 直方图均衡化的目的,就是把原始的直方图变换为在整个灰度范围(0~255)内均匀分布的 ...

  4. Opencv——彩色图像灰度化的三种算法

    为了加快处理速度在图像处理算法中,往往需要把彩色图像转换为灰度图像.24为彩色图像每个像素用3个字节表示,每个字节对应着RGB分量的亮度. 当RGB分量值不同时,表现为彩色图像:当RGB分量相同时,变 ...

  5. SSE图像算法优化系列十九:一种局部Gamma校正对比度增强算法及其SSE优化。

    这是一篇2010年比较古老的文章了,是在QQ群里一位群友提到的,无聊下载看了下,其实也没有啥高深的理论,抽空实现了下,虽然不高大上,还是花了点时间和心思优化了代码,既然这样,就顺便分享下优化的思路和经 ...

  6. one-hot句子向量 对比度增强

    one-hot映射时,如何选取TOPN作为每一个词承载的word2vec的信息? 我们已经知道,对于这种例子: 怎么绑定手机号? 怎么关联手机号? 他们的相似度取决于绑定和关联这两个词如何相似. #取 ...

  7. 对比度增强(二):直方图正规划与伽马变换 cv.normal()函数使用及原理

    直方图正规化: 图像为I,宽为W,高为H,I(r,c)代表I的第r行第c列的灰度值:输出图像记为O,为使得输出图像的灰度值在[Omin,Omax]范围里,可用如下公式:                 ...

  8. OpenCV——彩色图像转成灰度图像

    // PS_Algorithm.h #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED #include <iostr ...

  9. OpenCV彩色图像转灰度图

    核心函数cvSplit(). #include<cv.h> #include<highgui.h> int main(int argc, char** argv) { IplI ...

随机推荐

  1. hdu_5314_Happy King(树的点分治)

    题目链接:hdu_5314_Happy King 题意: 给出一颗n个结点的树,点上有权值: 求点对(x,y)满足x!=y且x到y的路径上最大值与最小值的差<=D: 题解: 还是树的点分治,在统 ...

  2. Webpack入门——使用Webpack打包Angular项目的一个例子

    2016.1.22,对大多数人来说,这是一个非常平常的日子,但这却是我决定在博客园写博客的日子.虽然注册博客园的博客已有4年8个月,却一直没有动手写过一篇博客,原因是觉得自己水平不行,写不出好东西,所 ...

  3. javascript动画效果之任意效果任意值

    通过学习,我发现当同一个ul下的li标签如果想要不同的效果,那怎么办? 比如第一个li是width变化,第二个li为透明度(opacity)变化,而opacity的值和width的值类型不同,不能通用 ...

  4. mysql建表设置两个默认CURRENT_TIMESTAMP的技巧

    转载:http://blog.163.com/user_zhaopeng/blog/static/166022708201252323942430/   业务场景: 例如用户表,我们需要建一个字段是创 ...

  5. 进入BIOS SHELL DUMP 命令

    LINUX系统 进入SHELL 输入命令 fs1: or fs0: 就进入了U盘目录 然后输入 ACPIRW.efi  -d -s dsdt.bat 就会产生结果到U盘 ——————————————— ...

  6. 转 精选37条强大的常用linux shell命令组合

    1 删除0字节文件 find . -type f -size 0 -exec rm -rf {} \; find . type f -size 0 -delete 2 查看进程,按内存从大到小排列 p ...

  7. 《Windows驱动开发技术详解》之IRP的同步

    应用程序对设备的同步异步操作: 大部分IRP都是由应用程序的Win32 API函数发起的.这些Win32 API本身就支持同步和异步操作.例如,ReadFile.WriteFile和DeviceIoC ...

  8. mysql 1053错误,无法启动的解决方法

    mysql 1053错误,无法启动的解决方法 windows2003服务器中,服务器重启后Mysql却没有启动,手动启动服务时提示1053错误. 尝试了以下方法,终于解决. 1.在DOS命令行使用 第 ...

  9. 第十节,While循环和for循环

    While循环 While循环,是一个循环加判断的组合,满足判断条件返回 真(True)开始循环代码块,不满足判断条件返回 假()不循环 格式: While 条件: 代码块 注意:在While循环里如 ...

  10. Lambda表达式介绍

    Lambda表达式实际上是一个匿名函数.它包含表达式和语句,常用于创建委托或表达式目录树类型.所有Lambda表达式都是用Lambda运算符----------  =>,该运算符读为" ...