当前位置: 代码网 > it编程>编程语言>C/C++ > c/c++中opencv实现腐蚀的示例代码

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

2025年06月03日 C/C++ 我要评论
图像腐蚀 (erosion) 是形态学图像处理中的一种基本操作。它通常用于去除图像中的小型噪声、分离连接的物体以及细化二值图像中的物体。本文将详细介绍腐蚀的原理,并演示如何使用 c++ 和 openc

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

什么是图像腐蚀?

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

简单来说,腐蚀操作会:

  • 缩小 亮色区域(前景)。
  • 扩大 暗色区域(背景)。
  • 消除小的、孤立的亮色噪点。

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

结构元素 (kernel)

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

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

  • cv::morph_rect: 矩形
  • cv::morph_ellipse: 椭圆形
  • cv::morph_cross: 十字形
// 创建一个 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() //边界不变时的边界值
);

参数说明:

  • src: 输入图像,可以是任意通道数的图像,但深度应为 cv_8ucv_16ucv_16scv_32f 或 cv_64f
  • dst: 输出图像,与 src 具有相同的大小和类型。
  • kernel: 结构元素。如果传入一个空的 cv::mat(),则默认使用一个 3x3 的矩形核。
  • anchor: 锚点位置。默认值 cv::point(-1,-1) 表示锚点在结构元素的中心。
  • iterations: 腐蚀操作执行的次数。多次迭代等同于使用一个由原始核通过自身膨胀(相应次数)得到的更大的核。
  • bordertype: 用于推断图像外部像素的边界模式。
  • bordervalue: 当 bordertype 为 cv::border_constant 时使用的边界值。

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)

代码解析

  • #include <opencv2/opencv.hpp>: 包含了 opencv 的主要头文件。
  • cv::imread("your_image_path.png", cv::imread_color): 加载指定路径的彩色图像。你需要将 "your_image_path.png" 替换为实际的图像文件路径。
  • srcimage.empty(): 检查图像是否成功加载。
  • cv::getstructuringelement(cv::morph_rect, cv::size(5, 5)): 创建一个 5x5 大小的矩形结构元素。你可以修改形状 (morph_ellipsemorph_cross) 和大小 (cv::size) 来观察不同的效果。
  • cv::erode(srcimage, erodedimage, element, cv::point(-1,-1), iterations): 对 srcimage 应用腐蚀操作,使用 element 作为结构元素,迭代 iterations 次,并将结果存储在 erodedimage 中。cv::point(-1,-1) 表示锚点在核的中心。
  • cv::imshow(): 显示原始图像和处理后的图像。
  • cv::waitkey(0): 等待用户按下任意键。
  • cv::destroyallwindows(): 关闭所有 opencv 创建的窗口。

腐蚀的效果和应用场景

  • 去除小的独立噪声点: 对于二值图像中的“椒盐噪声”中的“盐”点(孤立的白色像素点),腐蚀操作非常有效。
  • 细化物体轮廓: 使二值图像中前景物体的尺寸变小,线条变细。
  • 分离物体: 如果两个物体之间有细微的连接,腐蚀操作可以断开这些连接,从而将它们分离。
  • 获取物体的核心区域: 多次腐蚀可以逐步剥离物体的外层像素,最终得到物体的核心部分。
  • 在其他更复杂形态学操作(如开运算、闭运算)中作为基础步骤。

可调整的参数及其影响

  • 结构元素的大小:
    • 较小的结构元素产生的腐蚀效果较弱,对图像的改变较小。
    • 较大的结构元素产生的腐蚀效果较强,会更显著地缩小或消除物体。
  • 结构元素的形状:
    • 矩形核对水平和垂直方向的腐蚀程度相同。
    • 线型核(例如,一个水平或垂直的细长矩形)会主要在与核垂直的方向上腐蚀物体。例如,水平线核会使物体在垂直方向上变细。
    • 十字形核和椭圆形核根据其形状特性进行腐蚀。
  • 迭代次数 (iterations):
    • 增加迭代次数会增强腐蚀效果,类似于使用一个更大的结构元素(但不完全相同,多次小核迭代与一次大核迭代在边界处理上可能有细微差别)。

总结

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

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

(0)

相关文章:

  • QT项目打包成EXE文件的实现步骤

    一、前言在使用 qt 开发完应用程序后,我们通常需要将其打包成可执行文件(exe),以便在没有安装 qt 开发环境的其他计算机上运行。本文将详细介绍如何将 qt 项目打包成独立的 …

    2025年06月05日 编程语言
  • C/C++和OpenCV实现调用摄像头

    C/C++和OpenCV实现调用摄像头

    opencv 是一个强大的计算机视觉库,它使得从摄像头捕获和处理视频流变得非常简单。本文将指导你如何使用 c/c++ 和 opencv 来调用摄像头、读取视频帧... [阅读全文]
  • c/c++的opencv椒盐噪声的实现

    c/c++的opencv椒盐噪声的实现

    椒盐噪声(salt-and-pepper noise),也称为脉冲噪声(impulse noise),是数字图像中常见的一种噪声类型。它的特点是在图像中随机出现... [阅读全文]
  • C/C++的OpenCV 进行图像梯度提取的几种实现

    C/C++的OpenCV 进行图像梯度提取的几种实现

    图像梯度表示图像中像素强度的变化率和方向。它是图像分析中的一个基本概念,广泛应用于边缘检测、特征提取和物体识别等任务。opencv 提供了多种计算图像梯度的函数... [阅读全文]
  • c/c++的opencv实现图片膨胀

    c/c++的opencv实现图片膨胀

    图像膨胀 (dilation) 是形态学图像处理中的另一种基本操作,与腐蚀操作相对应。它通常用于填充图像中的小孔洞、连接断开的物体部分、以及加粗二值图像中的物体... [阅读全文]
  • C++  RabbitMq消息队列组件详解

    1. rabbitmq介绍rabbitmq - 消息队列组件:实现两个客户端主机之间消息传输的功能(发布&订阅)。一端发布消息,一端订阅消息,消息就会被推送到订阅消息那一端…

    2025年05月29日 编程语言

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com