实验二(1)RGB直方图均衡化 #include <cv.h> #include <highgui.h> using namespace cv; int main() { int i; IplImage *pImageChannel[4] = { 0, 0, 0, 0 }; IplImage *pSrcImage = cvLoadImage( "lena.jpg", 1 ) ; IplImage *pImage = cvCreateImage(cvGetSize(pSrcImage), pSrcImage->depth, pSrcImage->nChannels); if( pSrcImage ) { for( i = 0; i < pSrcImage->nChannels; i++ ) { pImageChannel[i] = cvCreateImage( cvGetSize(pSrcImage), pSrcImage->depth, 1 ); } // 信道分离 cvSplit( pSrcImage, pImageChannel[0], pImageChannel[1], pImageChannel[2], pImageChannel[3] ); for( i = 0; i < pImage->nChannels; i++ ) { // 直方图均衡化 cvEqualizeHist( pImageChannel[i], pImageChannel[i] ); } // 信道组合 cvMerge( pImageChannel[0], pImageChannel[1], pImageChannel[2], pImageChannel[3], pImage ); cvNamedWindow("lena"); cvShowImage("lena",pImage); // 释放资源 cvWaitKey(0); cvDestroyWindow("lena"); cvReleaseImage( pImageChannel ); cvReleaseImage( &pImage ); } } /* Split 分割多通道数组成几个单通道数组或者从数组中提取一个通道 void cvSplit( const CvArr* src, CvArr* dst0, CvArr* dst1,CvArr* dst2, CvArr* dst3 );#define cvCvtPixToPlane cvSplit src 原数组. dst0...dst3 目标通道 函数 cvSplit 分割多通道数组成分离的单通道数组d。可获得两种操作模式 . 如果原数组有N通道且前N输出数组非NULL, 所有的通道都会被从原数组中提取,如果前N个通道只有一个通道非NULL函数只提取该指定通道,否则会产生一个错误,馀下的通道(超过前N个通道的以上的)必须被设置成NULL,对于设置了COI的IplImage 结使用cvCopy 也可以从图像中提取单通道。 //EqualizeHist 灰度图象直方图均衡化 void cvEqualizeHist( const CvArr* src, CvArr* dst ); src 输入的 8-比特 单信道图像 dst 输出的图像与输入图像大小与数据类型相同 函数 cvEqualizeHist 采用如下法则对输入图像进行直方图均衡化: 1计算输入图像的直方图 H 2直方图归一化,因此直方块和为255 3计算直方图积分: 4采用H'作为查询表:dst(x,y)=H'(src(x,y))进行图像变换。 该方法归一化图像亮度和增强对比度。 */