opencv(C++) 变换图像与形态学操作

文章目录

    • 使用腐蚀和膨胀图像形态滤波器
      • 实现案例
    • 使用形态学滤波器对图像进行开运算和闭运算
      • 实现案例
    • 在灰度图像上应用形态学操作算子
      • 形态学梯度(Morphological Gradient)
      • 黑帽变换(Black-hat Transform)
    • 使用分水岭算法进行图像分割
    • 使用 MSER 提取显著区域
      • MSER 检测与可视化

使用腐蚀和膨胀图像形态滤波器

腐蚀(Erosion)和膨胀(Dilation)是最基本的形态学操作。
数学形态学中最基本的组成部分是结构元素(structuring element)。一个结构元素可以简单地定义为一组像素的排列方式(如下图中的方形结构),并在这组像素中定义一个原点(也称为锚点)。
在这里插入图片描述
应用形态学滤波器的过程,就是使用这个结构元素去“探测”图像中的每一个像素。当结构元素的原点与图像中的某个像素对齐时,结构元素与图像的交集就定义了一组像素,在这组像素上会执行特定的形态学操作(如下图中阴影显示的九个像素)。

结构元素可以是任意形状的,常用的是简单的形状,例如方形、圆形或菱形,并且通常将原点置于中心位置。自定义的结构元素在某些情况下也非常有用,可以用于强调或消除具有特定形状的区域。

实现案例

腐蚀和膨胀在OpenCV中通过简单的函数实现,分别为cv::erode和cv::dilate

cv::Mat image = cv::imread("binary.bmp");
// 腐蚀图像
// 使用默认的3x3结构元素(SE)
cv::Mat eroded; // 目标图像
cv::erode(image, eroded, cv::Mat());// 膨胀图像
cv::Mat dilated; // 目标图像
cv::dilate(image, dilated, cv::Mat());

腐蚀操作将当前像素替换为在所定义的像素集中找到的最小像素值。
相反,膨胀是一个互补的操作,它将当前像素替换为最大像素值。由于输入的二值图像只包含黑色(值0)和白色(值255)像素,每个像素都将被替换成黑色或白色像素。
默认情况下,OpenCV使用3x3的方形结构元素。当在函数调用中指定一个空矩阵(即cv::Mat())作为第三个参数时,默认结构元素就会被使用。也可以通过提供一个非零元素定义结构元素的矩阵来指定任何大小(和形状)的结构元素。例如,应用一个7x7的结构元素的方法如下:

// 创建一个包含所有1的7x7矩阵
cv::Mat element(7, 7, CV_8U, cv::Scalar(1));
// 使用该结构元素腐蚀图像
cv::erode(image, eroded, element);// 腐蚀图像3次
cv::erode(image, eroded, cv::Mat(), cv::Point(-1,-1), 3);
#include <opencv2/opencv.hpp>
#include <iostream>
#include <cstdlib>
#include <ctime>int main() {// 设置随机数种子std::srand(std::time(nullptr));// 图像尺寸int height = 400, width = 400;// 创建一个空的单通道灰度图像cv::Mat image = cv::Mat(height, width, CV_8UC1);// 填充随机值for(int y = 0; y < height; ++y) {for(int x = 0; x < width; ++x) {// 随机生成0或255,以创建二值图像image.at<uchar>(y, x) = (std::rand() % 2) * 255;}}// 创建用于存储处理结果的图像cv::Mat eroded, dilated;// 使用默认的3x3结构元素进行腐蚀操作cv::erode(image, eroded, cv::Mat());// 使用默认的3x3结构元素进行膨胀操作cv::dilate(image, dilated, cv::Mat());// 显示原图cv::imshow("Original Image", image);// 显示腐蚀后的图像cv::imshow("Eroded Image", eroded);// 显示膨胀后的图像cv::imshow("Dilated Image", dilated);// 等待用户按键以关闭所有窗口cv::waitKey(0);return 0;
}

在这里插入图片描述

使用形态学滤波器对图像进行开运算和闭运算

  • 开运算(Opening) = 先腐蚀后膨胀
  • 闭运算(Closing) = 先膨胀后腐蚀
