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

7:OpenCV—图像形态学处理

OpenCV的形态学操作(对象图像进行处理)

包括图像的**腐蚀**、**膨胀**、**开**、**闭**、**形态学梯度、顶帽、黑帽、分支主题、结构元素**等操作。

1.1、膨胀

用3×3的核去扫描二值图像,当核与图像中的前景像素(值为1的像素)有**交集**时,则将二值图像中对应的卷积核中心位置的像素值置为1。

拓展:卷积核可以**为任意形状(除1×1)**,且重置点可以选用卷积核中的**任意位置**,有‘**交集‘**就对重置点位置像素置1。

1.2、腐蚀

​ 用3×3的核去扫描二值图像,仅当核的与前景像素有**完全重合区域**时,将二值图像中对应的卷积核中心位置的像素保留,其余情况下,将中心位置的像素置0。

​ 拓展:卷积核可以**为任意形状**,且**重置点**可以选用卷积核中的**任意位置。**

膨胀与腐蚀的区别:膨胀只要**有交集就触发**,而腐蚀**必须是重置点与前景像素有完全重合区域才保留**。

1.3、开与闭

​ 开:腐蚀再膨胀,去除微小干扰块。

闭:膨胀再腐蚀,填充闭合区域。

1.4、形态学梯度

​ 内梯度:原图 - 腐蚀图

​ 外梯度:膨胀图 - 原图

​ 这里opencv只能直接实现基本梯度,在使用API:morphologyEx 时,调用MORPH_GRADIENT方法即可。

​ 内梯度、外梯度没有直接的API,一般通过已有API间接实现。

1.5、其余形态学操作

顶帽:原图 - 开操作后的图

黑帽:闭操作后的图 - 原图

注:顶帽和黑帽操作用于**获取图像**中的**微小细节**。

击中击不中: 通过特定模板,仅当输入的图像中,**有与模板一模一样的块**时,被击中的输入图像区域才会被保留。

使用API:**morphologyEx** 时,分别调用M**ORPH_TOPHAT 、MORPH_BLACKHAT、MORPH_HITMISS**方法即可实现。

void cv::morphologyEx(InputArray src,
OutputArray dst,
int op,
InputArray kernel,
Point anchor = Point(-1,-1),
int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar & borderValue = morphologyDefaultBorderValue()
)

  • src:输入图像,图像的通道数可以是任意的,但是图像的数据类型必须是CV_8U,CV_16U,CV_16S,CV_32F或CV_64F之一。
  • dst:形态学操作后的输出图像,与输入图像具有相同的尺寸和数据类型。
  • op:形态学操作类型的标志,可以选择的标志及含义在表6-6中给出。
  • kernel:结构元素,可以自己生成,也可以用getStructuringElement()函数生成。
  • anchor:中心点在结构元素中的位置,默认参数为结构元素的几何中心点
  • iterations:处理的次数
  • borderType:像素外推法选择标志,取值范围在表3-5中给出。默认参数为BORDER_DEFAULT,表示不包含边界值倒序填充。
  • borderValue:使用边界不变外推法时的边界值。

该函数根据结构元素对输入图像进行多种形态学操作,在处理多通道图像时每个通道独立进行处理。
函数的第一个参数为待形态学处理的图像,图像通道数可以是任意的,但是图像的数据类型必须是CV_8U,CV_16U,CV_16S,CV_32F或CV_64F之一。
函数第二个参数为形态学处理后的输出图像,与输入图像具有相同的尺寸和数据类型。
函数第三个参数是形态学操作类型的选择标志,可以选择的形态学操作类型有开运算、闭运算、形态学梯度、顶帽运算、黑帽运算以及击中击不中变换,详细的参数在表6-6给出。
函数第四个和第五个参数都是与结构元素相关的参数,第四个参数为结构元素,使用的结构元素尺寸越大效果越明显,第四个参数为结构元素的中心位置,第五个参数的默认值为Point(-1,-1),表示结构元素的几何中心处为结构元素的中心点。
函数第六个参数是使用结构元素处理的次数,处理次数越多效果越明显。
函数第七个参数是图像像素外推法的选择标志,
第八个参数为使用边界不变外推法时的边界值,这两个参数对图像中主要部分的形态学操作没有影响,因此在多数情况下使用默认值即可。

测试代码


