📜  收盘| C++中OpenCV的形态转换(1)

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

收盘| C++中OpenCV的形态转换

OpenCV是一款广泛应用于计算机视觉领域的开源库,其中形态学转换是图像处理中非常重要的一部分。形态学转换常常用于提取图像中的结构信息,例如图像的边缘、角点和区域等特征。

形态学转换的基础知识

形态学转换包括膨胀、腐蚀、开操作、闭操作等。其中,膨胀操作可以将对象的边界向外扩张,而腐蚀操作可以将对象的边界向内收缩。开操作先进行腐蚀操作,然后进行膨胀操作,可以用于去除小的噪点。闭操作先进行膨胀操作,然后进行腐蚀操作,可以用于填充闭合的区域。

在OpenCV中,形态学转换可以通过cv::dilate、cv::erode、cv::morphologyEx函数来实现。以膨胀操作为例,其函数用法如下:

void cv::dilate(
  InputArray src, // 输入图像
  OutputArray dst, // 输出图像
  InputArray kernel, // 运算核
  Point anchor = Point(-1,-1), // 锚点
  int iterations = 1, // 迭代次数
  int borderType = BORDER_CONSTANT, // 边缘填充方式
  const Scalar& borderValue = morphologyDefaultBorderValue() // 边缘填充值
);

其中,输入图像src和输出图像dst都是cv::Mat类型的数据,运算核kernel也是cv::Mat类型的矩阵。在进行膨胀操作时,我们通常使用方形或圆形的运算核,在函数中可以通过cv::getStructuringElement函数生成。锚点anchor表示运算核中心的位置,默认为坐标(-1,-1),表示运算核中心与对称中心重合。迭代次数iterations表示膨胀操作的次数。边缘填充方式borderType表示对边缘进行填充的方式,通常为BORDER_CONSTANT或BORDER_REPLICATE。边缘填充值borderValue表示填充的值,默认为morphologyDefaultBorderValue(),该函数返回Scalar(0)。

OpenCV的形态学转换实例

下面给出一个使用OpenCV进行形态学转换的实例,其中我们将使用cv::morphologyEx函数进行开操作和闭操作。

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main() {
    Mat src = imread("test.jpg", IMREAD_GRAYSCALE);
    if (src.empty()) {
        cerr << "Image not found!" << endl;
        return -1;
    }

    Mat element = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
    Mat dst1, dst2;

    morphologyEx(src, dst1, MORPH_OPEN, element); // 进行开操作
    morphologyEx(src, dst2, MORPH_CLOSE, element); // 进行闭操作

    imshow("src", src);
    imshow("open", dst1);
    imshow("close", dst2);
    waitKey();

    return 0;
}

其中,我们使用imread函数读取灰度图像"test.jpg",如果图像不存在则输出错误信息。然后使用getStructuringElement函数生成一个3x3的方形运算核。接着,通过cv::morphologyEx函数分别进行开操作和闭操作,并将结果在窗口中显示。当用户按下任意键时,程序结束。

以上就是关于C++中OpenCV的形态学转换的介绍。