c# OpenCvSharp HSL(色相、饱和度、亮度)

c# OpenCvSharp HSL(色相、饱和度、亮度)

通过trackBar调整值大小(最大值设置为255)。

using OpenCvSharp;
using OpenCvSharp.Extensions;
using DlibDotNet;
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 System.Threading;

namespace app
{
    public partial class FrmMain : Form
    {
        public FrmMain()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 色相
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void trackBarHue_Scroll(object sender, EventArgs e)
        {
            Mat src = new Mat(@"img\jzh.png", ImreadModes.Color);
            Cv2.Resize(src, src, new OpenCvSharp.Size(300, 300), 0, 0, InterpolationFlags.Linear);
            this.picSrc.Image = BitmapConverter.ToBitmap(src);

            lblHueNum.Text = trackBarHue.Value.ToString();
            Mat hsv = new Mat();
            Cv2.CvtColor(src, hsv, ColorConversionCodes.BGR2HSV);
            Mat[] channels = Cv2.Split(hsv);

            // 遍历所有像素
            for (int i = 0; i < channels[0].Rows; i++)
            {
                for (int j = 0; j < channels[0].Cols; j++)
                {
                    channels[0].Set(i, j, trackBarHue.Value);
                }
            }

            // 合并通道
            Cv2.Merge(channels, hsv);
            Mat newImage = new Mat();
            Cv2.CvtColor(hsv, newImage, ColorConversionCodes.HSV2BGR);
            this.picDest.Image = BitmapConverter.ToBitmap(newImage);
        }

        /// <summary>
        /// 饱和度
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void trackBarSaturation_Scroll(object sender, EventArgs e)
        {
            Mat src = new Mat(@"img\jzh.png", ImreadModes.Color);
            Cv2.Resize(src, src, new OpenCvSharp.Size(300, 300), 0, 0, InterpolationFlags.Linear);
            this.picSrc.Image = BitmapConverter.ToBitmap(src);

            lblSaturationNum.Text = trackBarSaturation.Value.ToString();
            Mat hsv = new Mat();
            Cv2.CvtColor(src, hsv, ColorConversionCodes.BGR2HSV);
            Mat[] channels = Cv2.Split(hsv);

            // 遍历所有像素
            for (int i = 0; i < channels[1].Rows; i++)
            {
                for (int j = 0; j < channels[1].Cols; j++)
                {
                    channels[1].Set(i, j, trackBarSaturation.Value);
                }
            }

            // 合并通道
            Cv2.Merge(channels, hsv);
            Mat newImage = new Mat();
            Cv2.CvtColor(hsv, newImage, ColorConversionCodes.HSV2BGR);
            this.picDest.Image = BitmapConverter.ToBitmap(newImage);
        }

        /// <summary>
        /// 亮度
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void trackBarLightness_Scroll(object sender, EventArgs e)
        {
            Mat src = new Mat(@"img\jzh.png", ImreadModes.Color);
            Cv2.Resize(src, src, new OpenCvSharp.Size(300, 300), 0, 0, InterpolationFlags.Linear);
            this.picSrc.Image = BitmapConverter.ToBitmap(src);

            lblLightnessNum.Text = trackBarLightness.Value.ToString();
            Mat hsv = new Mat();
            Cv2.CvtColor(src, hsv, ColorConversionCodes.BGR2HSV);
            Mat[] channels = Cv2.Split(hsv);

            // 遍历所有像素
            for (int i = 0; i < channels[2].Rows; i++)
            {
                for (int j = 0; j < channels[2].Cols; j++)
                {
                    channels[2].Set(i, j, trackBarLightness.Value);
                }
            }

            // 合并通道
            Cv2.Merge(channels, hsv);
            Mat newImage = new Mat();
            Cv2.CvtColor(hsv, newImage, ColorConversionCodes.HSV2BGR);
            this.picDest.Image = BitmapConverter.ToBitmap(newImage);
        }
    }
}

 

发表回复

您的电子邮箱地址不会被公开。