精易论坛

标题: OpenCvSharp的学习之旅 lesson03----PixelProcessing [打印本页]

作者: qingshanlushui    时间: 2019-8-31 13:28
标题: OpenCvSharp的学习之旅 lesson03----PixelProcessing
本帖最后由 qingshanlushui 于 2019-8-31 13:34 编辑

预计本周将lesson04/05更新完毕
lesson04----绘图,写字,画线等
lesson05----图像基本操作
再往后的内容就比较复杂了.....


本套学习心得,虽不是什么高瞻远瞩,但依旧禁止任何形式的转载or复制(含非商业),如需任何形式的转载or复制,还请论坛留言通知我一下下....


一/像素处理的基本函数


c++对像素点的set和get用的都是at函数。而c#的at函数只能表示get,set就要去使用set函数,所以建议直接用set和get函数.(含setarray和getarray)
示例:
              zx61.Set(10, 10, (float)j);
              zx61.Set(10, 10, (float)(i + 5 * Math.Sin(j / 1.0)));
              zx61.Set(10, 10, (char)0);
              zx61.Set(10, 10, new Vec3b(0, 0, 0));


二/椒盐噪点

(密集恐惧慎入)
  1. <blockquote>  /// <summary>
复制代码


三/像素重映射

(以上下翻转为例)
  1. /// <summary>
  2.         /// 像素点重映射
  3.         /// </summary>
  4.         /// <param name="path"></param>
  5.         public static void pixelRedefine(string path) {

  6.             Mat zx61 = new Mat(path, ImreadModes.AnyColor);
  7.             Mat zx6161 = new Mat();
  8.             zx61.CopyTo(zx6161);//作为对比

  9.             Mat zx61x = new Mat(zx61.Size(), MatType.CV_32FC1);//存放位置
  10.             Mat zx61y = new Mat(zx61.Size(), MatType.CV_32FC1);
  11.             for (int i = 0; i < zx61.Rows; i++)//遍历所有像素点
  12.             {
  13.                 for (int j = 0; j < zx61.Cols; j++)
  14.                 {
  15.                     zx61x.Set(i, j, (float)j);//x不动,转成float是必须的,参数不一样重载的函数也不一样
  16.                     zx61y.Set(i, j, (float)(zx61.Rows - i));//y上下对换
  17.                     //zx61y.Set(i, j, (float)(i + 6 * Math.Sin(j / 1.0)));//波浪
  18.                 }
  19.             }
  20.             Cv2.Remap(zx61, zx61, zx61x, zx61y);

  21.             Cv2.ImShow("处理后", zx61);
  22.             using(new Window("处理后",WindowMode.AutoSize, zx6161)) {
  23.                 Cv2.WaitKey();
  24.             }
  25.         }
复制代码



四/反转像素

反转像素有虽然两个现成的函数,学习的时候,写一写具体过程可以加深理解....
  1. /// <summary>
  2.         /// 反转像素算法
  3.         /// Cv2.BitwiseNot(zx61, zx6161); //反转像素函数,不需要操作像素,达到的效果一样
  4.         /// using (new Window("zx6161", WindowMode.FreeRatio, ~zx61)){Cv2.WaitKey();}//取反符号~,达到的效果也一样
  5.         /// 学习的时候,写一写具体过程可以加深理解....
  6.         /// </summary>
  7.         /// <param name="path"></param>
  8.         public static void reversalImageThreeChannelsPixel(string path)
  9.         {
  10.             using (Mat zx61 = new Mat(path, ImreadModes.AnyColor))
  11.             using (Mat zx6161 = new Mat(zx61.Size(), zx61.Type()))
  12.             {
  13.                 int height = zx61.Rows;
  14.                 int width = zx61.Cols;
  15.                 int cn = zx61.Channels(); //获取通道数

  16.                 for (int row = 0; row < height; row++)
  17.                 {
  18.                     for (int col = 0; col < width; col++)
  19.                     {
  20.                         //Cv2.CvtColor(zx61, zx6161, ColorConversionCodes.BGRA2GRAY)//转换成**单通道
  21.                         if (cn == 1) //如果是单通道
  22.                         {
  23.                             byte p = zx6161.At<byte>(row, col); //获取像素
  24.                             byte value = byte.Parse((255 - p).ToString()); //反转像素值
  25.                             zx6161.Set(row, col, value); //赋值
  26.                         }
  27.                         else if (cn == 3) //如果是三通道
  28.                         {
  29.                             //读取源图的像素R代表红,red; G代表绿,green; B代表蓝,blue。
  30.                             int b = zx61.At<Vec3b>(row, col)[0];
  31.                             int g = zx61.At<Vec3b>(row, col)[1];
  32.                             int r = zx61.At<Vec3b>(row, col)[2];

  33.                             Vec3b color = new Vec3b
  34.                             {
  35.                                 Item0 = (byte)(255 - b), //反转像素   (byte)( Math.Max(r, Math.Max(b, g)));
  36.                                 Item1 = (byte)(255 - g), //           (byte)(Math.Max(r, Math.Max(b, g)));
  37.                                 Item2 = (byte)(255 - r) //            (byte)(Math.Max(r, Math.Max(b, g)));
  38.                             };
  39.                             // Vec3b color = new Vec3b //反转像素
  40.                             //{
  41.                             //   Item0 = (byte)Math.Abs(zx61.Get<Vec3b>(row, col).Item0 - 255),
  42.                             //   Item1 = (byte)Math.Abs(zx61.Get<Vec3b>(row, col).Item1 - 255),
  43.                             //   Item2 = (byte)Math.Abs(zx61.Get<Vec3b>(row, col).Item2 - 255)
  44.                             //};
  45.                             //Math.Max(r, Math.Max(b, g));取灰度,min也可以,但是亮度不同

  46.                             //赋值
  47.                             zx6161.Set<Vec3b>(row, col, color);//这里的Vec3b就是说第三个参数的类型
  48.                         }

  49.                     }
  50.                 }
  51.                 using (new Window("zx6161", WindowMode.AutoSize, zx6161)) //反转
  52.                 using (new Window("zx61", WindowMode.AutoSize, zx61)) //原图
  53.                 {
  54.                     Cv2.WaitKey();
  55.                 }
  56.             }
  57.         }
复制代码










作者: z13228604287    时间: 2023-1-17 14:29
牛啊   C#  官方还是不错   
作者: A6928564    时间: 2023-7-4 23:58
不错啊谢谢分享




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4