admin 管理员组

文章数量: 1086866

opencvsharp图像处理

膨胀:dilate为核B对核A做卷积时,核B覆盖区域的像素最大值提取
腐蚀:erode 为核B对核A做卷积时,核B覆盖区域的像素最小值提取
击中击不中变换:有两个不相交集合B={B1,B2},用B1去腐蚀X,然后用B2去腐蚀X的补集,得到的结果相减就是击中击不中变换。
腐蚀和膨胀公式:

击中击不中变换公式:

腐蚀和膨胀opencvsharp程序

      //定义原图路径Mat panda = new Mat("template2.jpg");//显示原图//Cv2.ImShow("原图",panda);PICPRO.DispImage(panda, pictureBox1);int size = 5;//定义卷积核 矩形,5*5的核 核的锚点Mat stu = Cv2.GetStructuringElement(MorphShapes.Rect,new OpenCvSharp.Size(size,size),new OpenCvSharp.Point(-1,-1));//定义一个膨胀输出mat类型Mat dil = new Mat();//膨胀 输入图 输出图 卷积核B 锚点位置,应用膨胀次数Cv2.Dilate(panda, dil, stu, new OpenCvSharp.Point(-1, -1), 1);//定义一个腐蚀输出mat类型Mat erode = new Mat();//输入图像 输出图像 卷积核 锚点位置 腐蚀次数Cv2.Erode(panda,erode,stu,new OpenCvSharp.Point(-1,-1),1);Cv2.ImShow("膨胀",dil);Cv2.ImShow("腐蚀", erode);Cv2.WaitKey();

0黑,255白
腐蚀erode : 是黑色的扩张,向0的扩张

原图

膨胀dilate : 是白色的扩张,向255的扩张

开运算: 先腐蚀在膨胀,可以剔除小白点
闭运算: 先膨胀在腐蚀,可以剔除小黑点

击中击不中变换实现代码:

		//自建图byte[] image = new byte[64]{0, 0, 0, 0, 0, 0, 0, 0,0, 255, 255, 255, 0, 0, 0, 255,0, 255, 255, 255, 0, 0, 0, 0,0, 255, 255, 255, 0, 255, 0, 0,0, 0, 255, 0, 0, 0, 0, 0,0, 0, 255, 0, 0, 255, 255, 0,0, 255, 0, 255, 0, 0, 255, 0,0, 255, 255, 255, 0, 0, 0, 0};Mat input_image = new Mat(8, 8, MatType.CV_8UC1, image);Console.WriteLine("自建图" + Cv2.Format(input_image));input_image.SetArray<Byte>(image);//目标图定义Mat binary = new Mat();Mat binaryNot = new Mat();Mat binaryNot1 = new Mat();Mat binaryOut = new Mat();Mat HitMiss = new Mat();//原图Cv2.Threshold(input_image, binary, 0, 255, ThresholdTypes.Otsu);Mat stu = Cv2.GetStructuringElement(MorphShapes.Cross,new OpenCvSharp.Size(3, 3), new OpenCvSharp.Point(-1, -1));Console.WriteLine("STU" + Cv2.Format(stu));Cv2.MorphologyEx(binary, HitMiss, MorphTypes.HitMiss, stu);Cv2.Resize(HitMiss, HitMiss, new OpenCvSharp.Size(), 50, 50, InterpolationFlags.Nearest);Cv2.ImShow("直接用输出的结果", HitMiss);//原图的补集Cv2.BitwiseNot(binary, binaryNot);Cv2.Resize(binaryNot, binaryNot1, new OpenCvSharp.Size(), 50, 50, InterpolationFlags.Nearest);// Cv2.ImShow("原图", binary);Cv2.ImShow("原图补集", binaryNot1);//构建核Abyte[] kernelA = new byte[9] {0,1,0,1,1,1,0,1,0 };Mat StuA = new Mat(3, 3, MatType.CV_8UC1, kernelA);StuA.SetArray<byte>(kernelA);Console.WriteLine("核A"+ Cv2.Format(StuA));//构建核Bbyte[] kernelB = new byte[9] { 1, 0, 1, 0, 0, 0, 1, 0, 1 };Mat StuB = new Mat(3, 3, MatType.CV_8UC1);StuB.SetArray<byte>(kernelB);Console.WriteLine("核B"+ Cv2.Format(StuB));//用核A去腐蚀原图Cv2.MorphologyEx(binary, binary, MorphTypes.Erode, StuA);Console.WriteLine("核A去腐蚀原图" + Cv2.Format(binary));//用核B去腐蚀原图补集Cv2.MorphologyEx(binaryNot, binaryNot, MorphTypes.Erode, StuB);Console.WriteLine("核B去腐蚀原图补集" + Cv2.Format(binaryNot));//交集Cv2.Subtract(binary, binaryNot, binaryOut);Cv2.Resize(binaryOut, binaryOut, new OpenCvSharp.Size(), 50, 50, InterpolationFlags.Nearest);Cv2.ImShow("结果", binaryOut);Cv2.MoveWindow("结果", 0, 0);int rate = 50;StuB = (StuB ) * 255;StuA = (StuA ) * 255;Cv2.Resize(StuA, StuA, new OpenCvSharp.Size(), rate, rate, InterpolationFlags.Nearest);Cv2.ImShow("StuA", StuA);Cv2.MoveWindow("StuA", 0, 0);Cv2.Resize(StuB, StuB, new OpenCvSharp.Size(), rate, rate, InterpolationFlags.Nearest);Cv2.ImShow("StuB", StuB);Cv2.MoveWindow("StuB", 0, 0);Cv2.Resize(input_image, input_image, new OpenCvSharp. Size(), rate, rate, InterpolationFlags.Nearest);Cv2.ImShow("原图", input_image);Cv2.MoveWindow("原图", 0, 0);

自建图:

//自建核

//用接口和代码分别实现的结果

//数据的计算

本文标签: opencvsharp图像处理