图片处理二--使用OpenCV库实现图片膨胀腐蚀

1.什么是形态学操作?

形态学操作就是基于形状的一系列图像处理操作。通过将结构元素作用于输入图像来产生输出图像
最基本的形态学操作有二:腐蚀与膨胀(Erosion 与 Dilation)。 他们的运用广泛:

  • 消除噪声
  • 分割独立的图像元素,以及连接(相邻的元素。
  • 寻找图像中的明显的极大值区域或极小值区域。

腐蚀和膨胀都是针对白色部分(高亮部分)而言的

2.二值化处理

首先,在讲膨胀腐蚀之前,先来看一下如何实现图片二值化。因为不管是膨胀还是腐蚀,图像都必须先二值化处理

介绍一下二值化处理方法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相同大小和类型以及相同通道数的图像。
图片处理二--使用OpenCV库实现图片膨胀腐蚀_第1张图片

2.1 全局阈值使用THRESH_OTSU大津法

Cv2.Threshold(src, src, 0, 255, ThresholdTypes.Binary | ThresholdTypes.Otsu);//二值化

2.2 全局阈值使用THRESH_TRIANGLE(三角形算法)

Cv2.Threshold(src, src, 0, 255, ThresholdTypes.Binary | cv.THRESH_TRIANGLE);//二值化

2.3 THRESH_BINARY_INV大于阈值的都为0

cv.threshold(gray,127,255,cv.THRESH_BINARY_INV)

3.图片腐蚀

具体操作是:用一个结构元素扫描图像中的每一个像素,用结构元素中的每一个像素与其覆盖的像素做“与”操作,如果都为1,则该像素为1,否则为0。如下图所示,结构A被结构B腐蚀后:
图片处理二--使用OpenCV库实现图片膨胀腐蚀_第2张图片

腐蚀的作用是消除物体边界点,使目标缩小,可以消除小于结构元素的噪声点。

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

腐蚀效过(黑色区域逐渐扩大腐蚀)
图片处理二--使用OpenCV库实现图片膨胀腐蚀_第3张图片图片处理二--使用OpenCV库实现图片膨胀腐蚀_第4张图片图片处理二--使用OpenCV库实现图片膨胀腐蚀_第5张图片

定义结构元素方法:

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) 进行各类形态学的变化
参数说明:

  • src:传入的图片
  • op:进行变化的方式
    • op = cv2.MORPH_OPEN 进行开运算,指的是先进行腐蚀操作,再进行膨胀操作
    • op = cv2.MORPH_CLOSE 进行闭运算, 指的是先进行膨胀操作,再进行腐蚀操作
  • kernel:表示方框的大小

开运算:表示的是先进行腐蚀,再进行膨胀操作
闭运算:表示先进行膨胀操作,再进行腐蚀操作

图片处理二--使用OpenCV库实现图片膨胀腐蚀_第6张图片

4.图片膨胀

用一个结构元素扫描图像中的每一个像素,用结构元素中的每一个像素与其覆盖的像素做“与”操作,如果都为0,则该像素为0,否则为1。如下图所示,结构A被结构B腐蚀后:
图片处理二--使用OpenCV库实现图片膨胀腐蚀_第7张图片
膨胀的作用是将与物体接触的所有背景点合并到物体中,使目标增大,可添补目标中的孔洞。

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;

膨胀效果图(白色区域逐渐扩张放大)
图片处理二--使用OpenCV库实现图片膨胀腐蚀_第8张图片
图片处理二--使用OpenCV库实现图片膨胀腐蚀_第9张图片图片处理二--使用OpenCV库实现图片膨胀腐蚀_第10张图片

你可能感兴趣的:(.net,客户端设计,opencv,人工智能,深度学习)