您的位置:首页 > 运维架构

opencv 彩色图像亮度、对比度调节 直方图均衡化

2014-03-14 14:57 351 查看
直接上代码:

#include <Windows.h>
#include <iostream>// for stand I/O
#include <string> // for strings
#include <iomanip> // for controlling float print precision
#include <sstream> // string to number conversion
#include <cmath>
#include <ctype.h>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main()
{
Mat                m_frame;
Mat                m_ycrcb;
Mat                m_result;
Mat                m_result2;
VideoCapture    m_Cap;
int                m_nWidth = 640;
int                m_nHeight = 480;

double alpha = 2.0; /**< Simple contrast control */
int beta = 0;  /**< Simple brightness control */
/// Initialize values
std::cout<<" Basic Linear Transforms "<<std::endl;
std::cout<<"-------------------------"<<std::endl;
std::cout<<"* Enter the alpha value [1.0-3.0]: ";std::cin>>alpha;
std::cout<<"* Enter the beta value [0-100]: "; std::cin>>beta;

m_Cap.open(0);

bool bSuccess1 = false,bSuccess2 = false;
bSuccess1 = m_Cap.set(CV_CAP_PROP_FRAME_WIDTH,m_nWidth);
bSuccess2 = m_Cap.set(CV_CAP_PROP_FRAME_HEIGHT,m_nHeight);
if (bSuccess1==false || bSuccess2==false)
{ return -1;}

m_Cap>>m_frame;
if (m_frame.empty())
{
return -1;
}

//用来存储各通道图片的向量
vector<Mat> splitBGR(m_frame.channels());
vector<Mat> splitYCrCb(m_frame.channels());

Mat new_image = Mat::zeros( m_frame.size(), m_frame.type() );

for (;;)
{
m_Cap>>m_frame;
if (m_frame.empty())
{ return -1;    }

//方法一:直方图均衡化
//分割通道,存储到splitBGR中
split(m_frame,splitBGR);
//对各个通道分别进行直方图均衡化
for(int i=0; i<m_frame.channels(); i++)
equalizeHist(splitBGR[i],splitBGR[i]);
//合并通道
merge(splitBGR,m_result);

//方法二: 直方图均衡化
//转化为ycrcb
cvtColor(m_frame,m_ycrcb,CV_BGR2YCrCb);
split(m_ycrcb,splitYCrCb);
equalizeHist(splitYCrCb[0],splitYCrCb[0]);
merge(splitYCrCb,m_ycrcb);
cvtColor(m_ycrcb,m_result2,CV_YCrCb2BGR);

//方法三:
//g(i,j) = alpha * f(i,j) + beta
for( int y = 0; y < m_frame.rows; y++ ) {
for( int x = 0; x < m_frame.cols; x++ ) {
for( int c = 0; c < 3; c++ ) {
new_image.at<Vec3b>(y,x)[c] =
saturate_cast<uchar>( alpha*( m_frame.at<Vec3b>(y,x)[c] ) + beta );
}
}
}

imshow("原图",m_frame);
imshow("对比度1",m_result);
imshow("对比度2",m_result2);
imshow("对比度3",new_image);

int c = waitKey(33);
if (c==27)//ESC退出
{    break;    }

}

return 0;
}


参考网址:http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/core/basic_linear_transform/basic_linear_transform.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: