您的位置:首页 > 编程语言 > C语言/C++

直方图均衡化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自带算法做了比较,效果基本相同
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: