开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 25945|回复: 2
收起左侧

[C#图文教程] OpenCvSharp的学习之旅 lesson03----PixelProcessing

[复制链接]
发表于 2019-8-31 13:28:27 | 显示全部楼层 |阅读模式   重庆市重庆市
本帖最后由 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>
复制代码
301.png

三/像素重映射

(以上下翻转为例)
  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.         }
复制代码

302.png

四/反转像素

反转像素有虽然两个现成的函数,学习的时候,写一写具体过程可以加深理解....
  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.         }
复制代码

303.png







评分

参与人数 1好评 +1 精币 +66 收起 理由
老郭 + 1 + 66 感谢发布原创作品,精易因你更精彩!

查看全部评分

发表于 2023-7-4 23:58:11 | 显示全部楼层   广东省深圳市
不错啊谢谢分享
回复 支持 反对

使用道具 举报

结帖率:87% (79/91)

签到天数: 8 天

发表于 2023-1-17 14:29:58 | 显示全部楼层   江苏省徐州市
牛啊   C#  官方还是不错   
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表