【技术分享】C# OpenCvSharp实现图像对比度和亮度整,让你的图片恢复自然!

目录

效果

项目

代码

参考


 

效果

图片

项目

图片

代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using OpenCvSharp;

namespace OpenCvSharp_改变图像的对比度和亮度
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        Mat src;//源图

        double alpha = 0;
        double beta = 0;
        double gamma = 0;

        double maxVal = -1;//源图最多像素点个数

        Mat new_Image1;
        Mat new_Image2;

        Mat dst;
        Mat hist;
        Mat histImg;

        private void OnChange()
        {
            //初始化所有值都为0的矩阵
            new_Image1 = Mat.Zeros(src.Size(), src.Type());
            new_Image2 = Mat.Zeros(src.Size(), src.Type());
            //m:转换类型后的输出的图像;rtype转换图像的数据类型;alpha:转换过程中的缩放因子;beta:转换过程中的偏置因子
            //m(x,y)=saturate_cast<rType>(alpha*(*this)(x,y)+beta);
            src.ConvertTo(new_Image2, src.Type(), alpha, beta);
            GetHistResult(new_Image2, out hist, out histImg);
            if (pictureBox2.Image != null)
            {
                pictureBox2.Image.Dispose();
            }
            pictureBox2.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(histImg);
            if (pictureBox3.Image != null)
            {
                pictureBox3.Image.Dispose();
            }
            pictureBox3.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(new_Image2);
        }

        const int histW = 512;
        const int histH = 400;
        int histSize = 256;//直方图数组大小
        Rangef range = new Rangef(0, 256);//统计0至255(=266-1)

        /// <summary>
        /// 计算并生成绘制直方图
        /// </summary>
        /// <param name="src">待统计的图像</param>
        /// <param name="hist">直方图结果</param>
        /// <param name="histImage">直方图的绘制结果</param>
        private void GetHistResult(Mat src, out Mat hist, out Mat histImage)
        {
            hist = new Mat();
            histImage = new Mat(histH, histW, MatType.CV_8UC3, Scalar.All(0));
            //将图像像素灰度[0,255]共分为histSize个等级统计,
            for (int channel = 0; channel < src.Channels(); channel++)
            {
                Cv2.CalcHist(images: new[] { src },//待统计的图像
                            channels: new[] { channel },//待统计的通道
                            mask: null,//掩膜
                            hist: hist,//输出的统计结果
                            dims: 1,//直方图维度
                            histSize: new[] { histSize },//将range分为histSize梯度
                            ranges: new[] { range });//待统计通道像素的范围,不在这个范围内的不统计
                DrawHist(histImage, hist, (channel == 0 ? Scalar.Blue : (channel == 1 ? Scalar.Green : Scalar.Red)));
            }
        }

        /// <summary>
        /// 绘制直方图
        /// </summary>
        /// <param name="histImage">直方图绘制结果</param>
        /// <param name="histSize">直方图数组大小</param>
        /// <param name="color">线的颜色</param>
        private void DrawHist(Mat histImage, Mat hist, Scalar color)
        {
            var binW = Math.Round((double)histImage.Width / hist.Height);
            if (maxVal > 0)
            {
                //截断超过源图最大值的像素大数(防止饱和像素过多)
                Cv2.Threshold(hist, hist, maxVal, maxVal, ThresholdTypes.Trunc);
            }
            //归一化
            Cv2.Normalize(hist, hist, 0, histImage.Rows, NormTypes.MinMax, -1);
            for (int i = 1; i < hist.Height; i++)
            {
                var pt1 = new Point2d(binW * (i - 1), histImage.Height - Math.Round(hist.At<float>(i - 1)));
                var pt2 = new Point2d(binW * (i), histImage.Height - Math.Round(hist.At<float>(i)));
                Cv2.Line(histImage, (OpenCvSharp.Point)pt1, (OpenCvSharp.Point)pt2, color, 1, LineTypes.AntiAlias);
            }
        }

        /// <summary> 
        /// Gamma矫正 
        /// </summary>
        /// <param name="src"></param>
        /// <param name="gamma"></param>
        /// <returns></returns>
        private Mat GammaCorrection(Mat src, double gamma)
        {
            var lookUpTable = new Mat(new OpenCvSharp.Size(1, 256), MatType.CV_8U);
            for (int i = 0; i < 256; i++)
            {
                lookUpTable.Set<byte>(0, i, Convert.ToByte(Math.Pow(i / 255.0D, gamma) * 255.0D));
            }
            Mat dst = new Mat();
            //查表法,性能优化
            Cv2.LUT(src, lookUpTable, dst);
            return dst;
        }

        private void gammaOnChange()
        {
            dst = GammaCorrection(src, gamma);
            GetHistResult(dst, out hist, out  histImg);
            if (pictureBox2.Image != null)
            {
                pictureBox2.Image.Dispose();
            }
            pictureBox2.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(histImg);
            if (pictureBox3.Image != null)
            {
                pictureBox3.Image.Dispose();
            }
            pictureBox3.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(dst);
        }

        private void PutText(Mat src, string text)
        {
            PutText(src, text, new OpenCvSharp.Point(10, 20));
        }

        private void PutText(Mat src, string text, OpenCvSharp.Point point)
        {
            Cv2.PutText(src, text, point, HersheyFonts.HersheySimplex, 2, Scalar.Red);
        }

        string fileFilter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png";
        string imgPath = "";

        private void button2_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = fileFilter;
            if (ofd.ShowDialog() != DialogResult.OK) return;
            pictureBox1.Image = null;
            imgPath = ofd.FileName;
            pictureBox1.Image = new Bitmap(imgPath);
            src = new Mat(imgPath);
        }

        /// <summary>
        /// alpha
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            alpha = trackBar1.Value / 100.0D;
            textBox1.Text = alpha.ToString("0.00");
            if (pictureBox1.Image == null) return;
            OnChange();
        }

        /// <summary>
        /// beta
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void trackBar2_Scroll(object sender, EventArgs e)
        {
            beta = trackBar2.Value - 255;
            textBox2.Text = beta.ToString();
            if (pictureBox1.Image == null) return;
            OnChange();
        }

        /// <summary>
        /// gamma
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void trackBar3_Scroll(object sender, EventArgs e)
        {
            gamma = trackBar3.Value / 100.0D;
            textBox3.Text = gamma.ToString("0.00");
            if (pictureBox1.Image == null) return;
            gammaOnChange();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            imgPath = "test.jpg";
            pictureBox1.Image = new Bitmap(imgPath);
            src = new Mat(imgPath);
        }
    }
}

