【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


相关文章
|
1月前
|
C++ 容器
C++中向量的操作vector
C++中向量的操作vector
|
2月前
|
存储 分布式数据库 API
技术好文:VisualC++查看文件被哪个进程占用
技术好文:VisualC++查看文件被哪个进程占用
|
2月前
|
C++
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
28 0
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
|
2月前
|
C++ iOS开发 开发者
C++一分钟之-文件输入输出(I/O)操作
【6月更文挑战第24天】C++的文件I/O涉及`ifstream`, `ofstream`和`fstream`类,用于读写操作。常见问题包括未检查文件打开状态、忘记关闭文件、写入模式覆盖文件及字符编码不匹配。避免这些问题的方法有:检查`is_open()`、显式关闭文件或使用RAII、选择适当打开模式(如追加`ios::app`)以及处理字符编码。示例代码展示了读文件和追加写入文件的实践。理解这些要点能帮助编写更健壮的代码。
41 2
|
2月前
|
算法 前端开发 Linux
【常用技巧】C++ STL容器操作:6种常用场景算法
STL在Linux C++中使用的非常普遍,掌握并合适的使用各种容器至关重要!
55 10
|
1月前
|
存储 计算机视觉
OpenCv形态学(一)
OpenCv形态学(一)
|
2月前
|
人工智能 计算机视觉 Python
人工智能视觉:基于OpenCV的人脸识别技术的深度解析
人工智能视觉:基于OpenCV的人脸识别技术的深度解析
|
2月前
|
C++
C++核心技术要点《友元函数,友元类》
C++核心技术要点《友元函数,友元类》
38 3
|
2月前
|
C++ 索引
C++核心技术要点《运算符重载》
C++核心技术要点《运算符重载》
41 2
|
2月前
|
C++
C++核心技术要点《异常处理详解》
C++核心技术要点《try-throw-catch异常处理详解》
39 2

热门文章

最新文章