当前位置: 首页 > article >正文

c/c++的opencv膨胀

使用 OpenCV (C++) 进行图像膨胀操作详解

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

什么是图像膨胀?

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

简单来说,膨胀操作会:

  • 扩大 亮色区域(前景)。
  • 缩小 暗色区域(背景)。
  • 填充前景物体内的小孔洞或断裂。

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

结构元素 (Kernel)

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

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

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

参数说明:

  • src: 输入图像,可以是任意通道数的图像,但深度应为 CV_8U, CV_16U, CV_16S, CV_32FCV_64F
  • dst: 输出图像,与 src 具有相同的大小和类型。
  • kernel: 结构元素。如果传入一个空的 cv::Mat(),则默认使用一个 3x3 的矩形核。
  • anchor: 锚点位置。默认值 cv::Point(-1,-1) 表示锚点在结构元素的中心。
  • iterations: 膨胀操作执行的次数。多次迭代会使膨胀效果更明显。
  • borderType: 用于推断图像外部像素的边界模式。
  • borderValue: 当 borderTypecv::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); // 或者 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 = 2int 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)

代码解析

  1. #include <opencv2/opencv.hpp>: 包含了 OpenCV 的主要头文件。
  2. cv::imread("your_image_path.png", cv::IMREAD_COLOR): 加载指定路径的彩色图像。你需要将 "your_image_path.png" 替换为实际的图像文件路径。对于二值化操作,通常先转换为灰度图再进行阈值化处理,然后进行膨胀。
  3. srcImage.empty(): 检查图像是否成功加载。
  4. cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5)): 创建一个 5x5 大小的矩形结构元素。你可以修改形状 (MORPH_ELLIPSE, MORPH_CROSS) 和大小 (cv::Size) 来观察不同的效果。
  5. cv::dilate(srcImage, dilatedImage, element, cv::Point(-1,-1), iterations): 对 srcImage 应用膨胀操作,使用 element 作为结构元素,迭代 iterations 次,并将结果存储在 dilatedImage 中。cv::Point(-1,-1) 表示锚点在核的中心。
  6. cv::imshow(): 显示原始图像和处理后的图像。
  7. cv::waitKey(0): 等待用户按下任意键。
  8. cv::destroyAllWindows(): 关闭所有 OpenCV 创建的窗口。

膨胀的效果和应用场景

  • 填充物体内的小孔洞: 对于二值图像中前景物体内部的小黑色区域(“胡椒噪声”中的“胡椒”点),膨胀操作可以有效填充。
  • 连接断开的物体部分: 如果物体的不同部分之间存在小的间隙,膨胀可以使它们连接起来。
  • 加粗或增大物体: 使二值图像中前景物体的尺寸变大,线条变粗。
  • 平滑物体边界: 可以使物体边界更加平滑,填补一些小的凹陷。
  • 在其他更复杂形态学操作(如闭运算、梯度计算)中作为基础步骤。

可调整的参数及其影响

  • 结构元素的大小:
    • 较小的结构元素产生的膨胀效果较弱。
    • 较大的结构元素产生的膨胀效果较强,会更显著地扩大物体或填充孔洞。
  • 结构元素的形状:
    • 不同的形状会以不同的方式扩张物体。例如,水平线核会主要在水平方向上膨胀物体。
  • 迭代次数 (iterations):
    • 增加迭代次数会增强膨胀效果,多次小核迭代的效果类似于使用一个更大的结构元素。

膨胀与腐蚀

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

  • 腐蚀会“收缩”或“细化”物体。
  • 膨胀会“扩张”或“加粗”物体。

它们经常组合使用:

  • 开运算 (Opening): 先腐蚀后膨胀,可以用来去除小对象(噪声)、平滑较大对象的轮廓以及断开细的连接。
  • 闭运算 (Closing): 先膨胀后腐蚀,可以用来填充小孔洞、连接邻近的对象以及平滑较大对象的轮廓。

总结

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

相关文章:

c/c++的opencv膨胀

