上一篇《OpenCV第十篇灰度直方圖均衡化》介紹了灰度圖像的直方圖均衡化,實際生活中,,肯定還是彩色圖像用的最多,,因此本篇介紹對彩色圖像進行直方圖均衡化。這樣可以讓大家直方圖均衡化對圖像增強的效果有個直觀的印象,。
在OpenCV中,,彩色的圖像其實是用一個多通道數(shù)組來存儲的,每個單通道數(shù)組中的元素的取值范圍都是0到255,。這與灰度圖中像素的變化范圍是相同的,。因此對彩色圖像進行直方圖均衡化只要先將彩色圖像分解成若干通道,然后這些通道分別進行直方圖均衡化,,最后合并所有通道即可,。下面介紹下二個主要函數(shù)cvSplit()和cvMerge()。
一.cvSplit
函數(shù)功能:分割多通道數(shù)組成幾個單通道數(shù)組或者從數(shù)組中提取一個通道,。
函數(shù)原型:
/* Splits a multi-channel array into the set of single-channel arrays or
extracts particular [color] plane */
CVAPI(void) cvSplit(
const CvArr* src,
CvArr* dst0,
CvArr* dst1,
CvArr* dst2,
CvArr* dst3
);
參數(shù)說明:
第一個參數(shù)表示輸入的多通道數(shù)組即輸入圖像,。
第二,三,,四,,五個參數(shù)分別表示輸出的單通道數(shù)組。
二.cvMerge
函數(shù)功能:分割多通道數(shù)組成幾個單通道數(shù)組或者從數(shù)組中提取一個通道,。
函數(shù)原型:
/* Merges a set of single-channel arrays into the single multi-channel array
or inserts one particular [color] plane to the array */
CVAPI(void) cvMerge(
const CvArr* src0,
const CvArr* src1,
const CvArr* src2,
const CvArr* src3,
CvArr* dst
);
參數(shù)說明:
第一,,二,三,,四個參數(shù)表示輸入的單通道數(shù)組,。
第五個參數(shù)分別表示合并后的多通道數(shù)組即輸出圖像,。
下面給出完整的代碼:
- //圖像增強- 彩色直方圖均衡化
- //By MoreWindows (http://blog.csdn.net/MoreWindows)
- #include <opencv2/opencv.hpp>
- using namespace std;
- #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
- //彩色圖像的直方圖均衡化
- IplImage* EqualizeHistColorImage(IplImage *pImage)
- {
- IplImage *pEquaImage = cvCreateImage(cvGetSize(pImage), pImage->depth, 3);
-
- // 原圖像分成各通道后再均衡化,最后合并即彩色圖像的直方圖均衡化
- const int MAX_CHANNEL = 4;
- IplImage *pImageChannel[MAX_CHANNEL] = {NULL};
-
- int i;
- for (i = 0; i < pImage->nChannels; i++)
- pImageChannel[i] = cvCreateImage(cvGetSize(pImage), pImage->depth, 1);
-
- cvSplit(pImage, 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], pEquaImage);
-
- for (i = 0; i < pImage->nChannels; i++)
- cvReleaseImage(&pImageChannel[i]);
-
- return pEquaImage;
- }
- int main( int argc, char** argv )
- {
- const char *pstrWindowsSrcTitle = "原圖(http://blog.csdn.net/MoreWindows)";
- const char *pstrWindowsHisEquaTitle = "直方圖均衡化后(http://blog.csdn.net/MoreWindows)";
-
- // 從文件中加載原圖
- 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(0);
-
- cvDestroyWindow(pstrWindowsSrcTitle);
- cvDestroyWindow(pstrWindowsHisEquaTitle);
- cvReleaseImage(&pSrcImage);
- cvReleaseImage(&pHisEquaImage);
- return 0;
- }
運行結(jié)果如下所示:
呵呵,,對比一下就知道直方圖均衡化對圖像增強的效果還不錯,圖像的對比度增加后,,睫毛,,頭發(fā)等細小物體都要清晰多了。
【OpenCV入門指南】的直方圖系列三篇到此就結(jié)束了,,下面列出目錄,,方便大家查閱:
1. 《【OpenCV入門指南】第八篇灰度直方圖》
2. 《【OpenCV入門指南】第九篇灰度直方圖均衡化》
3. 《【OpenCV入門指南】第十篇彩色直方圖均衡化》