|
本帖最后由 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));
二/椒盐噪点
(密集恐惧慎入)
- <blockquote> /// <summary>
复制代码
三/像素重映射
(以上下翻转为例)
- /// <summary>
- /// 像素点重映射
- /// </summary>
- /// <param name="path"></param>
- public static void pixelRedefine(string path) {
- Mat zx61 = new Mat(path, ImreadModes.AnyColor);
- Mat zx6161 = new Mat();
- zx61.CopyTo(zx6161);//作为对比
- Mat zx61x = new Mat(zx61.Size(), MatType.CV_32FC1);//存放位置
- Mat zx61y = new Mat(zx61.Size(), MatType.CV_32FC1);
- for (int i = 0; i < zx61.Rows; i++)//遍历所有像素点
- {
- for (int j = 0; j < zx61.Cols; j++)
- {
- zx61x.Set(i, j, (float)j);//x不动,转成float是必须的,参数不一样重载的函数也不一样
- zx61y.Set(i, j, (float)(zx61.Rows - i));//y上下对换
- //zx61y.Set(i, j, (float)(i + 6 * Math.Sin(j / 1.0)));//波浪
- }
- }
- Cv2.Remap(zx61, zx61, zx61x, zx61y);
- Cv2.ImShow("处理后", zx61);
- using(new Window("处理后",WindowMode.AutoSize, zx6161)) {
- Cv2.WaitKey();
- }
- }
复制代码
四/反转像素
反转像素有虽然两个现成的函数,学习的时候,写一写具体过程可以加深理解....
- /// <summary>
- /// 反转像素算法
- /// Cv2.BitwiseNot(zx61, zx6161); //反转像素函数,不需要操作像素,达到的效果一样
- /// using (new Window("zx6161", WindowMode.FreeRatio, ~zx61)){Cv2.WaitKey();}//取反符号~,达到的效果也一样
- /// 学习的时候,写一写具体过程可以加深理解....
- /// </summary>
- /// <param name="path"></param>
- public static void reversalImageThreeChannelsPixel(string path)
- {
- using (Mat zx61 = new Mat(path, ImreadModes.AnyColor))
- using (Mat zx6161 = new Mat(zx61.Size(), zx61.Type()))
- {
- int height = zx61.Rows;
- int width = zx61.Cols;
- int cn = zx61.Channels(); //获取通道数
- for (int row = 0; row < height; row++)
- {
- for (int col = 0; col < width; col++)
- {
- //Cv2.CvtColor(zx61, zx6161, ColorConversionCodes.BGRA2GRAY)//转换成**单通道
- if (cn == 1) //如果是单通道
- {
- byte p = zx6161.At<byte>(row, col); //获取像素
- byte value = byte.Parse((255 - p).ToString()); //反转像素值
- zx6161.Set(row, col, value); //赋值
- }
- else if (cn == 3) //如果是三通道
- {
- //读取源图的像素R代表红,red; G代表绿,green; B代表蓝,blue。
- int b = zx61.At<Vec3b>(row, col)[0];
- int g = zx61.At<Vec3b>(row, col)[1];
- int r = zx61.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(zx61.Get<Vec3b>(row, col).Item0 - 255),
- // Item1 = (byte)Math.Abs(zx61.Get<Vec3b>(row, col).Item1 - 255),
- // Item2 = (byte)Math.Abs(zx61.Get<Vec3b>(row, col).Item2 - 255)
- //};
- //Math.Max(r, Math.Max(b, g));取灰度,min也可以,但是亮度不同
- //赋值
- zx6161.Set<Vec3b>(row, col, color);//这里的Vec3b就是说第三个参数的类型
- }
- }
- }
- using (new Window("zx6161", WindowMode.AutoSize, zx6161)) //反转
- using (new Window("zx61", WindowMode.AutoSize, zx61)) //原图
- {
- Cv2.WaitKey();
- }
- }
- }
复制代码
|
评分
-
参与人数 1 | 好评 +1 |
精币 +66 |
收起
理由
|
老郭
| + 1 |
+ 66 |
感谢发布原创作品,精易因你更精彩! |
查看全部评分
|