形态学其他操作
**开运算, 闭运算, 顶帽, 黑帽, 形态学梯度函数原型:

  1. public static void MorphologyEx(InputArray src,
  2. OutputArray dst,
  3. MorphTypes op,
  4. InputArray? element,
  5. Point? anchor = null,
  6. int iterations = 1,
  7. BorderTypes borderType = BorderTypes.Constant,
  8. Scalar? borderValue = null);

op:
=0: 腐蚀=1: 膨胀=2: 开运算=3: 闭运算=4: 形态学梯度=5: 顶帽=6: 黑帽iterations :迭代次数**

1, 开运算:

开运算是先腐蚀, 后膨胀的过程, 可以去掉小的对象

Mat src = new Mat(@"I:\OpenCvSharp学习\10副本.jpg", ImreadModes.AnyColor);
Window srcWin = new Window("src", WindowMode.AutoSize, src);

Mat Close = new Mat();
Mat element = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(7, 7), new Point(-1, -1));

Cv2.MorphologyEx(src, Close, MorphTypes.Open, element);
Window dstWin = new Window("Open", WindowMode.AutoSize, Close);
Cv2.WaitKey(0);

image.png

2,闭运算:

闭运算 是先膨后腐蚀的顺序 ,可以填充图像中细小的空洞

Mat src = new Mat(@"I:\OpenCvSharp学习\11副本.jpg", ImreadModes.AnyColor);
Window srcWin = new Window("src", WindowMode.AutoSize, src);

Mat Close = new Mat();
Mat element = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(7, 7), new Point(-1, -1));

Cv2.MorphologyEx(src, Close, MorphTypes.Close, element);
Window dstWin = new Window("Close", WindowMode.AutoSize, Close);
Cv2.WaitKey(0);

image.png

3,形态学梯度

形态学梯度是用膨胀图减去腐蚀图,可以将图像边缘凸现出来,可以用其来保留边缘轮廓

Mat src = new Mat(@"I:\OpenCvSharp学习\2.jpg", ImreadModes.AnyColor);
Cv2.CvtColor(src, src, ColorConversionCodes.BGR2GRAY);
Window srcWin = new Window("src", WindowMode.AutoSize, src);

Mat Gradient = new Mat();
Mat element = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(7, 7), new Point(-1, -1));

Cv2.MorphologyEx(src, Gradient, MorphTypes.Gradient, element);
Window dstWin = new Window("Gradient", WindowMode.AutoSize, Gradient);
Cv2.WaitKey(0);

image.png

4,顶帽

顶帽是源图像与开运算的图像相减,用来分离比领近点亮一些的斑块

Mat src = new Mat(@"I:\OpenCvSharp学习\12.jpg", ImreadModes.AnyColor);

Window srcWin = new Window("src", WindowMode.AutoSize, src);
Mat TopHat = new Mat();
Mat element = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(7, 7), new Point(-1, -1));

Cv2.MorphologyEx(src, TopHat, MorphTypes.TopHat, element);
Window dstWin = new Window("TopHat", WindowMode.AutoSize, TopHat);
Cv2.WaitKey(0);

image.png


5,黑帽

黑帽是闭运算图像与源图像做差,用来分离比领近点暗一些的斑块

Mat src = new Mat(@"I:\OpenCvSharp学习\12.jpg", ImreadModes.AnyColor);

Window srcWin = new Window("src", WindowMode.AutoSize, src);
Mat BlackHat = new Mat();
Mat element = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(7, 7), new Point(-1, -1));

Cv2.MorphologyEx(src, BlackHat, MorphTypes.BlackHat, element);
Window dstWin = new Window("BlackHat", WindowMode.AutoSize, BlackHat);
Cv2.WaitKey(0);

image.png