【第二部分 图像处理】第3章 Opencv图像处理进阶【3 直方图与匹配 B】
2018-03-01 09:46
441 查看
3.3直方图均衡化
3.3.1直方图均衡化概述
直方图是图像中像素强度分布的图形表达方式。它统计了每一个强度值所具有的像素个数。图1
直方图均衡化是通过拉伸像素强度分布范围来增强图像对比度的一种方法,说得更清楚一些, 以上面的直方图为例, 你可以看到像素主要集中在中间的一些强度值上. 直方图均衡化要做的就是 拉伸 这个范围. 见下面左图: 绿圈圈出了 少有像素分布其上的 强度值. 对其应用均衡化后, 得到了中间图所示的直方图. 均衡化的图像见下面右图。
图2
均衡化指的是把一个分布 (给定的直方图) 映射 到另一个分布 (一个更宽更统一的强度值分布), 所以强度值分布会在整个范围内展开。要想实现均衡化的效果, 映射函数应该是一个 累积分布函数 (cdf) 。对于直方图H(i)H(i) , 它的累积分布H′(i)H′(i) 是:
图3
最后, 我们使用一个简单的映射过程来获得均衡化后像素的强度值:
3.3.2 equalizeHist()函数解析
C++: void equalizeHist(InputArray src, OutputArray dst)
【参数】
第一个参数,src – Source 8-bit single channel image.
第二个参数,dst – Destination image of the same size and type as src .
采用如下步骤对直方图均衡化:
步骤一:计算输入图像的直方图H。
步骤二:进行直方图归一化,直方图的组距的和为255;
步骤三:计算直方图积分:
步骤四:以 作为查询表惊醒图像变换:
dst(x,y)=H′(src(x,y))dst(x,y)=H′(src(x,y))
3.3.3 equalizeHist()函数源代码
/*【equalizeHist ( )源代码】*********************************************************** * @Version:OpenCV 3.0.0(Opnencv2和Opnencv3差别不大,Linux和PC的对应版本源码完全一样,均在对应的安装目录下) * @源码路径:…\opencv\sources\modules\imgproc\src\ histogram.cpp * @起始行数:3622行 ********************************************************************************/ void cv::equalizeHist( InputArray _src, OutputArray _dst ) { CV_Assert( _src.type() == CV_8UC1 ); if (_src.empty()) return; CV_OCL_RUN(_src.dims() <= 2 && _dst.isUMat(), ocl_equalizeHist(_src, _dst)) Mat src = _src.getMat(); _dst.create( src.size(), src.type() ); Mat dst = _dst.getMat(); Mutex histogramLockInstance; const int hist_sz = EqualizeHistCalcHist_Invoker::HIST_SZ; int hist[hist_sz] = {0,}; int lut[hist_sz]; EqualizeHistCalcHist_Invoker calcBody(src, hist, &histogramLockInstance); EqualizeHistLut_Invoker lutBody(src, dst, lut); cv::Range heightRange(0, src.rows); if(EqualizeHistCalcHist_Invoker::isWorthParallel(src)) parallel_for_(heightRange, calcBody); else calcBody(heightRange); int i = 0; while (!hist[i]) ++i; int total = (int)src.total(); if (hist[i] == total) { dst.setTo(i); return; } float scale = (hist_sz - 1.f)/(total - hist[i]); int sum = 0; for (lut[i++] = 0; i < hist_sz; ++i) { sum += hist[i]; lut[i] = saturate_cast<uchar>(sum * scale); } if(EqualizeHistLut_Invoker::isWorthParallel(src)) parallel_for_(heightRange, lutBody); else lutBody(heightRange); }
3.3.4直方图均衡化实例
废话不多说,直接上代码。代码参看附件【demo1】。图4
参考:
英文
中文
本章参考附件
点击进入相关文章推荐
- 【第二部分 图像处理】第3章 Opencv图像处理进阶【3 直方图与匹配 D】
- 【第二部分 图像处理】第3章 Opencv图像处理进阶【3 直方图与匹配 A】
- 【第二部分 图像处理】第3章 Opencv图像处理进阶【3 直方图与匹配 E】
- 【第二部分 图像处理】第3章 Opencv图像处理进阶【3 直方图与匹配 C】
- 【第二部分 图像处理】第3章 Opencv图像处理进阶【4 图像轮廓C】
- 【第二部分-图像处理】第3章 Opencv图像处理进阶-【1 图像处理A-滤波】(imgproc组件、feature2D组件)
- 【第二部分 图像处理】第3章 Opencv图像处理进阶【6角点检测 D】
- 【第二部分 图像处理】第3章 Opencv图像处理进阶【6角点检测 A】
- 【第二部分 图像处理】第3章 Opencv图像处理进阶【2 图像变换B-霍夫变换】
- 【第二部分 图像处理】第3章 Opencv图像处理进阶-【1 图像处理E-阈值化】(imgproc组件、feature2D组件)
- 【第二部分 图像处理】第3章 Opencv图像处理进阶【6角点检测 B】
- 【第二部分 图像处理】第3章 Opencv图像处理进阶【6角点检测 C】
- 【第二部分 图像处理】第3章 Opencv图像处理进阶【2 图像变换C-重影射】
- 【第二部分 图像处理】第3章 Opencv图像处理进阶【4 图像轮廓A】
- 【第二部分 图像处理】第3章 Opencv图像处理进阶【4 图像轮廓D】
- 【第二部分 图像处理】第4章 Opencv图像处理高阶【1马赛克】
- 基于opencv和c++的图像处理:直方图匹配
- 【图像处理】基于OpenCV底层实现的直方图匹配
- OpenCV之imgproc 模块. 图像处理(4)直方图均衡化 直方图计算 直方图对比 反向投影 模板匹配
- 【第二部分 图像处理】第4章 Opencv图像处理高阶【3图像修复】