【OpenCv • c++】形态学技术操作 —— 腐蚀与膨胀

简介: 【OpenCv • c++】形态学技术操作 —— 腐蚀与膨胀

前言


形态学腐蚀膨胀操作是形态学的基本操作,常用于图形处理方面,实现了对目标像素点进行拓展的目的。从数学角度来讲,腐蚀膨胀操作就是将图像或者图像的一部分(称之为核A)与核(称之为核B)进行卷积。


腐蚀


Q:什么是腐蚀?

A: 腐蚀就是求局部最小值的操作,也就是核B与图像进行卷积,计算核B覆盖区域的像素点的最小值,并把最小值赋值给参考点指定的像素,使得图像中的白色区域变小。


参考代码


void erode(
  InputArray src,
  OutputArray dst,
  InputArray kernel,
  Point anchor = Point(-1, -1),
  int iterations = 1,
  int borderType = BORDER_CONSTANT,
  const Scalar& borderValue = morphologyDefaultB - orderValue()
)

其中,src 代表输入图像(二值化、灰度图像),dst 代表输出图像,kernel表示定义的结构元素大小,anchor代表结构元素的中心,如果默认参数为 (-1,-1),程序会自动将其设置为结构元素的中心。iteration为迭代次数,可以选择对图像进行多次形态学运算。borderType以及borderValue是可选择参数设置,针对边界设置。

#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/types_c.h>
#include<opencv2/imgproc.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main() {
  cv::Mat srcImage = cv::imread("...cc.png");
  if (!srcImage.data)
    return 1;
  cv::Mat srcGray;
  cvtColor(srcImage, srcGray, CV_RGB2GRAY);
  cv::Mat segDst, dilDst, eroDst;
  // 分通道二值化
  cv::inRange(srcGray, cv::Scalar(100),
    cv::Scalar(255), segDst);
  // 定义结构元素
  cv::Mat element = cv::getStructuringElement(
    cv::MORPH_ELLIPSE, cv::Size(5, 5));
  // 腐蚀膨胀操作
  cv::erode(segDst, eroDst, element);
  cv::imshow(" srcGray ", srcGray);
  cv::imshow(" segDst ", segDst);
  cv::imshow(" eroDst ", eroDst);
  cv::waitKey();
  return 0;
}


实现效果


0710eae48fa2b0419106c8ba56b5ae98_b97e2293f83f4c56af2a1155940a6653.png


膨胀


Q:什么是膨胀?

A: 膨胀就是求局部最大值的操作,也就是核B与图像进行卷积,计算核B覆盖区域的像素点的最大值,并把最大值赋值给参考点指定的像素,使得图像中的白色区域变大。


参考代码


void dilate(
  InputArray src,
  OutputArray dst,
  InputArray kernel,
  Point anchor = Point(-1, -1),
  int iterations = 1,
  int borderType = BORDER_CONSTANT,
  const Scalar& borderValue = morphologyDefault - BorderValue()
)


其中,src 代表输入图像(二值化、灰度图像),dst 代表输出图像,kernel表示定义的结构元素大小,anchor代表结构元素的中心,如果默认参数为 (-1,-1),程序会自动将其设置为结构元素的中心。iteration为迭代次数,可以选择对图像进行多次形态学运算。borderType以及borderValue是可选择参数设置,针对边界设置。

#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/types_c.h>
#include<opencv2/imgproc.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main() {
  cv::Mat srcImage = cv::imread("...cc.png");
  if (!srcImage.data)
    return 1;
  cv::Mat srcGray;
  cvtColor(srcImage, srcGray, CV_RGB2GRAY);
  cv::Mat segDst, dilDst, eroDst;
  // 分通道二值化
  cv::inRange(srcGray, cv::Scalar(100),
    cv::Scalar(255), segDst);
  // 定义结构元素
  cv::Mat element = cv::getStructuringElement(
    cv::MORPH_ELLIPSE, cv::Size(5, 5));
  // 腐蚀膨胀操作
  cv::dilate(segDst, dilDst, element);
  cv::imshow(" srcGray ", srcGray);
  cv::imshow(" segDst ", segDst);
  cv::imshow(" dilDst ", dilDst);
  cv::waitKey();
  return 0;
}


