📜  侵蚀和膨胀| C ++中OpenCV的形态转换(1)

📅  最后修改于: 2023-12-03 15:36:42.713000             🧑  作者: Mango

侵蚀和膨胀| C++中OpenCV的形态转换

在图像处理中,形态转换是一种常用的操作,它可以改变图像的形状或大小。常见的形态转换包括侵蚀、膨胀、开运算、闭运算等。

在OpenCV中,可以通过调用morphologyEx函数来实现形态转换。morphologyEx函数的原型如下:

void morphologyEx(InputArray src, OutputArray dst, int op, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue());

其中,参数的含义如下:

  • src:输入图像
  • dst:输出图像
  • op:形态转换的类型,可以根据需求设置为MORPH_ERODE(侵蚀)、MORPH_DILATE(膨胀)、MORPH_OPEN(开运算)、MORPH_CLOSE(闭运算)等
  • kernel:卷积核,用于控制形态转换的效果
  • anchor:锚点,用于指定卷积核的中心位置
  • iterations:形态转换的迭代次数
  • borderType:边界类型,可以设置为BORDER_CONSTANT(常数边界)、BORDER_REPLICATE(复制边界)等
  • borderValue:当边界类型为BORDER_CONSTANT时,指定的边界值

下面我们分别介绍侵蚀和膨胀的用法。

侵蚀

侵蚀是一种形态转换,它可以用于图像的细化、去噪等操作。侵蚀操作的原理是将卷积核与图像进行卷积,对于每个像素,只有卷积核中的所有像素都是前景像素时,该像素才被认为是前景像素,否则该像素被视为背景像素。经过侵蚀操作后,前景像素会逐渐被消除,同时也会使图像变得更加清晰。

下面是侵蚀操作的代码示例:

// 读取图像
Mat src = imread("image.jpg");

// 将图像转为灰度图
Mat gray;
cvtColor(src, gray, COLOR_BGR2GRAY);

// 进行二值化处理
Mat binary;
threshold(gray, binary, 150, 255, THRESH_BINARY);

// 定义卷积核
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));

// 进行侵蚀操作
Mat dst;
erode(binary, dst, kernel);

// 显示结果
imshow("Original", src);
imshow("Eroded", dst);
waitKey(0);

在上述代码中,我们首先读取了一张图像,并将其转为灰度图。接着,我们将灰度图进行二值化处理,从而得到一个二值化图像。然后,我们定义了一个3x3的矩形卷积核,并对二值化图像进行了侵蚀操作。最后,我们将原始图像和处理后的图像分别显示出来。

在上述代码中,我们使用了getStructuringElement函数来创建卷积核。getStructuringElement函数的原型如下:

Mat getStructuringElement(int shape, Size ksize, Point anchor=Point(-1,-1))

其中,参数的含义如下:

  • shape:卷积核的形状,可以设置为MORPH_RECT(矩形)、MORPH_CROSS(十字形)或MORPH_ELLIPSE(椭圆形)
  • ksize:卷积核的大小,必须为正数
  • anchor:卷积核的中心位置,可以设置为Point(-1,-1)表示将自动计算卷积核的中心位置
膨胀

膨胀是一种形态转换,它可以用于图像的扩张、填充等操作。膨胀操作的原理是将卷积核与图像进行卷积,对于每个像素,只要卷积核中有一个像素是前景像素,该像素就被视为前景像素。经过膨胀操作后,前景像素会逐渐扩张,同时也会使图像变得更加粗糙。

下面是膨胀操作的代码示例:

// 读取图像
Mat src = imread("image.jpg");

// 将图像转为灰度图
Mat gray;
cvtColor(src, gray, COLOR_BGR2GRAY);

// 进行二值化处理
Mat binary;
threshold(gray, binary, 150, 255, THRESH_BINARY);

// 定义卷积核
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));

// 进行膨胀操作
Mat dst;
dilate(binary, dst, kernel);

// 显示结果
imshow("Original", src);
imshow("Dilated", dst);
waitKey(0);

在上述代码中,我们首先读取了一张图像,并将其转为灰度图。接着,我们将灰度图进行二值化处理,从而得到一个二值化图像。然后,我们定义了一个3x3的矩形卷积核,并对二值化图像进行了膨胀操作。最后,我们将原始图像和处理后的图像分别显示出来。

在形态转换中,卷积核的大小和形状是关键因素。如果卷积核过大或形状过于复杂,可能会导致图像的失真或无法完成所需的操作。因此,在实际使用中需要结合具体情况来选择合适的卷积核。