美文网首页每周一赞
C#:用鼠标获取图片上某一点的颜色HSV值

C#:用鼠标获取图片上某一点的颜色HSV值

作者: 大龙10 | 来源:发表于2023-12-11 12:48 被阅读0次

一、像素

  • 图像数字化是指用数字表示图像。
    每一幅数字图像都是由M行N列的像素组成的,其中每一个像素都存储一个像素值。计算机通常会把像素值处理为256个灰度级别,这256个灰度级别分别用区间[0,255]中的数值表示。其中,“0”表示纯黑色;“255”表示纯白色。

  • 像素的位置
    图片是由许多像素组成,我们按照水平方向和垂直方向上进行建立向下的坐标系,通过坐标(x,y)的点位置确定像素的位置。
    opencv像素点的位置坐标: 画图的(x,y) 对应 opencv的(y,x)。

  • Cv2.ImRead
    默认读取的格式是:\color{red}{BGR格式}

  • 分解某个像素点的BGR通道是
    int blue = src_img.At<Vec3b>(p1.Y, p1.X)[0];
    int green = src_img.At<Vec3b>(p1.Y, p1.X)[1];
    int red = src_img.At< Vec3b > (p1.Y, p1.X)[2];

  • 转换为HSV后,分解HSV通道是
    Mat[] channel = Cv2.Split(hsv_image);//分割通道
    int hv = channel[0].At<byte>(p1.Y, p1.X);
    int sv = channel[1].At<byte>(p1.Y, p1.X);
    int vv = channel[2].At<byte>(p1.Y, p1.X);

二、程序

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private Image image = null;
        private Mat dst = new Mat();
        private Mat src_img;
        string filePath = "";
        bool mouseDown = false;
        public OpenCvSharp.Point p1 = new OpenCvSharp.Point(-1, -1);

        #region  定义一个发送接收图像数据的全局变量SendPicData
        public Mat SendPicData
        {
            get { return BitmapConverter.ToMat((Bitmap)pictureBox1.Image); }
            set { pictureBox1.Image = value.ToBitmap(); }
        }
        #endregion

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Title = "选择操作的图片";
            openFileDialog.Filter = "图片 *.jpg|*.jpg|*.bmp|*.bmp|图像*.png|*.png";
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                filePath = openFileDialog.FileName;
                image = Image.FromFile(filePath);
                src_img = Cv2.ImRead(filePath);
            }
            if (filePath != "")
            {
                pictureBox1.Image = image;
                textBox1.Text = src_img.Rows.ToString();
                textBox2.Text = src_img.Cols.ToString();
             }
        }

        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            mouseDown = true;
            if (mouseDown)
            {
                p1.X = e.X;
                p1.Y = e.Y;
                textBox3.Text =  "(" + e.X.ToString() + " , " + e.Y.ToString() + ")";
             }
        }

        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
            mouseDown = false;
            Mat hsv_image = new Mat(); ;
            Cv2.CvtColor(src_img, hsv_image, ColorConversionCodes.BGR2HSV);

            Mat[] channel = Cv2.Split(hsv_image);//分割通道
            int hv = channel[0].At<byte>(p1.Y, p1.X);
            int sv = channel[1].At<byte>(p1.Y, p1.X);
            int vv = channel[2].At<byte>(p1.Y, p1.X);

            textBox4.Text = "(" + hv.ToString() + " , " + sv.ToString() + " , " + vv.ToString() + ")";

            int blue = src_img.At<Vec3b>(p1.Y, p1.X)[0];         //#坐标(x,y)上的像素的B通道的值
            int green = src_img.At<Vec3b>(p1.Y, p1.X)[1];     // #坐标(x,y)上的像素的G通道的值
            int red = src_img.At< Vec3b > (p1.Y, p1.X)[2];    // #坐标(x,y)上的像素的R通道的值
            textBox5.Text = "(" + blue.ToString() + " , " + green.ToString() + " , " + red.ToString() + ")";
        }
    }
}

三、结果

四、资料

c1learning的博客
https://blog.csdn.net/c1learning/article/details/100130805

相关文章

网友评论

    本文标题:C#:用鼠标获取图片上某一点的颜色HSV值

    本文链接:https://www.haomeiwen.com/subject/yylygdtx.html