直方图均衡化(cvEqualizeHist)
2014-09-25 13:30
239 查看
本文转自:http://blog.csdn.net/hitwengqi/article/details/6897291
我们可以对图像做点事情尝试扩大其动态范围,对这个操作最常用的技术是直方图均衡化,可以将比较淡的图像变换为比较深的图像(即增强图像的亮度及对比度)。直方图均衡化后面潜在的数学原理是一个分布(输入的亮度直方图)被映射到另一个分布(一个更宽,理想统一的亮度值分布),映射函数是一个累积分布函数。对于连续分布,结果将是准确的均衡化。在cvEqualizeHist中,原始图像及目标图像必须是单通道,大小相同的8位图像,对于彩色图像,必须先将每个通道分开,再分别进行直方图均衡化处理,然后将通道合并形成新的图像。----------------------------------------------------------------------------------------------
Split |
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 也可以从图像中提取单通道。 |
Merge |
Merge 从几个单通道数组组合成多通道数组或插入一个单通道数组 void cvMerge( const CvArr* src0, const CvArr* src1, const CvArr* src2, const CvArr* src3, CvArr* dst ); #define cvCvtPlaneToPix cvMerge src0... src3 输入的通道. dst 输出数组. 函数cvMerge是前一个函数的反向操作。如果输出数组有N个通道并且前N个输入通道非NULL,就拷贝所有通道到输出数组,如果在前N个通道中只有一个单通道非NULL,只拷贝这个通道到输出数组,否则 就会产生错误。除前N通道以外的馀下的通道必须置NULL。对于设置了COI的 IplImage结构使用cvCopy也可以实现向图像中插入一个通道 。 |
灰度图象直方图均衡化
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))进行图像变换。
该方法归一化图像亮度和增强对比度。
EqualizeHist::EqualizeHist() { for (int i = 0; i<256; i++) { pixelArr[i] = 0; sumPixelArr[i] = 0; } pixelMax = 0; pixelMin = 256; } EqualizeHist::~EqualizeHist() { } void EqualizeHist::process(Mat src, Mat& dst) { for (int i = 0; i<256; i++) { pixelArr[i] = 0; sumPixelArr[i] = 0; } pixelMax = 0; pixelMin = 256; int width = src.cols; int height = src.rows; dst.create(Size(width,height),src.type()); for (int i = 0; i< height; i++) { for (int j = 0; j< width; j++) { pixelArr[src.at<uchar>(i,j)] += 1; pixelMax = pixelMax>src.at<uchar>(i,j)?pixelMax:src.at<uchar>(i,j); pixelMin = pixelMin<src.at<uchar>(i,j)?pixelMin:src.at<uchar>(i,j); } } for (int i = 0; i< 256; i++) { pixelArr[i] /= width*height; for (int j = 0; j<= i; j++) { sumPixelArr[i] += pixelArr[j]; } } for (int i = 0; i<height; i++) { for (int j = 0; j<width; j++) { int temp11 = src.at<uchar>(i,j); float temp1 = sumPixelArr[temp11]*(pixelMax-pixelMin)+(pixelMin); dst.at<uchar>(i,j) = temp1; } } }
----------------------------------------------------------------------------------------------
#include <highgui.h> #include <cv.h> int main(int argc, char** argv) { int i; IplImage* src = cvLoadImage( argv[1], 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] ); 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; }
----------------------------------------------------------------------------------------------
source image
EqualizeHist image
由此看出,图像的亮度及对比度明显增强,画面感更强。
相关文章推荐
- OpenCV中cvEqualizeHist实现灰度图象直方图均衡化
- cvEqualizeHist() 直方图均衡化(单通道)
- cvEqualizeHist() 直方图均衡化(多通道彩图)
- 第六章 - 图像变换 - 直方图均衡化(cvEqualizeHist)
- OpenCV直方图均衡化(cvEqualizeHist)
- OpenCV直方图均衡化(cvEqualizeHist)
- OpenCV直方图均衡化(cvEqualizeHist)
- 直方图均衡化(cvEqualizeHist)
- OpenCV学习笔记_直方图均衡化cvEqualizeHist
- OpenCV图象大小调整cvEqualizeHist灰度调整
- opencv3.0 函数学习 3——equalizeHist 直方图均衡化
- 彩色图像直方图均衡化 --- 基于OpenCV中EqualizeHist_Demo实现
- opencv_tutorial_code学习——equalizeHist直方图均衡化
- opencv学习(三十六)图像直方图均衡化equalizeHist
- opencv学习笔记1—equalizeHist 函数(直方图均衡化)
- 直方图均衡化 EqualizeHist
- 彩色图像的直方图均衡化--基于OpenCV中EqualizeHist_Demo实现
- 图形学-对比度变换-直方图均衡化-程序开发-3P代码网
- [杂记521] c指针 聚类搜索引擎 excel图表x轴改刻度 协议栈 cve
- New IE Zero-Day Vulnerability (CVE 2010-3962)