参考

https://docs.opencv.org/4.7.0/d3/dc1/tutorial_basic_linear_transform.html

引入地址 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: OpencvSharp 是开源的计算机视觉领域的 C#语言封装库,可以用于图像处理、图像分析、模式识别等领域。扫描图片对比度图像处理的一个重要应用之一。对比度是指图像中明暗色调变化的大小,即图像中最亮与最暗像素的强度之差。对比度越大,图像中暗部越暗,亮部越亮,反之对比度越小,图像中暗部越明亮,亮部越暗。下面我们来了解 OpencvSharp 如何扫描图片对比度OpencvSharp 中提供了很多用于计算对比度的函数,其中最常用的是 cv::equalizeHist 函数。该函数会将输入图像的直方图均衡化,从而增加图像对比度。具体使用方法如下: 1. 载入图像:Mat img = Cv2.ImRead("image.jpg"); 2. 转为灰度图像:Mat grayImg = new Mat(); Cv2.CvtColor(img, grayImg, ColorConversionCodes.BGR2GRAY); 3. 直方图均衡化:Mat histImg = new Mat(); Cv2.EqualizeHist(grayImg, histImg); 4. 显示图像:Cv2.ImShow("Histogram Equalization", histImg); 通过上述方法,就可以扫描图片对比度并对其进行处理。此外,还可以通过调对比度参数,更加精细地控制图像对比度。 ### 回答2: OpenCVSharp是一个C#语言的开源计算机视觉库,它提供了许多图像处理和计算机视觉相关的函数和工具。扫描图像对比度是一个常见的图像处理需求,OpenCVSharp提供了几种不同的方法来检测和增强图像对比度。 一种简单的方法是使用直方图均衡化方法。它通过重新分配图像像素值来增强图像对比度OpenCVSharp提供了一个名为EqualizeHist的函数,可以用于执行直方图均衡化操作。 另一种更复杂的方法是使用自适应直方图均衡化方法来增强图像对比度。这种方法是在局部图像块上执行直方图均衡化操作,以保留图像的局部对比度和细节。OpenCVSharp还提供了一个名为CLAHE的函数,可以用于执行自适应直方图均衡化操作。 除了直方图均衡化方法外,还可以使用一些其他的算法和技术来增强图像对比度,如增强锐度、彩色平衡等。无论采用何种方法,都需要根据具体应用场景选择最合适的算法和参数,以获得最佳的对比度增强效果。 ### 回答3: OpenCvSharp是一个开源计算机视觉库,用于处理图像和视频的编程库,它提供了丰富的图像处理功能,包括的对比度。要用OpenCvSharp图片对比度,首先需要加载图像,最好是以灰度方式加载,以便更方便地进行对比度。然后可以使用equalizeHist()函数对图像进行直方图均衡化来增加对比度。该函数将把灰度图片的像素值分布均衡化到较宽的像素值范围内,进而增加图像对比度。要调对比度的范围,可以使用convertScaleAbs()函数来调图像亮度对比度值。使用类似于“Mat dst = src⋅alpha+beta”的公式,可以调对比度亮度值。在该公式中,alpha和beta是任选参数,用于调对比度亮度,src是源图像,dst是目标图像。除此之外,还可以使用Matplotlib库来可视化图像对比度的变化,并评估调结果。OpenCvSharp的函数和类库非常清晰和易于使用,可以根据需要选择合适的函数和方法进行图像对比度

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值