环境: OPENCV2.4.6+VS2012
功能:
对每个像素进行修改,提高亮度
另一种方法是讲BGR三个通道分开,分别进行均衡化,当然出现的效果就比较丑
源图像
效果图1(BGR均衡化)
效果图2
WIN32 控制窗的参数
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
//
直方图均衡化的方式修改源图像,当然这是一次性的效果
///
//读入图像
Mat mat = imread("3.jpg");
namedWindow("original");
imshow("original", mat);
Mat mergeImg;//合并后的图像
//用来存储各通道图片的向量
vector<Mat> splitBGR(mat.channels());
//分割通道,存储到splitBGR中
split(mat,splitBGR);
//对各个通道分别进行直方图均衡化
for(int i=0; i<mat.channels(); i++)
equalizeHist(splitBGR[i],splitBGR[i]);
//合并通道
merge(splitBGR,mergeImg);
namedWindow("equalizeHist");
imshow("equalizeHist", mergeImg);
///另外一种方式,可以选择参数的方式,控制对比度和亮度//
double alpha; /**< 控制对比度 */
int beta; /**< 控制亮度 */
Mat image = imread("3.jpg");
Mat new_image = Mat::zeros( image.size(), image.type() );
/// 初始化
cout << " Basic Linear Transforms " << endl;
cout << "-------------------------" << endl;
cout << "* Enter the alpha value [1.0-3.0]: ";
cin >> alpha;
cout << "* Enter the beta value [0-100]: ";
cin >> beta;
/// 执行运算 new_image(i,j) = alpha*image(i,j) + beta
for( int y = 0; y < image.rows; y++ )
{
for( int x = 0; x < image.cols; x++ )
{
for( int c = 0; c < 3; c++ )
{
new_image.at<Vec3b>(y,x)[c] = saturate_cast<uchar>( alpha*( image.at<Vec3b>(y,x)[c] ) + beta );
}
}
}
namedWindow("alpha_beta", 1);
imshow("alpha_beta", new_image);
waitKey();
return 0;
}