一、图像调亮
- 调整亮度通常可以通过增加每个像素的值来实现,比如加上一个常数,或者乘以一个系数。
使用ConvertTo方法,或者遍历每个像素加上一个值。不过ConvertTo更高效,可以指定缩放因子和增量。
比如,乘以1.0(不改变对比度),然后加上一个beta值增加亮度。
例如,beta设为50,这样每个像素值增加50,但要注意溢出,超过255的要截断为255。OpenCv的ConvertTo会自动处理截断,所以用这个方法比较好。
二、程序
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using OpenCvSharp;
namespace Ky_Brighten
{
public partial class Form1 : Form
{
private Mat originalMat;
public Form1()
{
InitializeComponent();
}
private void BtnOpen_Click(object sender, EventArgs e)
{
using (var openFileDialog = new OpenFileDialog())
{
openFileDialog.Filter = "Image Files|*.jpg;*.png;*.bmp";
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
try
{
// 释放之前的图像资源
originalMat?.Dispose();
// 读取图像(BGR格式)
originalMat = Cv2.ImRead(openFileDialog.FileName, ImreadModes.Color);
if (originalMat.Empty())
{
MessageBox.Show("无法加载图像!");
return;
}
// 转换为RGB格式并显示
// Cv2.CvtColor(originalMat, originalMat, ColorConversionCodes.BGR2RGB);
pictureBoxOriginal.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(originalMat);
}
catch (Exception ex)
{
MessageBox.Show($"加载图像出错: {ex.Message}");
}
}
}
}
private void BtnBrighten_Click(object sender, EventArgs e)
{
if (originalMat == null || originalMat.Empty())
{
MessageBox.Show("请先打开图像!");
return;
}
try
{
// 调整亮度参数(beta值控制亮度)
int beta = 50;
beta = trackBar1.Value;
Mat brightenedMat = new Mat();
originalMat.ConvertTo(brightenedMat, -1, 1, beta);
// 显示结果
pictureBoxResult.Image?.Dispose();
pictureBoxResult.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(brightenedMat);
// 释放资源
brightenedMat.Dispose();
}
catch (Exception ex)
{
MessageBox.Show($"处理图像出错: {ex.Message}");
}
}
// 窗体关闭时释放资源
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
originalMat?.Dispose();
}
}
}