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(矩形核)效果图。

相关推荐
一水鉴天几秒前
现今/现在/现代——系统设计“现”层架构 20260503 (腾讯元宝)
人工智能·架构
格林威1 分钟前
工业视觉检测:两大主流异常检测开源框架深度对比(PatchCore vs SPADE)
开发语言·人工智能·深度学习·数码相机·计算机视觉·视觉检测·工业相机
天诚智能门锁4 分钟前
天诚cat.1人脸公租房智能锁及管控平台助力三门县公租房管理
大数据·人工智能·物联网·智慧城市·公租房
threelab4 分钟前
Three.js 3D 饼图效果 | 三维可视化 / AI 提示词
javascript·人工智能·3d
小何code9 分钟前
人工智能【第11篇】K近邻算法KNN:简单有效的分类方法(长文+代码实现)
人工智能·机器学习·knn
测试员周周9 分钟前
【AI测试系统】第5篇:AI 编码工具抛硬币?我们用 LangGraph 做了个“确定性+AI”的测试系统(附自愈架构)
人工智能·python·功能测试·测试工具·架构·langchain·单元测试
初学大模型10 分钟前
与机器心智的对话:论人机交互中提问的精确性与描述的详尽性
人工智能
AI木马人11 分钟前
18.人工智能实战:LoRA 微调后效果不升反降?从数据清洗到训练参数的完整排查方案
人工智能·深度学习·机器学习
davedeveloper11 分钟前
ReAct 论文深度解读:让大模型学会“边想边做“
人工智能
2601_9564141412 分钟前
2026年5月PCB厂家推荐:TOP5榜产品应对5G基站散热挑战
大数据·人工智能·5g