美文网首页
C#:三通道像素处理

C#:三通道像素处理

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

    一、API

    1、Vec3b

    • 通道顺序 blue grenn red 在C++中对应uchar类型 ,C#对应byte类型。
    • 像素数据结构 BGR 包含三个像素值 R代表红,red; G代表绿,green; B代表蓝,blue。
    • RGB模式就是,色彩数据模式,R在高位,G在中间,B在低位。BGR正好相反。
      例如,如果色彩数据是24位,对于RGB模式,就是高8位是R,中间8位是G,低8位是B。
      一个色彩数据共24位,3个字节。

    2、Vec3f

    • 对应三通道的float类型。
    • 把CV_8UC1 转换到 CV32F1实现:
      src.convertTo(dst,CV_32F1);

    二、三通道图像像素处理

            private void uiButton10_Click(object sender, EventArgs e)
            {
                Mat m2 = new Mat(src_img.Size(), src_img.Type());
                int height = src_img.Rows;
                int width = src_img.Cols;
                int cn = src_img.Channels(); //获取通道数
    
                #region 反转像素算法
                for (int row = 0; row < height; row++)
                {
                    for (int col = 0; col < width; col++)
                    {
                        if (cn == 1) //如果是单通道
                        {
                            byte p = m2.At<byte>(row, col); //获取像素
                            byte value = byte.Parse((255 - p).ToString()); //反转像素值
                            m2.Set(row, col, value); //赋值
                        }
                        else if (cn == 3) //如果是三通道
                        {
                            //读取源图的像素
                            int b = src_img.At<Vec3b>(row, col)[0];
                            int g = src_img.At<Vec3b>(row, col)[1];
                            int r = src_img.At<Vec3b>(row, col)[2];
    
                            Vec3b color = new Vec3b
                            {
                                Item0 = (byte)(255 - b), //反转像素   (byte)( Math.Max(r, Math.Max(b, g)));
                                Item1 = (byte)(255 - g), //                 (byte)(Math.Max(r, Math.Max(b, g)));
                                Item2 = (byte)(255 - r) //                   (byte)(Math.Max(r, Math.Max(b, g)));
                            };
                            /*  
                             Vec3b color = new Vec3b //反转像素
                            {
                               Item0 = (byte)Math.Abs(src.Get<Vec3b>(row, col).Item0 - 255),
                               Item1 = (byte)Math.Abs(src.Get<Vec3b>(row, col).Item1 - 255),
                               Item2 = (byte)Math.Abs(src.Get<Vec3b>(row, col).Item2 - 255)
                            };
                            */
                            //Math.Max(r, Math.Max(b, g));取灰度,min也可以,但是亮度不同
    
                            //赋值
                            m2.Set<Vec3b>(row, col, color);
                        }
                    }
                }
                #endregion
                picBoxShowDel.Image = src_img.ToBitmap();
                pictureBox1.Image = m2.ToBitmap();
            }
    
    

    三、资料

    松山湖村民  https://sslcode.com.cn/
    

    相关文章

      网友评论

          本文标题:C#:三通道像素处理

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