【OpenCv • c++】形态学技术操作 —— 开运算与闭运算

简介: 【OpenCv • c++】形态学技术操作 —— 开运算与闭运算

前言


在上一篇文章中,我们了解了腐蚀与膨胀的原理与实现,今天我们继续学习形态学技术操作里面的开运算与闭运算。


开运算


Q:什么是开运算?

A: 我们将先腐蚀后膨胀称为开运算,开运算能够去除孤立的小点,毛刺和小桥(即联通两块区域的小点),而总的位置和形状不变。


参考代码


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

其中,src代表输入图像(二值图像或灰度图像),dst表示输出图像,op表示形态学操作算子类型,可以设置为MORPH_OPEN开操作,MORPH_CLOSE闭操作,MORPH_GRADIENT形态学梯度操作,MORPH_TOPHAT顶帽操作,MORPH_BLACKHAT黑帽操作,iterations可以选择对图像进行多次形态学运算,borderValue 和borderType 为可选参数设置,针对边界处理。

#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/types_c.h>
#include<opencv2/imgproc.hpp>
#include<iostream>
using namespace std;
using namespace cv;
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(10, 10));
  // 形态学闭操作
  cv::Mat closeMat;
  cv::morphologyEx(segDst, closeMat, cv::MORPH_CLOSE, element);
  cv::imshow(" srcGray ", srcGray);
  cv::imshow(" closeMat", closeMat);
  cv::waitKey();
  return 0;
}

94afe70f4f340044c016c4630c3e243e_8a64f407fe76449eb0d3a409b0b7319d.png


闭运算


Q:什么是闭运算?

A:我们将先膨胀后腐蚀成为闭运算,闭运算能够填平小孔,弥合小裂缝,而总的位置和形态不变。


参考代码


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

其中,src代表输入图像(二值图像或灰度图像),dst表示输出图像,op表示形态学操作算子类型,可以设置为MORPH_OPEN开操作,MORPH_CLOSE闭操作,MORPH_GRADIENT形态学梯度操作,MORPH_TOPHAT顶帽操作,MORPH_BLACKHAT黑帽操作,iterations可以选择对图像进行多次形态学运算,borderValue 和borderType 为可选参数设置,针对边界处理。

#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/types_c.h>
#include<opencv2/imgproc.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{
  cv::Mat srcImage = cv::imread("C:\\Users\\86173\\Desktop\\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(10, 10));
  //形态学开操作
  cv::Mat openMat;
  cv::morphologyEx(segDst, openMat, cv::MORPH_OPEN, element);
  cv::imshow(" srcGray ", srcGray);
  cv::imshow(" openMat", openMat);
  cv::waitKey();
  return 0;
}


30c408c34c9b36a355efaa211344659a_cd4b09c3cde54f249f30273cd5918593.png


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