// rc: 输入图像
// dst: 输出图像
// op: 操作类型,如 cv::MORPH_OPEN 或 cv::MORPH_CLOSE
// kernel: 结构元素(通常用 cv::getStructuringElement 创建)
cv::morphologyEx(src, dst, op, kernel);

实现案例

#include <opencv2/opencv.hpp>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/83201.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

测试工程师学LangChain之promptTemplate 实战笔记

一、引言:大模型时代的测试自动化革命 2025 年,随着大模型(如 DeepSeek)在自动化测试领域的广泛应用,Prompt 编写已成为测试工程师的核心技能之一。 为什么? 大模型输出的质量 90% 取决于输入的 PromptLangChain 的 PromptTemplate 提供了参数化 Prompt 的标准化方案Ope…

CP2K 软件介绍与使用指南

CP2K 软件介绍与使用指南 一、CP2K简介 CP2K是一款开源的量子化学和固态物理模拟软件包&#xff0c;主要用于原子尺度模拟&#xff0c;特别擅长以下领域&#xff1a; 第一性原理计算&#xff1a;基于密度泛函理论(DFT)的电子结构计算分子动力学(MD)&#xff1a;包括从头算分…

npm、pnpm、yarn使用以及区别

npm 使用 安装包&#xff1a;在项目目录下&#xff0c;npm install <包名> 用于本地安装包到 node_modules 目录&#xff0c;并添加到 package.json 的 dependencies 中&#xff1b;npm install -g <包名> 用于全局安装&#xff0c;适用于命令行工具等。初始化项目…

2025年北京市职工职业技能大赛第六届信息通信行业网络安全技能大赛复赛CTF部分WP-哥斯拉流量分析

2025年北京市职工职业技能大赛第六届信息通信行业网络安全技能大赛复赛CTF部分WP-哥斯拉流量分析 一、流量分析 题目没有任何提示,附件gzl.pcap 解题哥斯拉流量300多KB包很多,没啥经验只能挨个看回来之后又狠狠得撸了一把哥斯拉流量分析我这里用的是哥斯拉4.0.1 测试链接…

GitLab 18.0 正式发布,15.0 将不再受技术支持,须升级【六】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…

React 项目中封装 Excel 导入导出组件:技术分享与实践

文章目录 前言一、为什么需要封装 Excel 组件&#xff1f;二、技术选型三、核心实现1. 安装依赖2. 封装Excel导出3. 封装导入组件 &#xff08;UploadExcel&#xff09; 总结 前言 在 React 项目中&#xff0c;处理 Excel 文件的导入和导出是常见的业务需求。无论是导出报表数…

RustDesk 搭建自建服务器并设置服务自启动

目录 0. 介绍 1. 事前准备 1.1 有公网 ip 的云服务器一台 1.2 服务端部署包 1.3 客户端安装包 2. 部署 2.1 服务器环境准备 2.2 上传服务端部署包 2.3 运行 pm2 3. 客户端使用 3.1 安装 3.2 配置 3.2.1 解锁网络设置 3.2.2 ID / 中级服务器 3.3 启动效果 > …

基于Qt封装数据库基本增删改查操作,支持多线程,并实现SQLite数据库单例访问

抽出来的&#xff0c;直接用就行 头文件CPP文件使用示例 头文件 #ifndef DATABASECOMMON_H #define DATABASECOMMON_H/** 单例封装SQLite通用操作&#xff0c;支持多线程调用&#xff1b;可扩展兼容其他数据库&#xff0c;照着SysRunDatabase写&#xff0c;并且重载openDataba…

AI笔记 - 网络模型 - mobileNet

网络模型 mobileNet mobileNet V1网络结构深度可分离卷积空间可分![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/aff06377feac40b787cfc882be7c6e5d.png) 参考 mobileNet V1 网络结构 MobileNetV1可以理解为VGG中的标准卷积层换成深度可分离卷积 可分离卷积主要有…

第十五篇:MySQL 高级实战项目:构建高可用、可观测、性能优化一体化数据库平台

