📜  渐变| C ++中OpenCV的形态转换(1)

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

渐变 | C++中OpenCV的形态转换

OpenCV是一个机器视觉和图像处理的开源库,提供了丰富的函数和工具,可以方便地进行图像处理。其中形态学转换是一种常见的操作,常用于图像处理中的去噪、分割、提取特征等领域。本文将介绍OpenCV中的形态转换之一——渐变。

渐变是什么

渐变(也称为边缘保留膨胀)是一种形态学操作,用于检测图像中的边缘。渐变操作通过求解一幅图像膨胀和腐蚀之间的差异来实现。

具体来说,渐变可以被定义为一幅图像I的膨胀图像D(I)和腐蚀图像E(I)的差异。渐变图将保留原始图像的边缘,而在不影响整体形状的情况下放大它们。

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:源图像,8位单通道图像。
  • dst:输出图像,与源图像相同大小和类型。
  • op:操作类型,可选的操作有:
    • MORPH_GRADIENT:渐变操作
    • MORPH_TOPHAT:顶帽操作
    • MORPH_BLACKHAT:黑帽操作
    • MORPH_OPEN:开运算
    • MORPH_CLOSE:闭运算
  • kernel:结构元素,用于设置操作的形状和大小。
  • anchor:结构元素的锚点,默认为(-1,-1),即结构元素的中心。
  • iterations:操作的迭代次数,默认为1。
  • borderType:输入图像的边界类型,默认为BORDER_CONSTANT
  • borderValue:输入图像的边界值,默认为morphologyDefaultBorderValue()

以下是使用OpenCV实现渐变的示例代码:

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

using namespace cv;
using namespace std;

int main() {
    Mat src = imread("lena.jpg", IMREAD_GRAYSCALE);  // 读取灰度图像
    if (src.empty()) {
        cerr << "Failed to read image" << endl;
        return -1;
    }
    
    Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3));  // 创建3x3的矩形形态学结构元素
    
    Mat gradient;
    morphologyEx(src, gradient, MORPH_GRADIENT, kernel);
    
    imshow("Original Image", src);
    imshow("Gradient Image", gradient);
    
    waitKey(0);
    return 0;
}

在上述示例代码中,我们首先读取了一幅灰度图像,然后使用getStructuringElement函数创建了一个3x3的矩形形态学结构元素。最后,我们调用morphologyEx函数并将其应用于源图像,得到渐变图像,最终将原始图像和渐变图像显示在窗口中。

总结

本文介绍了OpenCV中的形态学转换之一——渐变。渐变操作是一种用于检测图像边缘的形态学操作。通过求解膨胀和腐蚀之间的差异来实现。我们使用OpenCV的morphologyEx函数来实现渐变操作,并对示例代码进行了解释。希望这篇文章对你有所帮助!