一:形态学操作(morphology operators)- 膨胀与腐蚀
- 图像形态学操作 – 基于形状的一系列图像处理操作的集合,主要是基于集合理论基础上的形态学数学
- 形态学基本的四个操作 : 腐蚀,膨胀,开,闭
- 膨胀和腐蚀是图像处理中最常用的形态学操作手段
膨胀原理:
跟卷积操作相似,假设有图像A和结构元素B,结构元素B在A上面移动,其中B定义其中心点为锚点,计算B覆盖下A的最大像素值用来替换锚点的像素,其中结构体B可以是任意形状。
腐蚀原理:
腐蚀与膨胀的操作的过程一样,不同的是以最小值替换锚点重叠下的像素值。
公式:
膨胀
o
u
t
p
u
t
(
x
,
y
)
=
max
(
x
1
,
y
1
)
:
e
l
e
m
e
n
t
(
x
1
,
y
1
)
不
等
于
0
s
r
c
(
x
+
x
1
,
y
+
y
1
)
output(x,y)= \max_{(x1,y1):element(x1,y1){不等于0}} src(x+x1,y+y1)
output(x,y)=(x1,y1):element(x1,y1)不等于0maxsrc(x+x1,y+y1)
腐蚀
o u t p u t ( x , y ) = min ( x 1 , y 1 ) : e l e m e n t ( x 1 , y 1 ) 不 等 于 0 s r c ( x + x 1 , y + y 1 ) output(x,y)= \min_{(x1,y1):element(x1,y1){不等于0}} src(x+x1,y+y1) output(x,y)=(x1,y1):element(x1,y1)不等于0minsrc(x+x1,y+y1)
二:API介绍
Cv2.GetStructuringElement(): 获取结构元素
参数 | 描述 |
---|---|
MorphShapes shape | 结果元素的形状,枚举类型 |
Size ksize | 结构元素的大小 |
Point anchor | 结构元素的锚点(中心点) |
Cv2.Dilate(): 膨胀,通过使用特定的结构元素来扩展图像。
参数 | 描述 |
---|---|
InputArray src | 源图像 |
OutputArray dst | 输出图像 |
InputArray element | 结构元素,一定要是奇数 |
Point? anchor = null | 锚点位置,默认是null |
int iterations = 1 | 应用膨胀的次数。[默认情况下这是1] |
borderType = BorderTypes.Constant | 图像边缘处理方法。[默认情况下这是BorderType.Constant] |
Scalar? borderValue = null | 在边界为常数的情况下的边界值。默认值具有特殊意义。[默认情况下这是cvcp . morphologydefaultbordervalue ()] |
Cv2.Erode(): 腐蚀,通过使用特定的结构元素来侵蚀图像。
参数 | 描述 |
---|---|
InputArray src | 源图像 |
OutputArray dst | 输出图像 |
InputArray element | 结构元素 ,一定要是奇数 |
Point? anchor = null | 锚点位置,默认是null |
int iterations = 1 | 应用侵蚀的次数。[默认情况下这是1] |
borderType = BorderTypes.Constant | 图像边缘处理方法。[默认情况下这是BorderType.Constant] |
Scalar? borderValue = null | 在边界为常数的情况下的边界值。默认值具有特殊意义。[默认情况下这是cvcp . morphologydefaultbordervalue ()] |
三:代码:
static void Main(string[] args)
{
string imagePath1 = @"C:\Users\whx\Desktop\opcvImage\ss.jpg";
ExpansionAndCorrosion(imagePath1);
}
#region 图像膨胀与腐蚀
static int elementSize = 0;//初始化
static int maxSize = 21; //滑动效果最大值
static Mat src;
/// <summary>
/// 图像膨胀与腐蚀
/// </summary>
private static void ExpansionAndCorrosion(string path)
{
using (src = new Mat(path, ImreadModes.AnyColor | ImreadModes.AnyDepth))
using (Mat dst = new Mat(src.Size(), src.Type()))
{
//CvTrackbarCallback2 :窗口动态调整
CvTrackbarCallback2 cvCallback = new CvTrackbarCallback2(CallBackDome);
Cv2.ImShow("SRC", src);
src.CopyTo(dst);
Cv2.ImShow("DST", dst);
CvTrackbar cvt = new CvTrackbar("Bar :", "DST", elementSize, maxSize, cvCallback, dst);
Cv2.WaitKey();
}
}
private static void CallBackDome(int size, object userdate)
{
//不用using 释放掉就不能处理了
Mat s1 = (Mat)userdate;
size = size * 2 + 1; //要为奇数
Mat se = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(size, size), new Point(-1, -1));
//膨胀
Cv2.Dilate(src, s1, se, new Point(-1, -1), 1);
//腐蚀
//Cv2.Erode(src, s1, se, new Point(-1, -1), 1);
//Cv2.ImShow("DST", s1);
new Window("DST",WindowMode.Normal ,s1);
}
#endregion
效果
图为系数为1时,膨胀效果
把系数跳到3时,膨胀效果进一步加深。
下面看腐蚀效果,把膨胀代码注释掉。
private static void CallBackDome(int size, object userdate)
{
//不用using 释放掉就不能处理了
Mat s1 = (Mat)userdate;
size = size * 2 + 1; //要为奇数
Mat se = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(size, size), new Point(-1, -1));
//膨胀
//Cv2.Dilate(src, s1, se, new Point(-1, -1), 1);
//腐蚀
Cv2.Erode(src, s1, se, new Point(-1, -1), 1);
//Cv2.ImShow("DST", s1);
new Window("DST",WindowMode.Normal ,s1);
}
图为系数为2时,腐蚀效果
把系数调到4时,腐蚀效果进一步加深。
腐蚀就是变大,加粗,膨胀是变小,变细???