腐蚀、膨胀都有专门的函数,但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;
}
}