图像腐蚀
视频讲解如下:
当前系列所有demo下载地址:
https://github.com/GaoRenBao/OpenCv4-Demo
不同编程语言对应的OpenCv版本以及开发环境信息如下:
语言 | OpenCv版本 | IDE |
C# | OpenCvSharp4.4.8.0.20230708 | Visual Studio 2022 |
C++ | OpenCv-4.5.5-vc14_vc15 | Visual Studio 2022 |
Python | OpenCv-Python (4.6.0.66) | PyCharm Community Edition 2022.1.3 |
图像腐蚀用到的主要函数为:Erode
函数原型如下:
void erode(InputArray src, OutputArray dst, InputArray kernel, Point anchor=Point(-1,-1),int iterations=1,
int borderType=BORDER_CONSTANT,const Scalar& borderValue=morphologyDefaultBorderValue());
使用 erode 函数,一般我们只需要填前面的三个参数,后面的四个参数都有默认值。而且往往结合 getStructuringElement 一起使用。
其中:
第一个参数:InputArray 类型的 src,输入图像,即源图像,填 Mat 类的对象即可。图像通道的数量可以是任意的,但图像深度应为 CV_8U,CV_16U,CV_16S,CV_32F 或 CV_64F 其中之一。
第二个参数:OutputArray 类型的 dst,即目标图像,需要和源图片有一样的尺寸和类型。
第三个参数:InputArray 类型的 kernel,腐蚀操作的内核。若为 NULL 时,表示的是使用参考点位于中心 3x3 的核。我们一般使用函数 getStructuringElement 配合这个参数的使用。getStructuringElement 函数会返回指定形状和尺寸的结构元素(内核矩阵)。(具体看上文中浅出部分 dilate 函数的第三个参数讲解部分)
第四个参数:Point 类型的 anchor,锚的位置,其有默认值(-1,-1),表示锚位于单位(element)的中心,我们一般不用管它。
第五个参数:int 类型的 iterations,迭代使用 erode()函数的次数,默认值为 1。
第六个参数:int 类型的 borderType,用于推断图像外部像素的某种边界模式。注意它有默认值 BORDER_DEFAULT。
第七个参数:const Scalar&类型的 borderValue,当边界为常数时的边界值,有默值 morphologyDefaultBorderValue(),一般我们不用去管他。需要用到它时,可以看官方文档中的 createMorphologyFilter()函数得到更详细的解释。
首先需要准备一张图片girl.jpg,如下:

当经过图像腐蚀后的效果如下:

下面给大家演示了C#、C++、Python这三种环境下是如何进行图像腐蚀的。
C#版本代码如下:
C#版本需要安装“OpenCvSharp4”、“OpenCvSharp4.runtime.win”两个库才行。不然会报错。
如果需要使用“ BitmapConverter.ToBitmap”操作,则需要追加安装“OpenCvSharp4.Extensions”库。
using OpenCvSharp;
namespace demo
{
internal class Program
{
static void Main(string[] args)
{
Mat srcImage = Cv2.ImRead("../../../images/girl.jpg");
// 在窗口中显示原画
Cv2.ImShow("原图", srcImage);
// 进行腐蚀操作
Mat element = Cv2.GetStructuringElement(MorphShapes.Rect, new OpenCvSharp.Size() { Width = 15, Height = 15 });
Mat dstImage = new Mat();
Cv2.Erode(srcImage, dstImage, element);
Cv2.ImShow("效果", dstImage);
Cv2.WaitKey(0);
// 输出图像到pictureBox控件
//Bitmap map = BitmapConverter.ToBitmap(dstImage);
//pictureBox1.Image = map;
//// 弹窗显示图像
//using (new Window("效果", dstImage))
//{
// Cv2.WaitKey();
//}
}
}
}
C++版本代码如下:
#include <vector>
#include <stdio.h>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
// 读入一张图片
Mat srcImage = imread("../images/girl.jpg");
// 在窗口中显示原画
imshow("原图", srcImage);
// 进行腐蚀操作
Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
Mat dstImage;
erode(srcImage, dstImage, element);
// 显示效果图
imshow("效果", dstImage);
// 等待任意键按下
waitKey(0);
return 0;
}
Python版本代码如下:
import cv2
# 载入图片
srcImage = cv2.imread('../images/girl.jpg')
# 显示原图
cv2.imshow('srcImage', srcImage)
# 腐蚀图像
element = cv2.getStructuringElement(cv2.MORPH_RECT, (15, 15))
srcImage = cv2.erode(srcImage, element)
# 显示效果
cv2.imshow('out', srcImage)
cv2.waitKey(0)
cv2.destroyAllWindows()