膨胀原理:
跟卷积操作相似,假设有图像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)
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;
///
/// 图像膨胀与腐蚀
///
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);
}