直方图均衡化C++实现
2017-05-22 20:10
169 查看
直方图均衡化通常用来增加许多图像的局部对比度,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。(http://blog.csdn.net/xiajun07061225/article/details/6910129)出自这里。具体细节可以参看《数字图像处理》那本书。
L-1:最大灰度值 M:图像行数 N:图像列数 nj:灰度值为j的像素的个数 Sk:均衡化后的灰度值
#include <iostream>
#include <opencv2/opencv.hpp>
#include <vector>
using namespace std;
using namespace cv;
int main()
{
const int grayMax=255;
vector<vector<int>>graylevel(grayMax+1);
Mat image=imread("Lpic0.jpg",0);
Mat img;
Mat src;
image.copyTo(img);
if (!image.data)
{
return -1;
}
for (int i = 0; i < image.rows-1; i++)
{
uchar* ptr=image.ptr<uchar>(i);
for (int j = 0; j < image.cols-1; j++)
{
int x=ptr[j];
graylevel[x].push_back(0);//这个地方写的不好,引入二维数组只是为了记录每一个灰度值的像素个数
}
}
for (int i = 0; i < img.rows-1; i++)
{
uchar* imgptr=img.ptr<uchar>(i);
uchar* imageptr=image.ptr<uchar>(i);
for (int j = 0; j < img.cols-1; j++)
{
int sumpiexl=0;
for (int k = 0; k < imageptr[j]; k++)
{
sumpiexl=graylevel[k].size()+sumpiexl;
}
imgptr[j]=(grayMax*sumpiexl/(image.rows*image.cols));
}
}
equalizeHist(image,src);
imshow("原图",image);
imshow("opencv自带",src);
imshow("自己实现",img);
waitKey(0);
return 0;
}本文通过自己实现直方图均衡化与opencv自带算法做了比较,效果基本相同
相关文章推荐
- 直方图均衡化C++实现
- 直方图均衡化的原理及C++实现
- 用C++(OpenCV)自己实现彩色直方图均衡化
- 数字图像处理——直方图均衡化与颜色迁移算法的c++实现
- 用PHP实现通过Web执行C/C++程序
- C++实现单件的初探
- C++设计模式:Singleton的模板实现之一
- Singleton模式的C++实现研究(转贴)
- 分析模式-计量的C++实现——完美版本
- 在Delphi与C++之间实现函数与对象共享
- 使用c++实现Format函数
- 在C++中实现“属性 (Property)”
- 在C++中实现属性
- 用 C++ 实现 C# 中的 委托/事件 (2-delegate event functor)
- 用C++实现C#中的委托/事件(标准C++之升级版)
- 用C++ std::priority_queue 实现哈夫曼算法
- C++机理:虚拟机制的实现[兼谈对比于传统机制]
- 分析模式-计量的C++实现——回复ch0877
- 小写转大写金额在C++中的实现
- 用 C++ 实现 C# 中的 委托/事件 (5-functor2)