对比度和亮度的调节理论
代码示例
Mat src, dst;
src = imread("./1.png");
if (!src.data) //判断图片是否加载成功!
{
std::cout << "打开图片失败!" << std::endl;
return -1;
}
//将src变成灰度图像(单通道)
//cvtColor(src, src, CV_RGB2GRAY);
imshow("src image", src);
int height = src.rows;
int width = src.cols;
dst = Mat::zeros(src.size(),src.type());
float alpha = 1.5f;
int beta = 40;
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
if (src.channels() == 1)
{
uchar grayscale = src.at<uchar>(i, j);
dst.at<uchar>(i, j)=saturate_cast<uchar>(alpha * grayscale + beta);
}
else if (src.channels() == 3)
{
float b_color_f = src.at<Vec3b>(i, j)[0];
float g_color_f = src.at<Vec3b>(i, j)[1];
float r_color_f = src.at<Vec3b>(i, j)[2];
dst.at<Vec3b>(i, j)[0] = saturate_cast<uchar>(alpha * b_color_f + beta);
dst.at<Vec3b>(i, j)[1] = saturate_cast<uchar>(alpha * g_color_f + beta);
dst.at<Vec3b>(i, j)[2] = saturate_cast<uchar>(alpha * r_color_f + beta);
}
}
}
imshow("dst image", dst);
如果想到达更细致的对比度和亮度调节可以使用Vec3f获取rgb像素值
此时需要使用convertTo()函数将src图片转成CV_32FC3
Mat m1;
src.convertTo(m1,CV_32FC3);
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
if (src.channels() == 1)
{
uchar grayscale = src.at<uchar>(i, j);
saturate_cast<uchar>(alpha * grayscale + beta);
}
else if (src.channels() == 3)
{
float b_color_f = m1.at<Vec3f>(i, j)[0];
float g_color_f = m1.at<Vec3f>(i, j)[1];
float r_color_f = m1.at<Vec3f>(i, j)[2];
dst.at<Vec3b>(i, j)[0] = saturate_cast<uchar>(alpha * b_color_f + beta);
dst.at<Vec3b>(i, j)[1] = saturate_cast<uchar>(alpha * g_color_f + beta);
dst.at<Vec3b>(i, j)[2] = saturate_cast<uchar>(alpha * r_color_f + beta);
}
}
}
imshow("dst image", dst);
个人学习opencv总结,如有错误请大佬指正,谢谢!