【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("...c.jpg");
  if (!srcImage.data)
    return 1;
  cv::Mat srcGray;
  cvtColor(srcImage, srcGray, CV_RGB2GRAY);
  // 定义结构元素
  cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(15, 15));
  cv::Mat topHatMat, blackHatMat;
  // 形态学Top-Hat 顶帽
  cv::morphologyEx(srcGray, topHatMat, cv::MORPH_TOPHAT, element);
  cv::imshow("srcImage", srcImage);
  cv::imshow("topHatMat", topHatMat);
  cv::waitKey(0);
  return 0;
}

79ea7fee6e9488f2465ad23f344ec0b3_53a3e8571c26429b82aad10633209547.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.jpg");
  if (!srcImage.data)
    return 1;
  cv::Mat srcGray;
  cvtColor(srcImage, srcGray, CV_RGB2GRAY);
  // 定义结构元素
  cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(15, 15));
  cv::Mat topHatMat, blackHatMat;
  // 形态学Top-Hat 黑帽
  cv::morphologyEx(srcGray, blackHatMat, cv::MORPH_BLACKHAT, element);
  cv::imshow("srcImage", srcImage);
  cv::imshow("blackHatMat", blackHatMat);
  cv::waitKey(0);
  return 0;
}

a31c4edf9d22b0be119a99a430a3a608_a43232d36bda4412b409ba9630a93e11.png

  闭运算可以删除亮度较高背景下的较暗区域,如果用原图减去闭运算结果就可以得到原图中灰度较暗的区域,黑帽操作因此也称为黑底帽变换。


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