直方图均衡化C++实现

来源:互联网 发布:浏览器软件下载 编辑:程序博客网 时间:2024/06/14 21:31


直方图均衡化通常用来增加许多图像的局部对比度,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。(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自带算法做了比较,效果基本相同