一、相关概念
1.什么叫顶帽
顶帽,英文名称是Top Hat,就是用 原始图像 - 开运算的原图,前面介绍了,开运算是先腐蚀后膨胀,因此能除去雪花噪声、毛刺,所以顶帽的作用就是获得雪花噪声、毛刺。
2.顶帽的函数
Emgu CV中,顶帽的函数定义如下:
public static void MorphologyEx(
IInputArray src, // 输入图像
IOutputArray dst, // 输入图像
MorphOp Tophat, // 操作方式,顶帽是MorphOp.Tophat
IInputArray kernel, // 结构元素大小
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.MorphologyEx(gray, dstMat, MorphOp.Tophat, element, new System.Drawing.Point(-1, -1), iterations, BorderType.Default, new MCvScalar());
CvInvoke.Imshow("Gray, " + gray.Size.ToString(), gray);
CvInvoke.Imshow("Close, " + dstMat.Size.ToString(), dstMat);
注意哈,结构元素的内核要对水平方向和垂直方向分别定义。
3.运行结果
假设kernelX = 3,kernelY = 3,iterations = 1, 顶帽运算结果如下所示:
仅剩下原始图形中矩形上的毛刺了。如果 kernelX = 19,kernelY =1,iterations = 1, 顶帽运算结果如下所示:
垂直方向保留的很多,水平方向基本没有了,为什么呢?因为开运算时, kernelX = 19,kernelY =1的特点就是水平方向保留的多,垂直方向消失了,所以用 原图 - 开运算,是不是就剩下垂直方向的了。
原创不易,请勿抄袭。共同进步,相互学习。