it编程 > 编程语言 > C/C++

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

19人参与 2025-06-01 C/C++

图像膨胀 (dilation) 是形态学图像处理中的另一种基本操作,与腐蚀操作相对应。它通常用于填充图像中的小孔洞、连接断开的物体部分、以及加粗二值图像中的物体。本文将详细介绍膨胀的原理,并演示如何使用 c++ 和 opencv 库来实现图像膨胀。

什么是图像膨胀?

与腐蚀类似,图像膨胀也是用一个特定的结构元素(核)“探测”或“扫描”输入图像的过程。对于二值图像,如果结构元素下的至少一个像素为前景像素(通常为白色,值为1或255),则输出图像中结构元素锚点对应的像素就被置为前景像素。对于灰度图像,输出像素的值是结构元素覆盖区域内所有像素的最大值。

简单来说,膨胀操作会:

其效果就像是用结构元素“膨胀”或“扩张”前景物体的边界。

结构元素 (kernel)

结构元素在膨胀操作中的作用与在腐蚀操作中类似,它定义了操作的邻域范围和形状。结构元素的中心点通常被称为“锚点”。opencv 提供了 cv::getstructuringelement() 函数来方便地创建常见的结构元素。

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

// 创建一个 3x3 大小的矩形结构元素
cv::mat kernel_rect = cv::getstructuringelement(cv::morph_rect, cv::size(3, 3));

// 创建一个 5x5 大小的椭圆形结构元素
cv::mat kernel_ellipse = cv::getstructuringelement(cv::morph_ellipse, cv::size(5, 5));

// 创建一个 7x7 大小的十字形结构元素
cv::mat kernel_cross = cv::getstructuringelement(cv::morph_cross, cv::size(7, 7));

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

opencv 中的 cv::dilate() 函数

opencv 提供了 cv::dilate() 函数来实现图像膨胀。

函数原型:

void cv::dilate(
    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); // 或者 cv::imread_grayscale 用于灰度图

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

    // 2. 创建膨胀后的输出图像
    cv::mat dilatedimage;

    // 3. 定义结构元素 (核)
    // 尝试不同的形状和大小
    // int dilation_size = 3; // 核大小,可以调整
    // cv::mat element = cv::getstructuringelement(cv::morph_rect,
    //                                           cv::size(2 * dilation_size + 1, 2 * dilation_size + 1),
    //                                           cv::point(dilation_size, dilation_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::dilate(srcimage, dilatedimage, element, cv::point(-1,-1), iterations);

    // 5. 显示原始图像和膨胀后的图像
    cv::imshow("原始图像", srcimage);
    cv::imshow("膨胀后的图像", dilatedimage);

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

    return 0;
}

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

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

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

代码解析

膨胀的效果和应用场景

可调整的参数及其影响

膨胀与腐蚀

膨胀和腐蚀是形态学操作中的一对对偶操作。

它们经常组合使用:

总结

图像膨胀是形态学图像处理中一个非常重要的工具,它通过扩展图像中的亮区来达到填充孔洞、连接物体和加粗特征等目的。通过精心选择结构元素的形状、大小以及迭代次数,可以有效地控制膨胀操作的效果。opencv 的 cv::dilate() 函数为我们提供了一个简单易用的接口来实现这一功能。希望本文能帮助你理解和应用图像膨胀技术。

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

(0)

您想发表意见!!点此发布评论

推荐阅读

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

06-01

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

06-01

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

06-01

C++  RabbitMq消息队列组件详解

05-29

C语言循环结构实战之while和for循环基本语法详解

05-29

C++类和对象之默认成员函数的使用解读

06-03

猜你喜欢

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

发表评论