基于opencv和c++的图像处理:直方图均衡化
2012-10-27 12:46
686 查看
一般而言,图片有RGB三通道,每个通道用一个byte表示,取值范围在0到255之间。对于每个通道,我们都可以计算图像的直方图,其实就是统计每个像素值的出现频率,如下图所示:
直方图均衡化的效果,即把原图的三通道的直方图变成均匀分布,每种像素值出现的次数都差不多,下面是直方图均衡化后的效果(直方图是用光影查看的,生成效果图的代码见后):
可以看到,图片的直方图很均匀。
直方图均衡化的代码:
调用时
其中GFImage封装了opencv的图像类,GFHistogram是自定义的直方图类。详细代码可参考这里
直方图均衡化的效果,即把原图的三通道的直方图变成均匀分布,每种像素值出现的次数都差不多,下面是直方图均衡化后的效果(直方图是用光影查看的,生成效果图的代码见后):
可以看到,图片的直方图很均匀。
直方图均衡化的代码:
bool GFImage::HistogramEqualization() { vector<vector<uchar> > pixMaps; CalculateMapFunByHisEq(pixMaps); for (int ch = 0; ch < GetChannel(); ch++) { uchar * pData = GetData(); for (int r = 0;r < GetHeight(); r++) { uchar * pLine = pData + r * GetWidthStep(); for (int c = 0; c < GetWidth(); c++) { uchar val = pLine[GetChannel() * c + ch]; pLine[GetChannel() * c + ch] = pixMaps[ch][val]; } } } return true; }
bool GFImage::CalculateMapFunByHisEq(vector<vector<uchar> >& vMappings) const { vMappings.resize(GetChannel()); for (int i = 0; i < vMappings.size(); i++) { vMappings[i].resize(256); } vector<GFHistogram> vHistograms; vHistograms.resize(GetChannel()); for (int i = 0;i < GetChannel(); i++) { vHistograms[i].Calculate(*this, 256, i); } double tmp; for (int ch = 0; ch < GetChannel(); ch++) { tmp = vHistograms[ch].GetFrequencyAt(0) * 255; vMappings[ch][0] = (uchar)tmp; for (int j = 1;j < 256; j++) { tmp = tmp + vHistograms[ch].GetFrequencyAt(j) * 255; vMappings[ch][j] = (uchar)tmp; } } return true; }
调用时
string strImagePath = "lena.jpg"; GFImage image1(strImagePath); image1.ShowImage("ori"); image1.HistogramEqualization(); image1.ShowImage("res"); cv::waitKey();
其中GFImage封装了opencv的图像类,GFHistogram是自定义的直方图类。详细代码可参考这里
相关文章推荐
- 基于opencv和c++的图像处理:直方图均衡化
- 基于opencv和c++的图像处理:直方图匹配
- 基于opencv和c++的图像处理:直方图匹配
- [转]opencv3 图像处理 之 图像缩放( python与c++实现 )
- 【图像处理】基于OpenCV底层实现的图片旋转
- (GO_GTD_1)基于OpenCV和QT,建立Android图像处理程序
- OpenCV2计算机编程手册(二)基于类的图像处理
- 基于直方图均衡化的图像处理
- 彩色图像直方图均衡化 --- 基于OpenCV中EqualizeHist_Demo实现
- OpenCV3_C++_GaussianBlur()图像高斯模糊化处理 实例
- 基于Opencv3和Qt5的图像处理GUI
- OpenCV学习笔记(三):将图像显示在MFC控件上并做直方图均衡化处理
- 基于OpenCV的CT图像处理
- 基于OpenCV3.0图像处理中常见的五个滤波函数
- 基于直方图均衡化的激光水下图像处理
- 基于Opencv和Mfc的图像处理增强库GOCVHelper(索引)
- 基于OpenCV及Python的数独问题识别与求解(一)图像预处理
- 基于OPENCV的视频图像处理算法和应用
- 图像处理之其他杂项(一)之MeanShift的目标跟踪算法opencv c++代码 VS2015+opencv3.2
- 基于OpenCV的图像形态学处理