实现效果


35de08c97f047a292d25899a5b0e0d63_ac2bbed81d0d462d930e4ee364c35981.png


相关文章
|
23天前
|
计算机视觉
Opencv学习笔记(十二):图片腐蚀和膨胀操作
这篇文章介绍了图像腐蚀和膨胀的原理、作用以及使用OpenCV实现这些操作的代码示例,并深入解析了开运算和闭运算的概念及其在图像形态学处理中的应用。
81 1
Opencv学习笔记(十二):图片腐蚀和膨胀操作
|
4月前
|
C++ 容器
C++中向量的操作vector
C++中向量的操作vector
|
23天前
|
Ubuntu Linux 编译器
Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV
通过以上步骤,您已经成功在Ubuntu系统下的VS Code中配置了C/C++项目环境,并能够调用OpenCV库进行开发。请确保每一步都按照您的系统实际情况进行适当调整。
198 3
|
2月前
|
存储 算法 C++
C++提高篇:泛型编程和STL技术详解,探讨C++更深层的使用
文章详细探讨了C++中的泛型编程与STL技术,重点讲解了如何使用模板来创建通用的函数和类,以及模板在提高代码复用性和灵活性方面的作用。
49 2
C++提高篇:泛型编程和STL技术详解,探讨C++更深层的使用
|
5月前
|
存储 分布式数据库 API
技术好文:VisualC++查看文件被哪个进程占用
技术好文:VisualC++查看文件被哪个进程占用
|
2月前
|
存储 计算机视觉 C++
在C++中实现Armadillo库与OpenCV库之间的数据格式转换
在C++中实现Armadillo库与OpenCV库之间的数据格式转换是一项常见且实用的技能。上述步骤提供了一种标准的方法来进行这种转换,可以帮助开发者在两个库之间高效地转移和处理数据。虽然转换过程相对直接,但开发者应留意数据类型匹配和性能优化等关键细节。
58 11
|
2月前
|
存储 计算机视觉 C++
在C++中实现Armadillo库与OpenCV库之间的数据格式转换
在C++中实现Armadillo库与OpenCV库之间的数据格式转换是一项常见且实用的技能。上述步骤提供了一种标准的方法来进行这种转换,可以帮助开发者在两个库之间高效地转移和处理数据。虽然转换过程相对直接,但开发者应留意数据类型匹配和性能优化等关键细节。
22 3
|
3月前
|
人工智能 Anolis
聚焦C++20 最新标准!技术 Workshop 精彩亮点一览 | 2024 龙蜥大会
多场技术 Workshop、多位领域专家亲自授课,分享独家洞察与宝贵经验。
|
3月前
|
算法 C# 开发工具
《黑神话:悟空》背后的编程语言揭秘——超越C++的多元技术融合
【8月更文挑战第27天】在游戏开发领域,一款游戏的成功往往离不开其背后强大的技术支持和编程语言的精妙运用。《黑神话:悟空》作为备受瞩目的国产单机动作游戏,其开发过程不仅涉及了多种编程语言,更是一次技术创新的集中展现。然而,当我们深入探讨其开发语言时,会发现它并非仅依赖于单一的C++,而是融合了多种编程语言的优势,共同铸就了这款游戏的辉煌。
243 0
|
5月前
|
C++ iOS开发 开发者
C++一分钟之-文件输入输出(I/O)操作
【6月更文挑战第24天】C++的文件I/O涉及`ifstream`, `ofstream`和`fstream`类,用于读写操作。常见问题包括未检查文件打开状态、忘记关闭文件、写入模式覆盖文件及字符编码不匹配。避免这些问题的方法有:检查`is_open()`、显式关闭文件或使用RAII、选择适当打开模式(如追加`ios::app`)以及处理字符编码。示例代码展示了读文件和追加写入文件的实践。理解这些要点能帮助编写更健壮的代码。
56 2