文章目录
- 一、相关概念
- 1.什么叫开运算
- 3.开运算的函数
- 二、演示
- 1.原始素材
- 2.代码
- 3.运行结果
一、相关概念
1.什么叫开运算
腐蚀、膨胀已经讲完,这两个是最基础的形态学操作。这次讲的是开运算,它是一个先腐蚀、后膨胀的过程。原始图像先被腐蚀,这一步去除了白色前景物体的边缘毛刺、雪花噪声。然后再进行膨胀操作,回复原始前景物体的大小、或者连接因为腐蚀而断开的前景物体。
它就是用同一个结构元素,连续进行两次操作,所以开运算能够除去雪花噪声、毛刺,而前景物体的位置、形状、大小保持不变。
3.开运算的函数
Emgu CV中,开运算的函数定义如下:
public static void MorphologyEx(
IInputArray src, // 输入图像
IOutputArray dst, // 输入图像
MorphOp operation, // 操作方式,开运算是MorphOp.Open
IInputArray kernel, // 结构元素大小
Point anchor, // 锚点位置,默认为中心new Point(-1, -1)
int iterations, // 膨胀操作迭代次数
BorderType borderType, // 边界填充方式,一般取默认
MCvScalar borderValue // 边界值,使用时一般写成new MCvScalar()
)
注意哈,开运算和后面将要讲的闭运算,都是同一个函数MorphologyEx(),但是开运算的参数MorphOp operation,要指定为MorphOp.Open
二、演示
1.原始素材
原始素材srcMat是OpenCV官方使用的一张图片,图片内有不少的雪花噪声,如下图:
2.代码
Emgu CV开运算演示代码如下:
Mat tempMat = srcMat.Clone();
Mat gray = new Mat();
Mat dstMat = new Mat();
int kernelX = Convert.ToInt16(TextBoxX.Text.Trim().ToString()); // structuring element结构元素 或者 kernel 内核的X值,水平方向
int kernelY = Convert.ToInt16(TextBoxY.Text.Trim().ToString()); // structuring element结构元素 或者 kernel 内核的X值,垂直方向
int iterations = Convert.ToInt16(TextBoxIterations.Text.Trim().ToString()); // 需要执行开运算的次数
// 要转成灰度图
CvInvoke.CvtColor(tempMat, gray, ColorConversion.Bgr2Gray);
// 定义结构元素,其中元素的形状是矩形,size大小由两个文本框决定,默认锚点new Point(-1,-1)是指在中心
Mat element = CvInvoke.GetStructuringElement(ElementShape.Rectangle, new System.Drawing.Size(kernelX, kernelY), new System.Drawing.Point(-1, -1));
// 开运算,其中锚点位置new Point(-1, -1)代表中心
CvInvoke.MorphologyEx(gray, dstMat, MorphOp.Open, element, new System.Drawing.Point(-1, -1), iterations, BorderType.Default, new MCvScalar());
CvInvoke.Imshow("Gray, " + gray.Size.ToString(), gray);
CvInvoke.Imshow("Open, " + dstMat.Size.ToString(), dstMat);
注意哈,结构元素的内核要对水平方向和垂直方向分别定义。
3.运行结果
假设kernelX = 9,kernelY =9,iterations = 1, 开运算结果如下所示:
是不是雪花噪声没了,但是英文字母j的大小、形状、位置都没有变化?????。我们再换一张图,并且设kernelX = 19,kernelY =1,iterations = 1, 其灰度图和开运算结果如下所示:
原始图像有很多雪花噪声,而且水平、垂直方向都有前景,经过开运算后,雪花噪声没了,垂直方向的前景也消失了。就是因为它第一步腐蚀操作的特性:腐蚀时结构元素水平方向值越大,目标图像中竖向前景越容易被腐蚀。 。虽然后面执行了膨胀操作,但是因为上一步腐蚀时,垂直方向大片区域都已经变成0了,再膨胀也救不回来了。
如果假设kernelX = 1,kernelY =19,iterations = 1 ,输出的图像是这样:
去除雪花噪声的同时,消除了前景物体的水平区域,保留了前景物体的垂直区域,读者们能理解吧。
原创不易,请勿抄袭。共同进步,相互学习。