图像的亮度、对比度调整
视频讲解如下:
当前系列所有demo下载地址:
https://github.com/GaoRenBao/OpenCv4-Demo
不同编程语言对应的OpenCv版本以及开发环境信息如下:
语言 | OpenCv版本 | IDE |
C# | OpenCvSharp4.4.8.0.20230708 | Visual Studio 2022 |
C++ | OpenCv-4.5.5-vc14_vc15 | Visual Studio 2022 |
Python | OpenCv-Python (4.6.0.66) | PyCharm Community Edition 2022.1.3
|
运行效果如下:

C#版本
C#版本需要安装“OpenCvSharp4”、“OpenCvSharp4.runtime.win”两个库才行。不然会报错。
如果需要使用“ BitmapConverter.ToBitmap”操作,则需要追加安装“OpenCvSharp4.Extensions”库。
using OpenCvSharp;
using OpenCvSharp.Extensions;
using System;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp
{
public partial class Form1 : Form
{
public double g_nContrastValue; //对比度值
public double g_nBrightValue; //亮度值
public Mat g_srcImage, g_dstImage;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
// 读入用户提供的图像
g_srcImage = Cv2.ImRead("../../../images/flowers.jpg");
if (g_srcImage.Data == null)
{
MessageBox.Show("Oh,no,读取g_srcImage图片错误~!");
return;
}
g_dstImage = new Mat(g_srcImage.Size(), g_srcImage.Type());
//设定对比度和亮度的初值
g_nContrastValue = 80;
g_nBrightValue = 80;
hScrollBar1.Value = 80;
hScrollBar2.Value = 80;
Cv2.ImShow("【原始图窗口】", g_srcImage);
Task t = new Task(() =>
{
ContrastAndBright();
});
t.Start();
}
// 对比度
private void hScrollBar1_ValueChanged(object sender, EventArgs e)
{
g_nContrastValue = (double)hScrollBar1.Value;
label3.Text = g_nContrastValue.ToString();
}
// 亮度
private void hScrollBar2_ValueChanged(object sender, EventArgs e)
{
g_nBrightValue = (double)hScrollBar2.Value;
label4.Text = g_nBrightValue.ToString();
}
private void ContrastAndBright()
{
while (true)
{
for (int y = 0; y < g_srcImage.Rows; y++)
{
for (int x = 0; x < g_srcImage.Cols; x++)
{
Vec3b color = new Vec3b
{
Item0 = Saturate_cast(g_srcImage.Get<Vec3b>(y, x).Item0 * (g_nContrastValue * 0.01) + g_nBrightValue), // B
Item1 = Saturate_cast(g_srcImage.Get<Vec3b>(y, x).Item1 * (g_nContrastValue * 0.01) + g_nBrightValue), // G
Item2 = Saturate_cast(g_srcImage.Get<Vec3b>(y, x).Item2 * (g_nContrastValue * 0.01) + g_nBrightValue) // R
};
g_dstImage.Set(y, x, color);
}
}
// 输出图像到pictureBox控件
pictureBox1.Image = BitmapConverter.ToBitmap(g_dstImage);
}
}
//要确保运算后的像素值在正确的范围内
private byte Saturate_cast(double n)
{
if (n <= 0)
{
return 0;
}
else if (n > 255)
{
return 255;
}
else
{
return (byte)n;
}
}
}
}
C++版本
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
using namespace std;
using namespace cv;
static void ContrastAndBright(int, void*);
void ShowHelpText();
int g_nContrastValue; //对比度值
int g_nBrightValue; //亮度值
Mat g_srcImage, g_dstImage;
int main()
{
//改变控制台前景色和背景色
system("color 2F");
ShowHelpText();
// 读入用户提供的图像
g_srcImage = imread("../images/flowers.jpg");
if (!g_srcImage.data) { printf("Oh,no,读取g_srcImage图片错误~! \n"); return false; }
g_dstImage = Mat::zeros(g_srcImage.size(), g_srcImage.type());
//设定对比度和亮度的初值
g_nContrastValue = 80;
g_nBrightValue = 80;
//创建窗口
namedWindow("【效果图窗口】", 1);
//创建轨迹条
createTrackbar("对比度:", "【效果图窗口】", &g_nContrastValue, 300, ContrastAndBright);
createTrackbar("亮 度:", "【效果图窗口】", &g_nBrightValue, 200, ContrastAndBright);
//调用回调函数
ContrastAndBright(g_nContrastValue, 0);
ContrastAndBright(g_nBrightValue, 0);
//输出一些帮助信息
cout << endl << "\t运行成功,请调整滚动条观察图像效果\n\n"
<< "\t按下“q”键时,程序退出\n";
//按下“q”键时,程序退出
while (char(waitKey(1)) != 'q') {}
return 0;
}
void ShowHelpText()
{
//输出欢迎信息和OpenCV版本
printf("\n\n\t\t\t 当前使用的OpenCV版本为:" CV_VERSION);
printf("\n\n ----------------------------------------------------------------------------\n");
}
static void ContrastAndBright(int, void*)
{
// 创建窗口
namedWindow("【原始图窗口】", 1);
// 三个for循环,执行运算 g_dstImage(i,j) = a*g_srcImage(i,j) + b
for (int y = 0; y < g_srcImage.rows; y++)
{
for (int x = 0; x < g_srcImage.cols; x++)
{
for (int c = 0; c < 3; c++)
{
g_dstImage.at<Vec3b>(y, x)[c] = saturate_cast<uchar>((g_nContrastValue * 0.01) * (g_srcImage.at<Vec3b>(y, x)[c]) + g_nBrightValue);
}
}
}
// 显示图像
imshow("【原始图窗口】", g_srcImage);
imshow("【效果图窗口】", g_dstImage);
}
Python版本
import cv2
import numpy as np
alpha = 0.3 # 对比度
beta = 80 # 亮度
img_path = "../images/flowers.jpg"
img = cv2.imread(img_path)
img2 = cv2.imread(img_path)
# 修改对比度
def updateAlpha(x):
global alpha, img, img2
alpha = cv2.getTrackbarPos('Alpha', 'image')
alpha = alpha * 0.01
img = np.uint8(np.clip((alpha * img2 + beta), 0, 255))
# 修改亮度
def updateBeta(x):
global beta, img, img2
beta = cv2.getTrackbarPos('Beta', 'image')
img = np.uint8(np.clip((alpha * img2 + beta), 0, 255))
# 创建窗口
cv2.namedWindow('image')
cv2.createTrackbar('Alpha', 'image', 0, 300, updateAlpha)
cv2.createTrackbar('Beta', 'image', 0, 200, updateBeta)
cv2.setTrackbarPos('Alpha', 'image', 80)
cv2.setTrackbarPos('Beta', 'image', 80)
while (True):
cv2.imshow('image', img)
if cv2.waitKey(1) == ord('q'):
break
cv2.destroyAllWindows()