EmguCv图像形态学

腐蚀、膨胀都有专门的函数,但CvInvoke.MorphologyEx()把它们都综合进去了,所以简单起见,只用一个函数比较方便

private void btn_Click(object sender, EventArgs e)
        {
            Emgu.CV.CvEnum.MorphOp mo = new Emgu.CV.CvEnum.MorphOp();

            string ss = ((Button)sender).Text;
            switch (ss)
            {
                case "腐蚀":
                    //腐蚀,使边界向内收缩
                    mo = Emgu.CV.CvEnum.MorphOp.Erode;
                    break;
                case "膨胀":
                    //膨胀,使边界向外部扩展,可用来填补物体中的空洞
                    mo = Emgu.CV.CvEnum.MorphOp.Dilate;
                    break;
                case "闭运算":
                    //先膨胀后腐蚀为闭,用来填平小孔,弥合小裂缝,且图形位置、形状不变
                    mo = Emgu.CV.CvEnum.MorphOp.Close;
                    break;
                case "开运算":
                    //开运算,先腐蚀后膨胀为开,用于消除小物体
                    mo = Emgu.CV.CvEnum.MorphOp.Open;
                    break;
                case "梯度":
                    //梯度,膨胀与腐蚀之差
                    mo = Emgu.CV.CvEnum.MorphOp.Gradient;
                    break;
                case "高帽":
                    //原始图像减去进行开操作的图像
                    mo = Emgu.CV.CvEnum.MorphOp.Tophat;
                    break;
                case "低帽":
                    //闭操作减去原始图像
                    mo = Emgu.CV.CvEnum.MorphOp.Blackhat;
                    break;
                default:
                    break;
            }

            if (ib_original.Image != null)
            {
                Mat src = new Image<Bgr, byte>(ib_original.Image.Bitmap).Mat;
                Mat dst = new Mat();

                //创建结构元素(探针)
                //Rectangle = 0,//矩形形状。
                // Cross = 1,//十字形。
                //Ellipse = 2,//椭圆形状。
                //Custom = 100,//用户自定义。
                //Size ksize:结构元素大小。
                //Point anchor:锚元素内的位置。(1,1)意味着锚的中心。注意,只有一个十字形的元素的形状取决于锚的位置。
                // 在其他情况下锚只是调节多少形态操作的结果发生了偏移的现象。
                Mat structElement = CvInvoke.GetStructuringElement(Emgu.CV.CvEnum.ElementShape.Cross,
                    new Size(3, 3), new Point(-1, -1));

                //Point anchor:在结构中锚的位置,默认值为(-1,-1)代表结构元素的中心,
                //如果不是(-1,-1)处理后的图像将会产生偏移,偏移的方向取决于锚在结构元素中心的方向。
                //int iterations:腐蚀迭代的次数,次数越多腐蚀的效果明显。
                //BorderType borderType:Emgu.CV.CvEnum的一个枚举类型,标识了图像的边界模式。
                //处理边界点的时候,由于不能产生以边界点为中心指定大小的矩形,所以需要推算出外部图像的某种边界模型。
                //MCvScalar borderValue:边界值的一个常数边界。
                CvInvoke.MorphologyEx(src, dst, mo, structElement, new Point(-1, -1), 3,
                                     Emgu.CV.CvEnum.BorderType.Default, new MCvScalar(0, 0, 0));

                ib_result.Image = dst;
            }
        }

猜你喜欢

转载自blog.csdn.net/xjjatdna/article/details/85412751
今日推荐