形态学操作就是基于形状的一系列图像处理操作。通过将结构元素作用于输入图像来产生输出图像
最基本的形态学操作有二:腐蚀与膨胀(Erosion 与 Dilation)。 他们的运用广泛:
腐蚀和膨胀都是针对白色部分(高亮部分)而言的
首先,在讲膨胀腐蚀之前,先来看一下如何实现图片二值化。因为不管是膨胀还是腐蚀,图像都必须先二值化处理
介绍一下二值化处理方法Threshold
OpenCV的threshold函数进行全局阈值。其函数原型为:
Threshold(InputArray src, OutputArray dst, double thresh, double
maxval, ThresholdTypes type)
src:输入图像(多通道,8位或32位浮点)。
thresh:表示阈值。
maxval:与THRESH_BINARY和THRESH_BINARY_INV阈值类型一起使用设置的最大值。
type:表示阈值类型。
retval:返回的阈值。若是全局固定阈值算法,则返回thresh参数值。若是全局自适应阈值算法,则返回自适应计算得出的合适阈值。
dst:输出与src相同大小和类型以及相同通道数的图像。
Cv2.Threshold(src, src, 0, 255, ThresholdTypes.Binary | ThresholdTypes.Otsu);//二值化
Cv2.Threshold(src, src, 0, 255, ThresholdTypes.Binary | cv.THRESH_TRIANGLE);//二值化
cv.threshold(gray,127,255,cv.THRESH_BINARY_INV)
具体操作是:用一个结构元素扫描图像中的每一个像素,用结构元素中的每一个像素与其覆盖的像素做“与”操作,如果都为1,则该像素为1,否则为0。如下图所示,结构A被结构B腐蚀后:
腐蚀的作用是消除物体边界点,使目标缩小,可以消除小于结构元素的噪声点。
Cv2.CvtColor(src, src, ColorConversionCodes.BGR2GRAY, 0);//转灰度图
Cv2.Threshold(src, src, 0, 255, ThresholdTypes.Binary | ThresholdTypes.Otsu);//二值化
//Cv2.Threshold(src, src, 127, 255, ThresholdTypes.BinaryInv);//二值化
//src =src.Threshold(80, 255, ThresholdTypes.Binary);
Mat dst = new Mat();
//:定义结构元素
InputArray kernel = Cv2.GetStructuringElement(MorphShapes.Rect, new OpenCvSharp.Size(size, size), new OpenCvSharp.Point(-1, -1));
//闭操作,也可省落变量前缀名
Cv2.MorphologyEx(src: src, dst: dst, op: MorphTypes.ERODE, element: kernel, anchor: new OpenCvSharp.Point(-1, -1));
return dst
定义结构元素方法:
GetStructuringElement(MorphShapes.Rect, new OpenCvSharp.Size(size, size), new OpenCvSharp.Point(-1, -1))
函数的第一个参数表示内核的形状,有三种形状可以选择。
矩形:MORPH_RECT;
交叉形:MORPH_CROSS;
椭圆形:MORPH_ELLIPSE;
第二和第三个参数分别是内核的尺寸以及锚点的位置。一般在调用erode以及dilate函数之前,先定义一个Mat类型的变量来获得
getStructuringElement函数的返回值: 对于锚点的位置,有默认值Point(-1,-1),表示锚点位于中心点。element形状唯一依赖锚点位置,其他情况下,锚点只是影响了形态学运算结果的偏移
cv2.morphologyEx(src, op, kernel) 进行各类形态学的变化
参数说明:
开运算:表示的是先进行腐蚀,再进行膨胀操作
闭运算:表示先进行膨胀操作,再进行腐蚀操作
用一个结构元素扫描图像中的每一个像素,用结构元素中的每一个像素与其覆盖的像素做“与”操作,如果都为0,则该像素为0,否则为1。如下图所示,结构A被结构B腐蚀后:
膨胀的作用是将与物体接触的所有背景点合并到物体中,使目标增大,可添补目标中的孔洞。
Cv2.CvtColor(src, src, ColorConversionCodes.BGR2GRAY, 0);//转灰度图
Cv2.Threshold(src, src, 0, 255, ThresholdTypes.Binary | ThresholdTypes.Otsu);//二值化
//Cv2.Threshold(src, src, 127, 255, ThresholdTypes.BinaryInv);//二值化
//src = src.Threshold(80, 255, ThresholdTypes.Binary);
var dst = new Mat();
//:定义结构元素
InputArray kernel = Cv2.GetStructuringElement(MorphShapes.Rect, new OpenCvSharp.Size(size, size), new OpenCvSharp.Point(-1, -1));
//闭操作,也可省落变量前缀名
Cv2.MorphologyEx(src: src, dst: dst, op: MorphTypes.DILATE, element: kernel, anchor: new OpenCvSharp.Point(-1, -1));
return dst;