文章目录
- 一、膨胀
- 1.什么叫膨胀
- 2.膨胀的作用
- 3.膨胀的函数
- 三、演示
- 1.原始素材
- 2.代码
- 3.运行结果
一、膨胀
1.什么叫膨胀
前面讲的是腐蚀,与其相反的操作,就是膨胀。二值化图片以黑色为背景,白色为前景物体。膨胀就是扩张前景物体的边缘。其原理是将一个结构元素在图像上滑动,选取原图中结构元素计算区域内最大值作为输出值。
假设有一副图像如下图,灰色底色是背景,黄色底色是前景物体。
定义一个结构元素,大小是3 * 3,也就是这样的
如果对左侧绿底色的0那个点做膨胀操作,根据结构元素大小,提取出的计算区域是
在这9个值中,最大值就是0,所以目标图像的输出结果也是0。如果对右边绿底色0进行膨胀呢,它提取出的计算区域是
因为9个值里面最大值是255,因此这个点的膨胀结果,是255。
2.膨胀的作用
膨胀操作可以去除白色前景物体内的黑色斑点,也可以连接两个白色前景。
3.膨胀的函数
Emgu CV中,膨胀的函数定义如下:
public static void Dilate(IInputArray src, // 输入图像IOutputArray dst, // 输入图像IInputArray element, // 结构元素大小Point anchor, // 锚点位置,默认为中心new Point(-1, -1)int iterations, // 膨胀操作迭代次数BorderType borderType, // 边界填充方式,一般取默认MCvScalar borderValue // 边界值,使用时一般写成new MCvScalar()
)
三、演示
1.原始素材
原始素材定义为srcMat,是一张黑色背景,白色前景的图像,而且白色区域内有很多黑色胡椒噪声。
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.Dilate(gray, dstMat, element, new System.Drawing.Point(-1, -1), iterations, BorderType.Default, new MCvScalar());
CvInvoke.Imshow("Gray, " + gray.Size.ToString(), gray);
CvInvoke.Imshow("Dilate, " + dstMat.Size.ToString(), dstMat);
注意哈,结构元素的内核要对水平方向和垂直方向分别定义。
3.运行结果
假设kernelX = 7,kernelY =7,iterations = 1, 其膨胀结果如下所示:
白色区域边缘往外扩张了,而且内部的黑色胡椒噪声也没有了,仔细看的话原始图像中不相连(中断)的两个前景也合并在一起了。假设kernelX = 17,kernelY =1,iterations = 1, 其膨胀结果如下所示:
水平方向的前景轮廓往外扩张的很多,导致Emgu这四个英文字母已经连载一起了,因为水平方向的计算区域是17,也就是17个邻域空间内,取最大值,当然会把更多的点变成255。垂直方向是1,也就是垂直方向的邻域空间只计算目标点本身。
膨胀操作记住结论:
1、结构元素水平方向值越大,目标图像中水平前景边缘扩张越大。
2、结构元素垂直方向值越大,目标图像中垂直前景边缘扩张越大。
3、iterations(执行次数)越大,目标图像边缘向外扩张越大。
原创不易,请勿抄袭。共同进步,相互学习。