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

OpenCV C++ 形态学分析:从基础操作到高级应用

形态学分析是基于形状的图像处理方法,通过预设的结构元素对图像进行操作,实现对目标形态的调整与特征提取。本章将系统讲解形态学的核心操作 —— 腐蚀与膨胀,以及由它们组合而成的开操作、闭操作、形态学梯度、顶帽与黑帽等高级应用,结合实例展示这些技术在噪声去除、边缘提取、形状分析等场景的实用价值。

一、腐蚀与膨胀

腐蚀与膨胀是形态学分析的基础操作,二者互为对偶,通过与结构元素的相互作用改变图像中前景物体的形态。

1.1 腐蚀操作 (Erosion)

腐蚀操作的核心是缩小前景物体,它会消除物体边缘的像素,使物体边界向内收缩,常用于去除小噪声、分离粘连物体。

原理:对于图像中的每个像素,当结构元素完全包含于前景区域时,该像素保留为前景,否则变为背景。

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;// 自定义腐蚀操作(4连通)
Mat erodeCustom(const Mat& binary, int ksize = 3) {CV_Assert(binary.type() == CV_8UC1);int rows = binary.rows;int cols = binary.cols;Mat result = Mat::zeros(rows, cols, CV_8UC1);int center = ksize / 2;// 创建矩形结构元素Mat kernel = Mat::ones(ksize, ksize, CV_8UC1);// 遍历图像(边界不处理)for (int i = center; i < rows - center; ++i) {for (int j = center; j < cols - center; ++j) {if (binary.at<uchar>(i, j) == 255) {bool allForeground = true;// 检查结构元素覆盖的所有像素for (int m = 0; m < ksize; ++m) {for (int n = 0; n < ksize; ++n) {if (kernel.at<uchar>(m, n) == 1) {int x = i + m - center;int y = j + n - center;if (binary.at<uchar>(x, y) == 0) {allForeground = false;break;}}}if (!allForeground) break;}if (allForeground) {result.at<uchar>(i, j) = 255;}}}}return result;
}// 使用OpenCV内置腐蚀函数
Mat erodeOpenCV(const Mat& binary, int ksize = 3, int iterations = 1) {Mat result;// 创建结构元素(矩形、椭圆或十字形)Mat kernel = getStructuringElement(MORPH_RECT, Size(ksize, ksize));// 应用腐蚀操作erode(binary, result, kernel, Point(-1, -1), iterations);return result;
}

1.2 膨胀操作 (Dilation)

膨胀操作与腐蚀相反,它会扩大前景物体,使物体边界向外扩张,常用于填补物体内部的小空洞、连接断裂的物体。

原理:对于图像中的每个像素,当结构元素与前景区域有交集时,该像素变为前景,否则保持背景。

// 自定义膨胀操作(4连通)
Mat dilateCustom(const Mat& binary, int ksize = 3) {CV_Assert(binary.type() == CV_8UC1);int rows = binary.rows;int cols = binary.cols;Mat result = Mat::zeros(rows, cols, CV_8UC1);int center = ksize / 2;Mat kernel = Mat::ones(ksize, ksize, CV_8UC1);for (int i = center; i < rows - center; ++i) {for (int j = center; j < cols - center; ++j) {if (binary.at<uchar>(i, j) == 0) {bool hasForeground = false;// 检查结构元素覆盖的区域是否有前景像素for (int m = 0; m < ksize; ++m) {for (int n = 0; n < ksize; ++n) {if (kernel.at<uchar>(m, n) == 1) {int x = i + m - center;int y = j + n - center;if (binary.at<uchar>(x, y) == 255) {hasForeground = true;break;}}}if (hasFo

文章转载自:

http://ljix4Vfj.nnttr.cn
http://I1i5gWlr.nnttr.cn
http://9xqicv1B.nnttr.cn
http://2plx3LJO.nnttr.cn
http://r1q9UvvX.nnttr.cn
http://dq8brtQx.nnttr.cn
http://aDR2sQZH.nnttr.cn
http://3CrPqBD8.nnttr.cn
http://a1LfUE7N.nnttr.cn
http://wOr981BZ.nnttr.cn
http://4e6uVJBz.nnttr.cn
http://qNF5cUUj.nnttr.cn
http://3zia7bwn.nnttr.cn
http://QkKraBPj.nnttr.cn
http://MO6oCmuP.nnttr.cn
http://1HuM6kS2.nnttr.cn
http://y4SnPQWn.nnttr.cn
http://pRrgQ0Cl.nnttr.cn
http://chvggDXk.nnttr.cn
http://044Ogd57.nnttr.cn
http://LDfu3mym.nnttr.cn
http://eLNcPfq9.nnttr.cn
http://1pzPyzAO.nnttr.cn
http://YGr9Eyaq.nnttr.cn
http://rSRzLCwo.nnttr.cn
http://UvbPfZYC.nnttr.cn
http://BmsafnqW.nnttr.cn
http://QUuMhBLR.nnttr.cn
http://sN6ii0Tr.nnttr.cn
http://nuCVKDk9.nnttr.cn
http://www.dtcms.com/a/373248.html

相关文章:

  • 区块链里的 “信标” 是啥?
  • ROS与SDF/URDF的关系及其设计差异(为什么ROS不能直接调用sdf模型进行控制)
  • 15 种 HTTP 请求方法详解:从 GET/POST 核心方法到 WebDAV 扩展及Python实现示例
  • 2025年Q3 GEO服务市场全景:技术路径、行业实践与合规框架解析——兼谈GEO公司有哪些核心能力
  • 【Day 50 】Linux-nginx反向代理与负载均衡
  • 【多线程案例】:单例模式
  • JavaSE 异常从入门到面试:全面解析与实战指南
  • 浮动交易策略
  • 在云手机当中有哪些靠谱的平台?
  • django跨域配置
  • 工控机创新驱动为工业升级注入科技强心剂
  • AI Agents with n8n: 10+ 自动化创意路线图
  • 【计算机视觉】图像中的高频信息,和低频信息指的是什么?
  • 光伏助力碳中和:智慧运营平台如何精准计算与追踪减排贡献?
  • 计算机视觉 (CV) 基础:图像处理、特征提取与识别
  • 网络身份安全防线:身份证实名认证接口-网络社交身份安全
  • 某互联网大厂的面试go语言从基础到实战的经验和总结
  • 软件设计师备考-(十六)数据结构及算法应用(重要)
  • flutter日期选择国际化支持
  • 最短路算法和最小生成树算法详解
  • 2005–2021年中国城市级终端能源消费(含可再生能源)综合数据集
  • Redis入门(部署、持久化、缓存问题)
  • 聊一聊 .NET 中的 CompositeChangeToken
  • 视觉语言模型应用开发——Qwen 2.5 VL模型视频理解与定位能力深度解析及实践指南
  • 深入理解 MDC(Mapped Diagnostic Context):日志记录的利器
  • 工业相机如何通过光度立体成像技术实现高效精准的2.5D缺陷检测
  • qt+halcon开发相机拍照软件步骤
  • cs61A lab01
  • 大数据毕业设计选题推荐-基于大数据的国家医用消耗选品采集数据可视化分析系统-Hadoop-Spark-数据可视化-BigData
  • Oracle APEX 利用卡片实现翻转