使用 OpenCV (C) 进行图像膨胀操作详解 图像膨胀 (Dilation) 是形态学图像处理中的另一种基本操作&#xff0c;与腐蚀操作相对应。它通常用于填充图像中的小孔洞、连接断开的物体部分、以及加粗二值图像中的物体。本文将详细介绍膨胀的原理&#xff0c;并演示如何使用 C 和 Op…...

react native搭建项目

React Native 项目搭建指南 React Native 是一个使用 JavaScript 和 React 构建跨平台移动应用的框架。以下是搭建 React Native 项目的详细步骤&#xff1a; 1. 环境准备 安装 Node.js 下载并安装 Node.js (推荐 LTS 版本) 安装 Java Development Kit (JDK) 对于 Androi…...

【CSS】九宫格布局

CSS Grid布局&#xff08;推荐&#xff09; 实现代码&#xff1a; <!doctype html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0"…...

Python用Transformer、Prophet、RNN、LSTM、SARIMAX时间序列预测分析用电量、销售、交通事故数据

原文链接&#xff1a; tecdat.cn/?p42219 在数据驱动决策的时代&#xff0c;时间序列预测作为揭示数据时序规律的核心技术&#xff0c;已成为各行业解决预测需求的关键工具。从能源消耗趋势分析到公共安全事件预测&#xff0c;不同领域的数据特征对预测模型的适应性提出了差异…...

java基础(面向对象进阶高级)泛型(API一)

认识泛型 泛型就等于一个标签(比如男厕所和女厕) 泛型类 只能加字符串&#xff1a; 把别人写好的东西&#xff0c;自己封装。 泛型接口 泛型方法、泛型通配符、上下限 怎么解决下面的问题&#xff1f; API object类 toString: equals: objects类 包装类 为什么上面的Integer爆红…...

学习心得(17--18)Flask表单

一. 认识表单&#xff1a;定义表单类 password2中末端的EqualTo&#xff08;password&#xff09;是将密码2与密码1进行验证&#xff0c;看是否相同 二.使用表单&#xff1a; 运行 如果遇到这个报错&#xff0c;就在该页面去添加 下面是举例&#xff1a; 这就是在前端的展示效…...

AI测试和敏捷测试有什么联系与区别?

AI测试与敏捷测试作为软件质量保障领域的两种重要方法&#xff0c;既有紧密联系也存在显著区别。以下是两者的联系与区别分析&#xff1a; 一、联系 共同目标&#xff1a;提升测试效率与质量 敏捷测试强调通过快速迭代、持续反馈和团队协作确保交付价值&#xff0c;而AI测试通…...

微信小程序进阶第2篇__事件类型_冒泡_非冒泡

在小程序中&#xff0c; 事件分为两种类型&#xff1a; 冒泡事件&#xff0c; 当一个组件上的事件被触发后&#xff0c;该事件会向父节点传递非冒泡事件&#xff0c; 当一个组件上的事件被触发后&#xff0c; 该事件不会向父节点传递。 一 冒泡事件 tap&#xff0c; touchst…...

电机控制学习笔记

文章目录 前言一、电机二、编码器三、开环控制和闭环控制总结 前言 学习了解电机控制技术的一些原理和使用的方法。 一、电机 直流有刷电机 操作简单 使用H桥驱动直流有刷电机 直流有刷电机驱动板 电压检测 电流检测以及温度检测 直流无刷电机 使用方波或者正弦波进行换向…...

什么是前端工程化?它有什么意义

前端工程化是指通过工具、流程和规范,将前端开发从手工化、碎片化的模式转变为系统化、自动化和标准化的生产过程。其核心目标是 提升开发效率、保障代码质量、增强项目可维护性,并适应现代复杂 Web 应用的需求。 一、前端工程化的核心内容 1. 模块化开发 代码模块化:使用 …...

企业网站架构部署与优化-Nginx性能调优与深度监控

