赞
踩
比较概率分布函数和累积分布函数,前者的二维图像是参差不齐的,后者是单调递增的。直方图均衡化过程中,映射方法是:
其中,n是图像中像素的总和,nk是当前灰度级的像素个数,L是图像中可能的灰度级总数。
来看看通过上述公式怎样实现的拉伸。假设有如下图像:
得图像的统计信息如下图所示,并根据统计信息完成灰度值映射:
映射后的图像如下所示:
灰度直方图均衡化实现的步骤:
1.统计灰度级中每个像素在整幅图像中的个数
2.计算每个灰度级占图像中的概率分布
3.计算累计分布概率
4.计算均衡化之后的灰度值
5.映射回原来像素的坐标的像素值
放上源代码:
- #include<opencv2\opencv.hpp>
- #include<cmath>
- #include<iostream>
- using namespace cv;
- using namespace std;
- Mat MyequalizeHist(Mat &srcImage)
- {
- int nRows = srcImage.rows;
- int nCols = srcImage.cols;
-
- int nSumPix[256];
- double nProDis[256];
- double nSumProDis[256];
- int EqualizeSumPix[256];
-
- for (int i = 0; i < 256; i++)
- {
- nSumPix[i] = 0;
- nProDis[i] = 0.0;
- nSumProDis[i] = 0.0;
- EqualizeSumPix[i] = 0;
- }
-
- for (int i = 0; i < nRows; i++)
- {
- for (int j = 0; j < nCols; j++)
- {
- nSumPix[(int)srcImage.at<uchar>(i, j)]++;
- }
- }
-
-
- for (int i = 0; i < 256; i++)
- {
- nProDis[i] = (double)nSumPix[i] / (nRows * nCols);
- }
-
-
- nSumProDis[0] = nProDis[0];
-
-
- for (int i = 1; i < 256; i++)
- {
- nSumProDis[i] = nSumProDis[i - 1] + nProDis[i];
- }
-
-
- for (int i = 0; i < 256; i++)
- {
- EqualizeSumPix[i] = cvRound((double)nSumProDis[i] * 255);
- }
-
- Mat resultImage(nRows, nCols, srcImage.type());
- for (int i = 0; i < nRows; i++)
- {
-
- for (int j = 0; j < nCols; j++)
- {
-
- resultImage.at<uchar>(i, j) = EqualizeSumPix[(int)srcImage.at<uchar>(i, j)];
- }
- }
- return resultImage;
-
- }
- int main()
- {
- Mat srcIamge = imread("flower.jpg");
- if (!srcIamge.data)
- {
- printf("image could not load...\n");
- return -1;
- }
- Mat srcGray;
- //转化为灰度图并且显示
- cvtColor(srcIamge, srcGray, CV_BGR2GRAY);
- imshow("srcGray", srcGray);
-
- Mat resultImage = MyequalizeHist(srcGray);
- imshow("res", resultImage);
-
- waitKey(0);
- return 0;
- }
效果图:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。