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

6.RV1126-OPENCV 形态学基础膨胀及腐蚀

一.膨胀

1.膨胀原理

        膨胀的本质就是通过微积分的转换,将图像A和图形B进行卷积操作合并成一个A+B图像就是指任意的形状或者大小的图形B。例如下图,将核(也就是图形B)通过微积分卷积,和图像A合并成一个图像A+B。

2.特点

  • 图像就会更加明亮    
  • 图像就会更加粗糙

如下图所示: 

 

 3.膨胀的API

  • 处理图像膨胀的API:void dilate( InputArray src, OutputArray dst, InputArray kernel, Point anchor, int iterations, int borderType, const Scalar&borderValue )

第一个参数:src 的类型是 InputArray,它指的是输入图像,它可以是 Mat 类的数据。图像的通道数可以是任意数,但是图像的深度一般是 CV_8U,CV_16U,CV_16S,CV_32F,CV_64F
第二个参数:dst 的类型是 OutputArray,它指的是目标图像(输出图像),值得注意的是输出图像的尺寸、类型要和输入图像是一致的。
第三个参数:InputArray 类型的 kernel,膨胀操作的核(可以理解为输入图形B)。当这个值为 NULL 的时候,表示使用的核参考点默认是 3*3。这个参数通常会配合 getStructingElement 参数的使用(这个参数的使用,下面我会详细说到)。
第四个参数:Point 类型的 anchor,描点的位置,默认是(-1,-1),表示中心位置。
第五个参数:int 类型的迭代次数,默认是 1
第六个参数:int 类型的 borderType,这个类型用于推断图像外部的边界模式,用的最多的是 BORDER_DEFAULT
下面是常用的几种边框模式(这几种相对比较常用,其他的用的很少)
BORDER_CONSTANT:用指定的像素填充边框
BORDER_REPLICATE:用已知的边缘像素来填充边框
BORDER_WRAP:用另一边的像素来补偿填充
BORDER_DEFAULT:默认模式画边框
BORDER_TRANSPANT: 用透明的方式画框
第七个参数:const Scalar 类型的 borderType,一般不用填写,因为这个 API 已经有了默认值 morphologyDefaultBorderValue()

  • 获取核(图形B)的API: CV_EXPORTS_W Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));

 第一个参数:表示内核的形状(就是图形B是以什么形状放在图像A上的),这里包括了:矩形(MORPH_RECT)、交叉形(MORPH_CROSS)、椭圆形(MORPH_ELLIPSE),常用的内核形状是矩形
第二个参数:内核的尺寸
第三个参数:锚点的位置,默认值 Point(-1,-1),表示的是位于中心点

4. 代码实战:实现图像膨胀功能

(1)功能实现的步骤:imread 读取图片、使用 cvtColor 对图片进行灰度操作、使用 getStructingElement 获取卷积层(也就是获取图形B)、使用 dilate 对图片进行膨胀(将A和B合并)、imwrite 保存图片。流程图如下:

(2)代码如下:

#include <opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>using namespace cv;
using namespace std;int main()
{Mat testImage = imread("zjl.jpg");//读取图片if(testImage.empty()){printf("read testImage failed....\n");}Mat vertical_structure = getStructuringElement(MORPH_CROSS, Size(20,20));//创建一个20*20的十字形结构元素dilate(testImage, testImage, vertical_structure);//膨胀操作,testImage为输入图像,testImage为输出图像,vertical_structure为核imwrite("zjl1.jpg", testImage);//保存图片return 0;
}

(3)效果如下:上图是MORPH_CROSS(十字交叉的核),下图是MORPH_RECT(矩形核)效果图。

 二.腐蚀

1.腐蚀原理

        原理和膨胀一样,腐蚀就是膨胀的反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。

2.特点

  • 图像更加细小
  • 黑暗背景部分会更加大

3.腐蚀的API

  •  CV_EXPORTS_W void erode( InputArray src, OutputArray dst, InputArray kernel, Point anchor = Point(-1,-1), int iterations = 1, int borderType = BORDER_CONSTANT, const Scalar& borderValue = morphologyDefaultBorderValue() );

第一个参数:src 的类型是 InputArray,它指的是输入图像,它可以是 Mat 类的数据。图像的通道数可以是任意数,但是图像的深度一般是 CV_8U,CV_16U,CV_16S,CV_32F,CV_64F
第二个参数:dst 的类型是 OutputArray,它指的是目标图像(输出图像),值得注意的是输出图像的尺寸、类型要和输入图像是一致的。
第三个参数:InputArray 类型的 kernel,膨胀操作的核。当这个值为 NULL 的时候,表示使用的核参考点默认是 3*3。这个参数通常会配合 getStructingElement 参数的使用(这个参数的使用,下面我会详细说到)。
第四个参数:Point 类型的 anchor,描点的位置,默认是(-1,-1),表示中心位置。
第五个参数:int 类型的迭代次数,默认是 1
第六个参数:int 类型的 borderType,这个类型用于推断图像外部的边界模式,它的默认值是 BORDER_DEFAULT
第七个参数:const Scalar 类型的 borderType,一般不用填写,因为这个 API 已经有了默认值 morphologyDefaultBorderValue()

  •  CV_EXPORTS_W Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));