本篇聚焦于如何基于 MySQL 构建一个真正面向生产环境的数据库平台&#xff0c;集成高可用、可观测与性能调优三大核心能力&#xff0c;助力稳定、可扩展的系统运行。 一、项目背景与目标 在实际生产环境中&#xff0c;数据库系统需要应对以下挑战&#xff1a; 业务高速增长带来…

华为OD机试真题——文件目录大小(2025 A卷:100分)Java/python/JavaScript/C++/C语言/GO六种语言最佳实现

2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 2025华为OD真题目录+全流程解析/备考攻略/经验分享 华为OD机试真题《文件目录大小》: 目录 题…

qwen 2.5 并行计算机制:依靠 PyTorch 和 Transformers 库的分布式能力

qwen 2.5 并行计算机制:依靠 PyTorch 和 Transformers 库的分布式能力 完整可运行代码: import torch import torch.nn.functional as F from transformers

TIDB创建索引失败 mkdir /tmp/tidb/tmp_ddl-4000/1370: no such file or directory.

TIDB创建索引失败&#xff1a;解决“mkdir /tmp/tidb/tmp_ddl-4000/1370: no such file or directory”问题 在使用 TIDB 数据库时&#xff0c;我们有时会遇到创建索引失败的问题。常见的错误信息为&#xff1a; mkdir /tmp/tidb/tmp_ddl-4000/1370: no such file or directo…

华为OD机试真题—— 最少数量线段覆盖/多线段数据压缩(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 2025华为OD真题目录+全流程解析/备考攻略/经验分享 华为OD机试真题《最少数量线段覆盖/多线段数…

EasyRTC嵌入式音视频实时通话SDK助力AI与IoT智能硬件打造音视频交互多场景应用

一、引言​ 在数字化浪潮下&#xff0c;AI与IoT深度融合重塑智能硬件产业。实时音视频通信是智能硬件交互的核心&#xff0c;其性能关乎用户体验与场景拓展。EasyRTC嵌入式音视频实时通话SDK基于WebRTC技术&#xff0c;以轻量、易扩展的特性&#xff0c;为AI与IoT智能硬件融合…

第十四章 MQTT订阅

系列文章目录 系列文章目录 第一章 总体概述 第二章 在实体机上安装ubuntu 第三章 Windows远程连接ubuntu 第四章 使用Docker安装和运行EMQX 第五章 Docker卸载EMQX 第六章 EMQX客户端MQTTX Desktop的安装与使用 第七章 EMQX客户端MQTTX CLI的安装与使用 第八章 Wireshark工具…

【第4章 图像与视频】4.4 离屏 canvas

文章目录 前言为什么要使用 offscreenCanvas为什么要使用 OffscreenCanvas如何使用 OffscreenCanvas第一种使用方式第二种使用方式 计算时长超过多长时间适合用Web Worker 前言 在 Canvas 开发中&#xff0c;我们经常需要处理复杂的图形和动画&#xff0c;这些操作可能会影响页…

Go语言事件总线EventBus本地事件总线系统的完整实现框架

在Go语言中&#xff0c;EventBus是一种非常有用的工具&#xff0c;它通过事件驱动的编程方式&#xff0c;帮助开发者实现组件之间的解耦&#xff0c;提高代码的可维护性和扩展性。 背景 软件架构的发展需求&#xff1a;随着软件系统的规模和复杂度不断增大&#xff0c;传统的紧…

Go语言接口:灵活多态的核心机制

引言 Go语言的接口系统是其​​面向对象编程​​的核心&#xff0c;它摒弃了传统语言的类继承体系&#xff0c;采用独特的​​隐式实现​​和​​鸭子类型​​设计。这种设计使得Go接口既灵活又强大&#xff0c;成为构建松耦合系统的关键工具。本文将深入剖析Go接口的实现机制…

DeviceNET转EtherCAT网关:医院药房自动化的智能升级神经中枢

在现代医院药房自动化系统中&#xff0c;高效、精准、可靠的设备通信是保障患者用药安全与效率的核心。当面临既有支持DeviceNET协议的传感器、执行器&#xff08;如药盒状态传感器、机械臂限位开关&#xff09;需接入先进EtherCAT高速实时网络时&#xff0c;JH-DVN-ECT疆鸿智能…