【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

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


相关文章
|
29天前
|
算法 Linux 程序员
嵌入式工程师以及C++程序员到公司就业需要掌握那些技术?
嵌入式工程师以及C++程序员到公司就业需要掌握那些技术?
|
1月前
|
Linux 编译器 C++
C/C++性能优化:从根本上消除拷贝操作的浪费
C/C++性能优化:从根本上消除拷贝操作的浪费
55 0
|
1月前
|
存储 Linux API
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用(三)
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用
32 1
|
1月前
|
消息中间件 Linux 数据处理
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用(二)
Linux系统编程 C/C++ 以及Qt 中的零拷贝技术: 从底层原理到高级应用
34 1
|
19天前
|
存储 算法 Linux
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
42 6
|
22天前
|
人工智能 机器人 C++
【C++/Python】Windows用Swig实现C++调用Python(史上最简单详细,80岁看了都会操作)
【C++/Python】Windows用Swig实现C++调用Python(史上最简单详细,80岁看了都会操作)
|
1月前
|
存储 JSON 安全
【C++ JSON库 json值的创建手段】深入探究C++中JSON对象定位与操作:从引用到回调函数
【C++ JSON库 json值的创建手段】深入探究C++中JSON对象定位与操作:从引用到回调函数
67 0
|
1月前
|
存储 缓存 算法
高效编程:我们应该了解哪些编译器优化技术?如何做出成熟的优化行为,掌握C++编程中的编译器优化艺术。
高效编程:我们应该了解哪些编译器优化技术?如何做出成熟的优化行为,掌握C++编程中的编译器优化艺术。
91 4
|
1天前
|
消息中间件 算法 Java
C++实时通信优化技术探究
C++实时通信优化技术探究
10 3
|
15天前
|
存储 C++
二叉树的操作(C++实现)
二叉树的操作(C++实现)