#include <iostream>
#include <opencv2/opencv.hpp>
#include <QDebug>using namespace cv;
using namespace std;int main()
{//用于验证形态学应用的二值化矩阵Mat src = (Mat_<uchar>(9, 12) << 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 255, 255, 255, 255, 255, 255, 255, 0, 0, 255, 0,0, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0,0, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0,0, 255, 255, 255, 0, 255, 255, 255, 0, 0, 0, 0,0, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0,0, 255, 255, 255, 255, 255, 255, 255, 0, 0, 255, 0,0, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);namedWindow("src", WINDOW_NORMAL);  //可以自由调节显示图像的尺寸imshow("src", src);// 创建3X3矩形核元素Mat kernel = getStructuringElement(0, Size(3,3));// 对象矩阵进行膨胀操作Mat dilateImg;morphologyEx(src, dilateImg, MORPH_DILATE, kernel);namedWindow("dilateWd", WINDOW_NORMAL);  //可以自由调节显示图像的尺寸imshow("dilateWd", dilateImg);// 对象矩阵进行腐蚀操作Mat erodeImg;morphologyEx(src, erodeImg, MORPH_ERODE, kernel);namedWindow("erodeWd", WINDOW_NORMAL);  //可以自由调节显示图像的尺寸imshow("erodeWd", erodeImg);// 对象矩阵进行开操作Mat openImg;morphologyEx(src, openImg, MORPH_OPEN, kernel);namedWindow("openWd", WINDOW_NORMAL);  //可以自由调节显示图像的尺寸imshow("openWd", openImg);// 对象矩阵进行闭操作Mat closeImg;morphologyEx(src, closeImg, MORPH_CLOSE, kernel);namedWindow("closeWd", WINDOW_NORMAL);  //可以自由调节显示图像的尺寸imshow("closeWd", closeImg);// 对象矩阵进行开操作Mat topHatImg;morphologyEx(src, topHatImg, MORPH_TOPHAT, kernel);namedWindow("topHatWd", WINDOW_NORMAL);  //可以自由调节显示图像的尺寸imshow("topHatWd", topHatImg);// 对象矩阵进行闭操作Mat blackImg;morphologyEx(src, blackImg, MORPH_BLACKHAT, kernel);namedWindow("blackWd", WINDOW_NORMAL);  //可以自由调节显示图像的尺寸imshow("blackWd", blackImg);// 对象矩阵进行梯度运算操作Mat gradientImg;morphologyEx(src, gradientImg, MORPH_GRADIENT, kernel);namedWindow("gradientWd", WINDOW_NORMAL);  //可以自由调节显示图像的尺寸imshow("gradientWd", gradientImg);waitKey(0);return 0;
}
http://www.xdnf.cn/news/8687.html

相关文章:

  • 深度学习实战:从图像分类到文本生成的完整案例解析
  • DAY 35 模型可视化与推理
  • 力扣面试150题--求根节点到叶节点数字之和
  • 如何屏蔽mac电脑更新提醒,禁止系统更新(最新有效方法)
  • 5060显卡驱动PyCUDA开发环境搭建
  • 25. 日志装饰器的开发
  • 使用 Go 语言实现完整且轻量级高性能的 MQTT Broker
  • Vue3 Composition API: 企业级应用最佳实践方案
  • SDL2常用函数:SDL_Texture 数据结构及使用介绍
  • 微信小程序数据接收
  • 数据结构---二叉树
  • 基于python的机器学习(九)—— 评估算法(二)
  • OpenLayers 开发环境搭建
  • 初识 RocketMQ 知识总结:基础概念、架构解析、核心特性与应用场景
  • 解决“uv 无法识别为命令”问题:Windows 下 Python 工具安装后的路径配置方法
  • 国际前沿知识系列五:时间序列建模方法在头部撞击运动学测量数据降噪中的应用
  • Spring Cloud Gateway 微服务网关实战指南
  • python操作MySQL数据库
  • 再论自然数全加和-4
  • laravel中模型中$fillable的用法
  • DeepSeek-R1 模型现已在亚马逊云科技上推出
  • 再谈Linux进程:进程等待、进程替换与环境变量
  • 第七章:组件之城 · 重构世界的拼图术
  • RabbitMQ 快速上手
  • 【RichTextEditor】 【分析2】RichTextEditor设置文字内容背景色
  • 第八章:数据库查询优化
  • 上升沿计数 stm32 中断
  • 用service 和 SCAN实现sqlplus/jdbc连接Oracle 11g RAC时负载均衡
  • 在Mac中使用pyenv管理Python版本:从安装到虚拟环境的全流程指南
  • 物联网网关保障沼气发电站安全运行的关键技术解析