打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
【OpenCV入门指南】第十篇 彩色直方图均衡化

  上一篇《OpenCV第十篇灰度直方图均衡化》介绍了灰度图像的直方图均衡化,实际生活中,肯定还是彩色图像用的最多,因此本篇介绍对彩色图像进行直方图均衡化。这样可以让大家直方图均衡化对图像增强的效果有个直观的印象。

  OpenCV中,彩色的图像其实是用一个多通道数组来存储的,每个单通道数组中的元素的取值范围都是0255。这与灰度图中像素的变化范围是相同的。因此对彩色图像进行直方图均衡化只要先将彩色图像分解成若干通道,然后这些通道分别进行直方图均衡化,最后合并所有通道即可。下面介绍下二个主要函数cvSplit()cvMerge()

 

一.cvSplit

函数功能:分割多通道数组成几个单通道数组或者从数组中提取一个通道。

函数原型:

/* Splits a multi-channel array into the set of single-channel arrays or

   extracts particular [color] plane */

CVAPI(voidcvSplit(

  const CvArr* src,

  CvArr* dst0,

  CvArr* dst1,

  CvArr* dst2,

  CvArr* dst3

);

参数说明:

第一个参数表示输入的多通道数组即输入图像。

第二,三,四,五个参数分别表示输出的单通道数组。

 

二.cvMerge

函数功能:分割多通道数组成几个单通道数组或者从数组中提取一个通道。

函数原型:

/* Merges a set of single-channel arrays into the single multi-channel array

   or inserts one particular [color] plane to the array */

CVAPI(voidcvMerge(

  const CvArr* src0,

  const CvArr* src1,

  const CvArr* src2,

  const CvArr* src3,

  CvArr* dst

);

参数说明:

第一,二,三,四个参数表示输入的单通道数组。

第五个参数分别表示合并后的多通道数组即输出图像。

 

下面给出完整的代码:

[cpp] view plain copy
  1. //图像增强- 彩色直方图均衡化  
  2. //By MoreWindows (http://blog.csdn.net/MoreWindows)  
  3. #include <opencv2/opencv.hpp>  
  4. using namespace std;  
  5. #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")  
  6. //彩色图像的直方图均衡化  
  7. IplImage* EqualizeHistColorImage(IplImage *pImage)  
  8. {  
  9.     IplImage *pEquaImage = cvCreateImage(cvGetSize(pImage), pImage->depth, 3);  
  10.       
  11.     // 原图像分成各通道后再均衡化,最后合并即彩色图像的直方图均衡化  
  12.     const int MAX_CHANNEL = 4;  
  13.     IplImage *pImageChannel[MAX_CHANNEL] = {NULL};  
  14.   
  15.     int i;  
  16.     for (i = 0; i < pImage->nChannels; i++)  
  17.         pImageChannel[i] = cvCreateImage(cvGetSize(pImage), pImage->depth, 1);  
  18.   
  19.     cvSplit(pImage, pImageChannel[0], pImageChannel[1], pImageChannel[2], pImageChannel[3]);  
  20.       
  21.     for (i = 0; i < pImage->nChannels; i++)  
  22.         cvEqualizeHist(pImageChannel[i], pImageChannel[i]);  
  23.   
  24.     cvMerge(pImageChannel[0], pImageChannel[1], pImageChannel[2], pImageChannel[3], pEquaImage);  
  25.   
  26.     for (i = 0; i < pImage->nChannels; i++)  
  27.         cvReleaseImage(&pImageChannel[i]);  
  28.   
  29.     return pEquaImage;  
  30. }  
  31. int main( int argc, char** argv )  
  32. {     
  33.     const char *pstrWindowsSrcTitle = "原图(http://blog.csdn.net/MoreWindows)";  
  34.     const char *pstrWindowsHisEquaTitle = "直方图均衡化后(http://blog.csdn.net/MoreWindows)";  
  35.   
  36.     // 从文件中加载原图  
  37.     IplImage *pSrcImage = cvLoadImage("lena.jpg", CV_LOAD_IMAGE_UNCHANGED);  
  38.     IplImage *pHisEquaImage = EqualizeHistColorImage(pSrcImage);  
  39.        
  40.     cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE);  
  41.     cvNamedWindow(pstrWindowsHisEquaTitle, CV_WINDOW_AUTOSIZE);  
  42.     cvShowImage(pstrWindowsSrcTitle, pSrcImage);  
  43.     cvShowImage(pstrWindowsHisEquaTitle, pHisEquaImage);  
  44.   
  45.   
  46.     cvWaitKey(0);  
  47.   
  48.     cvDestroyWindow(pstrWindowsSrcTitle);  
  49.     cvDestroyWindow(pstrWindowsHisEquaTitle);  
  50.     cvReleaseImage(&pSrcImage);  
  51.     cvReleaseImage(&pHisEquaImage);  
  52.     return 0;  
  53. }  

运行结果如下所示:

呵呵,对比一下就知道直方图均衡化对图像增强的效果还不错,图像的对比度增加后,睫毛,头发等细小物体都要清晰多了。


 

OpenCV入门指南】的直方图系列三篇到此就结束了,下面列出目录,方便大家查阅:

1. 《【OpenCV入门指南】第八篇灰度直方图

2. 《【OpenCV入门指南】第九篇灰度直方图均衡化

3. 《【OpenCV入门指南】第十篇彩色直方图均衡化

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
直方图均衡化
Cv图像处理 OpenCV中文手册(部分)
【OpenCV】图像的通道分离
【从零学习OpenCV 4】图像直方图绘制
CalcOpticalFlowPyrLK的使用(转)
CvArr、Mat、CvMat、IplImage、BYTE转换(总结而来)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服