- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
直方图均衡化及OpenCV实现
一、直方图均衡化原理:出自Sonka“Image processing, analysis and machine vision”, 3rded, 2008.直方图均衡化是想把左边的直方图变换为右边的直方图,使各个灰度值上的像素个数均匀分布,这样图像整体的亮度分布较均匀,不会过亮或过暗,同时可以增加图像的对比度。假设变换前后图像的灰度等级都为k,则变换过程为:其中,为变换前的灰度值,为变换后的灰度值,H(p)为变换前的直方图,G(p)为变换后的直方图。假设图像大小为N*N,那么应为常量值:那么用精确的连续函数表达,有:其中,称为累积直方图(cumulative histogram).转换为离散形式,得到:二、算法实现1) 声明数组H,数组长度为图像的灰度等级G(一般为256),图像大小为N*M;2) 扫描图像,建立灰度直方图: H(pi) = H(pi) + 1;3) 建立累积直方图Hc(pi):Hc(p0) = H(p0);Hc(pi) = Hc(pi-1) + H(pi);4) 扫描图像,计算新像素值qi,也可以建立一个查找表:qi=(G-1)Hc(pi)/(N*M)三、代码实现:Mat MyHistEqual(Mat I){CV_Assert(I.data);// accept only char type matricesCV_Assert(I.depth() != sizeof(uchar));constint channels = I.channels();switch(channels){case 1:{intHist[256];memset(Hist, 0, sizeof(Hist));// form image histogrampMatIterator_uchar it, end;for( it = I.beginuchar(), end = I.enduchar(); it != end; it++ )Hist[(*it)] ++;// form cumulative histogramefor(inti = 1; i 256; i++ )Hist[i] += Hist[i-1];// histogram equalizationintnRows = I.rows;intnCols = I.cols;for( it = I.beginuchar(), end = I.enduchar(); it != end; it++ )*it = (uchar)( 255 * Hist[(*it)] / (nRows * nCols) );break;}case 3:{MatIterator_Vec3b it, end;for( it = I.beginVec3b(), end = I.endVec3b(); it != end; it++ ){(*it)[0] = 255 - (*it)[0];(*it)[1] = 255 - (*it)[1];(*it)[2] = 255 - (*it)[2];}}}return I;}四、OpenCV2.4.3中的源代码:CV_IMPL voidcvEqualizeHist(constCvArr* srcarr, CvArr* dstarr ){CvMatsstub, *src = cvGetMat(srcarr, sstub);CvMatdstub, *dst = cvGetMat(dstarr, dstub);CV_Assert( CV_ARE_SIZES_EQ(src, dst) CV_ARE_TYPES_EQ(src, dst) CV_MAT_TYPE(src-type) == CV_8UC1 );CvSize size = cvGetMatSize(src);if( CV_IS_MAT_CONT(src-type dst-type) ) {size.width *= size.height;size.height = 1; }int x, y;constinthist_sz = 256;inthist[hist_sz];memset(hist, 0, sizeof(hist));for( y = 0; y size.height; y++ ) {constuchar* sptr = src-data.ptr + src-step*y;for( x = 0; x size.width; x++ )hist[sptr[x]]++; }float scale = 255.f/(size.width*size.height);int sum = 0;ucharlut[hist_sz+1];for(inti = 0
文档评论(0)