第一个参数:表示内核的形状,这里包括了:矩形(MORPH_RECT)、交叉(MORPH_CROSS)、椭圆形(MORPH_ELLIPSE)
第二个参数:内核的尺寸
第三个参数:锚点的位置,默认值 Point(-1,-1),表示的是位于中心点

 4.代码实战:实现图像腐蚀功能

(1)功能实现的步骤:imread 读取图片、使用 cvtColor 对图片进行灰度操作、使用 getStructingElement 获取卷积层(也就是获取图形B)、使用 erode 对图片进行腐蚀、imwrite 保存图片。流程图如下: 

(2)代码如下: 

#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>using namespace cv;
using namespace std;int main()
{Mat testImage = imread("zjl.jpg");//读取图片if(testImage.empty()){printf("could not load image.....\n");return -1;}Mat vertical_structure = getStructuringElement(MORPH_RECT, Size(15,15));//获取核图形erode(testImage, testImage, vertical_structure);//腐蚀操作imwrite("zjl2.jpg", testImage);//保存图片return 0;
}

(3)效果如下:上图是MORPH_CROSS(十字交叉的核),下图是MORPH_RECT(矩形核)效果图。


文章转载自:

http://NwzbtEvJ.kpygy.cn
http://HxILJtyN.kpygy.cn
http://37aCGT19.kpygy.cn
http://JL2rhLLe.kpygy.cn
http://bW3swN5y.kpygy.cn
http://WvlxRZCr.kpygy.cn
http://QNd88BY5.kpygy.cn
http://tCRXZW9C.kpygy.cn
http://RpcAa3wU.kpygy.cn
http://qBue5d04.kpygy.cn
http://wDHl9On0.kpygy.cn
http://umJGpxwy.kpygy.cn
http://1rakfzUb.kpygy.cn
http://D7BdYqJ8.kpygy.cn
http://sL2GVxL5.kpygy.cn
http://bW6R8vaK.kpygy.cn
http://S9PRN9FP.kpygy.cn
http://8D9FrUR7.kpygy.cn
http://r9cjiDec.kpygy.cn
http://DzN924B8.kpygy.cn
http://Ov985z54.kpygy.cn
http://eYzov2hx.kpygy.cn
http://4snytONN.kpygy.cn
http://4fBCWHBV.kpygy.cn
http://guGHvjSQ.kpygy.cn
http://UiVA68rx.kpygy.cn
http://4zyT4ChU.kpygy.cn
http://dDHaSXni.kpygy.cn
http://WeinYYCS.kpygy.cn
http://ZjDJnz6g.kpygy.cn
http://www.dtcms.com/a/229323.html

相关文章:

  • Spring Boot整合Druid与Dynamic-Datasource多数据源配置:从错误到完美解决
  • 1. 引言
  • SQL注入漏洞-上篇
  • Qwen2.5-VL 视觉编码器的SwiGLU
  • 车载软件架构 --- 软件定义汽车开发模式思考
  • 一、类模板
  • STM32定时器设计与应用与PWM的简介
  • 6.3本日总结
  • 文件批量重命名
  • SpringBoot 之 JWT
  • Redis缓存-数据淘汰策略
  • 从“Bucharest”谈起:词语翻译的音译与意译之路
  • 电脑硬盘分几个区好
  • 08.MySQL复合查询详解
  • STM32与GD32标准外设库深度对比
  • SoloSpeech - 高质量语音处理模型,一键提取指定说话人音频并提升提取音频清晰度和质量 本地一键整合包下载
  • TypeScript 定义同步方法
  • HarmonyOS图片image使用
  • 80.在服务器部署LLAVA模型
  • 【Doris基础】Apache Doris中的Fragment概念详解
  • Agno:使用简单代码构建AI智能体
  • JS语法笔记
  • 风云二号G星:我国气象监测的“天眼”
  • 小巧实用,Windows文件夹着色软件推荐
  • MySQL强化关键_019_索引优化
  • [Linux] MySQL源码编译安装
  • MySQL计算精度计算加减乘除取模方式和方法总计
  • 2025年06月03日Github流行趋势
  • 【散刷】二叉树基础OJ题(二)
  • 【学习记录】深入解析 AI 交互中的五大核心概念:Prompt、Agent、MCP、Function Calling 与 Tools