目录 #1.1Nginx性能调优 1.1.1更改进程数与连接数 1.1.2静态缓存功能设置 1.1.3设置连接超时 1.1.4日志切割 1.1.5配置网页压缩 #2.1nginx的深度监控 2.1.1GoAccess简介 2.1.2nginx vts简介 1.1Nginx性能调优 1.1.1更改进程数与连接数 &#xff08;1&#xff09;进程数 进程数…...

行列式的线性性质(仅限于单一行的加法拆分)

当然可以&#xff0c;以下是经过排版优化后的内容&#xff0c;保持了原始内容不变&#xff0c;仅调整了格式以提升可读性&#xff1a; 行列式的线性性质&#xff08;加法拆分&#xff09; 这个性质说的是&#xff1a;如果行列式的某一行&#xff08;或某一列&#xff09;的所有…...

JAVA基础编程练习题--50道

一&#xff1a;循环结构 1.1 for循环 水鲜花数 &#xff08;1&#xff09;题目 &#xff08;2&#xff09;难点 如何获取三位数的个位数 如何计算一个数的立方 判断两数值是否相等 &#xff08;3&#xff09;代码 最大公约数 &#xff08;1&#xff09;题目 &#xff08;2&…...

leetcode 93. Restore IP Addresses

题目描述 93. Restore IP Addresses 代码 回溯法 class Solution {vector<string> res; public:vector<string> restoreIpAddresses(string s) {string IP;int part 0;backtracking(s,0,IP,part);return res;}void backtracking(const string &s,int start…...

【东枫科技】基于Docker,Nodejs,GitSite构建一个KB站点

Docker 安装桌面版本&#xff0c;安装Node镜像 运行node镜像 需求 和外部的某个文件夹地址可以绑定端口可以绑定&#xff0c;方便server的访问 docker run -itd --name node-test -v C:/Users/fs/Documents/GitHub:/home/node -p 3000:3000 node进入终端 docker exec -it …...

pytest+allure+allure-pytest 报告输出遇到的问题汇总

文章目录 前言问题一&#xff1a;module allure has no attribute severity_level问题二&#xff1a;ERROR:file or directory not found: ‐vs问题三&#xff1a;生成的 html 报告是空的&#xff0c;明明有测试用例执行完成&#xff0c;但报告没有显示数据 前言 pytestallure…...

Python基础语法(十四):Python常用内置模块及功能

Python标准库提供了丰富的内置模块&#xff0c;无需额外安装即可使用。以下是按功能分类的常用内置模块及其核心功能&#xff1a; 一、文件与操作系统交互 1. os 模块 功能&#xff1a;操作系统接口常用方法&#xff1a;os.getcwd() # 获取当前工作目录 os.listdir() …...

【Opencv+Yolo】_Day1图像基本处理

目录 一、计算机中的视觉&#xff1a; 二、Opencv基本操作&#xff1a; 图片基础处理&#xff1a; 视频基本处理&#xff1a; 图像截取&#xff08;截取&#xff0c;合并&#xff0c;只保留一个元素&#xff09; 图像填充 数值计算 图像融合 阈值判断 图像平滑 图像腐…...

MySQL各种日志类型介绍

概述 MySQL 提供了多种日志类型&#xff0c;用于记录数据库的运行状态、操作历史和错误信息等&#xff0c;这些日志对于故障排查、性能优化、安全审计和数据恢复等具有重要作用。以下是 MySQL 中常见的日志类型及其详细介绍资料已经分类整理好&#xff1a;https://pan.quark.c…...

15.2【基础项目】使用 TypeScript 实现密码显示与隐藏功能

在现代 Web 应用中&#xff0c;允许用户切换密码的可见性不仅提升了用户体验&#xff0c;也让表单填写更便捷。使用 TypeScript 来实现这个功能&#xff0c;不仅具备强类型检查优势&#xff0c;还能提升代码的可维护性。 ✨ 我们要实现的功能 在这篇文章中&#xff0c;我们将…...

Django压缩包形式下载文件

通过web将minio上的文件以压缩包-文件夹-文件的形式下载到本地 import os from bx_mes import settings from io import BytesIO import zipfile from django.http import StreamingHttpResponse class FileRemote(GenericAPIView):def post(self,request):# 压缩包名folder_n…...

晚期NSCLC临床试验终点与分析策略

1. 案例背景 1.1 研究设计 1.1.1 适应症与分组 晚期非小细胞肺癌一线治疗,干预组为新型免疫检查点抑制剂联合化疗,对照组为化疗单药,随机双盲安慰剂对照III期试验。 1.1.2 目标框架 基于FDA或ICH指南,终点定义和分析策略影响试验科学性及监管审评。 2. 终点定义 2.1 主要…...

从比分滚动到数据革命:体育数据如何重构我们的观赛体验?

当凌晨三点的欧冠决赛与闹钟冲突时&#xff0c;当世界杯小组赛因时差难以全程跟进时&#xff0c;当代体育迷早已不再依赖电视直播 —— 打开手机里的比分网&#xff0c;实时跳动的体育大数据正构建着全新的观赛宇宙。这些曾经被视为 "辅助工具" 的平台&#xff0c;如…...

华为网路设备学习-23(路由器OSPF-LSA及特殊详解 二)

OSPF动态路由协议要求&#xff1a; 1.必须有一个骨干区域&#xff08;Area 0&#xff09;。有且仅有一个&#xff0c;而且连续不可分割。 2.所有非骨干区域&#xff08;Area 1-n&#xff09;必须和骨干区域&#xff08;Area 0&#xff09;直接相连&#xff0c;且所有区域之间…...

VPet虚拟桌宠,一款桌宠软件,支持各种互动投喂等. 开源免费并且支持创意工坊

&#x1f4cc; 大家好&#xff0c;我是智界工具库&#xff0c;每天分享好用实用且智能的开源项目&#xff0c;以及在JAVA语言开发中遇到的问题&#xff0c;如果本篇文章对您有所帮助&#xff0c;请帮我点个小赞小收藏小关注吧&#xff0c;谢谢喲&#xff01;&#x1f618; 工具…...

新书速览|ASP.NET MVC高效构建Web应用

《ASP.NET MVC高效构建Web应用》 本书内容 《ASP.NET MVC高效构建Web应用》以目前流行的ASP.NET MVC 5、HTML和Razor为主线&#xff0c;全面系统地介绍ASP.NET MVC Web应用开发的方法&#xff0c;配套提供实例源码、PPT课件与作者一对一QQ答疑服务。 《ASP.NET MVC高效构建Web…...

MySQL 9.3 超详细下载安装教程(Windows版)附图文说明

MySQL 9.3 超详细下载安装教程&#xff08;Windows版&#xff09;附图文说明 &#x1f4a1; 本文适用于Windows 10/11系统&#xff0c;包含完整的安装流程、环境配置和疑难解答。建议收藏备用&#xff01; 一、下载MySQL 1. 访问官网 进入MySQL官方下载页面&#xff1a;http…...

Linux之软件包管理器(CentOS系统) —— yum

目录 一、软件包管理器 1-1什么是软件包 1-2 Linux软件生态 Linux下载软件的过程(Ubuntu、Centos、other) 操作系统的好坏评估---生态问题 1. 应用软件生态 2. 硬件兼容性 3. 开发者社区与开源生态 4. 商业合作与盈利模式 5. 用户粘性与使用习惯 6. 安全与合规生态 …...

webpack吐环境分析

需要解决的问题 扣取下来的webpack文件过大 解决思路 用ast将需要的代码扣下来 结果展示 实现步骤 第一步&#xff1a;我们得知道需要哪些模块 在入口处&#xff0c;增加模块记录 第二步&#xff0c;分析ast代码 通过分析发现,key 有三种值 分别为NumbericLiteral、StringLi…...

Unity InputField 滑动滚轮 实现对文本的滚动

一。效果演示&#xff1a; 二。实现原理&#xff1a; 创建一个脚本KeInputScroll.cs 继承InputField类和IScrollHandler接口。如下面代码所示&#xff1a; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI;public class KeInputScroll : InputFiel…...