.Net AI学习笔记系列
第九章 OpenCVSharp实操——图像增强
前言
本文主要介绍使用直方图均衡化增强图片效果。直方图均衡化的基本原理是通过将图像的灰度级重新映射到一个更均匀的分布上,使得灰度值更为均匀,从而增强图像的对比度和亮度。这个过程包括统计图像的像素值分布,计算直方图的累积分布函数,进行归一化处理,以及根据新的映射函数重新映射原始图像的像素值。
一、OpenCVSharp实操——图像增强
二、步骤
1.开发工具
VS2019+.net 4.8+OpenCvSharp4
2.引入库
Install-Package OpenCvSharp4
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;
using OpenCvSharp.Extensions;
3.示例代码
代码如下(示例):
//通过对彩色图像的每个通道(B、G、R)分别进行直方图均衡化来实现图片增强
private void button1_Click(object sender, EventArgs e)
{
//原图片s
Mat src = BitmapConverter.ToMat((Bitmap)this.pictureBox1.Image);
//灰度
//Mat grayImage = src.CvtColor(ColorConversionCodes.BGR2GRAY);
// 创建一个与输入图像大小相同的图像,用于存储均衡化后的结果
//var dst = new Mat();
// 对输入图像进行直方图均衡化
//Cv2.EqualizeHist(grayImage, dst);
// 将输入图像转换为 YCrCb 颜色空间
var ycrcb = src.CvtColor(ColorConversionCodes.BGR2YCrCb);
// 分离 YCrCb 图像的 Y、Cr 和 Cb 通道
var y = ycrcb.Split()[0];
var cr = ycrcb.Split()[1];
var cb = ycrcb.Split()[2];
// 对 Y 通道进行直方图均衡化
var y_eq = new Mat();
Cv2.EqualizeHist(y, y_eq);
// 将均衡化后的 Y 通道与其他通道合并
var ycrcb_eq = new Mat();
var channels = new Mat[] { y_eq, cr, cb };
Cv2.Merge(channels, ycrcb_eq);
// 将均衡化后的 YCrCb 图像转换回 BGR 颜色空间
var dst = ycrcb_eq.CvtColor(ColorConversionCodes.YCrCb2BGR);
//显示效果图片
this.pictureBox2.Image = BitmapConverter.ToBitmap(dst);
this.pictureBox2.Refresh();
}
4.运行效果
总结
直方图均衡化是一种图像处理技术,通过重新分配图像像素值的灰度级,增强图像的对比度和亮度。这种方法特别适用于背景和前景都太亮或太暗的图像,能够带来更好的骨骼结构显示以及曝光过度或不足照片中的细节。
直方图均衡化算法简单,易于实现,不改变图像的物理信息,只是对像素值进行重新分布,因此不会对图像的真实信息造成影响。
但直方图均衡化也有不足之处,对处理的数据不加选择,可能会增加背景噪声的对比度并且降低有用信号的对比度。