C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > opencv 腐蚀

c/c++中opencv实现腐蚀的示例代码

作者:whoarethenext

图像腐蚀是形态学图像处理中的一种基本操作,OpenCV的cv::erode函数实现该功能,具有一定的参考价值,感兴趣的了解一下

图像腐蚀 (Erosion) 是形态学图像处理中的一种基本操作。它通常用于去除图像中的小型噪声、分离连接的物体以及细化二值图像中的物体。本文将详细介绍腐蚀的原理,并演示如何使用 C++ 和 OpenCV 库来实现图像腐蚀。

什么是图像腐蚀?

图像腐蚀可以被看作是用一个特定的结构元素(也称为核或掩模)“探测”或“扫描”输入图像的过程。对于二值图像,如果结构元素下的所有像素都为前景像素(通常为白色,值为1或255),则输出图像中结构元素锚点对应的像素才被置为前景像素,否则置为背景像素(通常为黑色,值为0)。对于灰度图像,输出像素的值是结构元素覆盖区域内所有像素的最小值。

简单来说,腐蚀操作会:

其效果就像是用结构元素“腐蚀”掉前景物体的边界。

结构元素 (Kernel)

结构元素是一个小的二值矩阵(或灰度矩阵),它定义了腐蚀操作的邻域范围和形状。结构元素的中心点通常被称为“锚点”。OpenCV 提供了 cv::getStructuringElement() 函数来方便地创建常见的结构元素。

常用的结构元素形状包括:

// 创建一个 5x5 大小的矩形结构元素
cv::Mat kernel_rect = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5));

// 创建一个 5x5 大小的椭圆形结构元素
cv::Mat kernel_ellipse = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(5, 5));

// 创建一个 5x5 大小的十字形结构元素
cv::Mat kernel_cross = cv::getStructuringElement(cv::MORPH_CROSS, cv::Size(5, 5));

结构元素的大小和形状对腐蚀结果有显著影响。

OpenCV 中的 cv::erode() 函数

OpenCV 提供了 cv::erode() 函数来实现图像腐蚀。

函数原型:

void cv::erode(
    cv::InputArray src,         // 输入图像
    cv::OutputArray dst,        // 输出图像
    cv::InputArray kernel,      // 用于腐蚀的结构元素
    cv::Point anchor = cv::Point(-1,-1), // 结构元素内锚点的位置。默认值 (-1,-1) 表示锚点在核中心。
    int iterations = 1,         // 腐蚀操作迭代次数
    int borderType = cv::BORDER_CONSTANT, // 像素外推方法
    const cv::Scalar& borderValue = cv::morphologyDefaultBorderValue() //边界不变时的边界值
);

参数说明:

C++ 代码示例

下面是一个完整的 C++ 示例,演示了如何加载图像并对其进行腐蚀操作:

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

int main(int argc, char** argv) {
    // 1. 加载图像
    // 将 "your_image_path.png" 替换为你的图像路径
    cv::Mat srcImage = cv::imread("your_image_path.png", cv::IMREAD_COLOR);

    // 检查图像是否成功加载
    if (srcImage.empty()) {
        std::cerr << "错误: 无法加载图像!" << std::endl;
        return -1;
    }

    // 2. 创建腐蚀后的输出图像
    cv::Mat erodedImage;

    // 3. 定义结构元素 (核)
    // 尝试不同的形状和大小
    // int erosion_size = 3; // 核大小,可以调整
    // cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT,
    //                                           cv::Size(2 * erosion_size + 1, 2 * erosion_size + 1),
    //                                           cv::Point(erosion_size, erosion_size));

    // 使用一个简单的 5x5 矩形核
    cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5));
    // 你也可以尝试:
    // cv::Mat element = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(5, 5));
    // cv::Mat element = cv::getStructuringElement(cv::MORPH_CROSS, cv::Size(5, 5));

    // 如果不指定核,OpenCV 会默认使用一个 3x3 的矩形核
    // cv::Mat element; // 使用默认 3x3 核

    // 4. 执行腐蚀操作
    // 可以指定迭代次数,例如 iterations = 2
    int iterations = 1;
    cv::erode(srcImage, erodedImage, element, cv::Point(-1,-1), iterations);

    // 5. 显示原始图像和腐蚀后的图像
    cv::imshow("原始图像", srcImage);
    cv::imshow("腐蚀后的图像", erodedImage);

    // 6. 等待用户按键,然后关闭窗口
    cv::waitKey(0);
    cv::destroyAllWindows();

    return 0;
}

编译和运行说明 (以 g++ 为例):

g++ your_source_file.cpp -o erode_example $(pkg-config --cflags --libs opencv4)
./erode_example

(请确保你已安装 OpenCV 并配置好 pkg-config,如果使用 OpenCV 3,将 opencv4 替换为 opencv)

代码解析

腐蚀的效果和应用场景

可调整的参数及其影响

总结

图像腐蚀是形态学图像处理中一个强大且基础的工具。通过选择合适的结构元素大小、形状以及迭代次数,可以有效地修改图像中物体的形状和大小,以达到去噪、分割和特征提取等目的。OpenCV 的 cv::erode() 函数为我们提供了一个简单易用的接口来实现这一功能。鼓励读者多多尝试不同的参数组合,观察它们对图像处理结果的具体影响。

到此这篇关于c/c++中opencv实现腐蚀的示例代码的文章就介绍到这了,更多相关opencv 腐蚀内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文