【OpenCv • c++】形态学技术操作 —— 顶帽操作与黑帽操作

  • 🚀 个人简介:CSDN「博客新星」TOP 10 , C/C++ 领域新星创作者
  • 💟 作    者:锡兰_CC ❣️
  • 📝 专    栏:【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;
}

   开运算可以消除暗背景下的较亮区域,如果用原图减去开运算结果就可以得到原图中灰度较亮的区域,顶帽操作因此也称为白顶帽变换。它还有一个很重要的作用,就是校正不均匀光照。

黑帽操作

   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;
}

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

其他

更多专栏订阅:

  • 👍 【开卷数据结构】
  • 💛 【备战蓝桥,冲击省一】
  • 💕   从零开始的 c++ 之旅
  • 💖 【OpenCV • c++】计算机视觉

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
青葱年少的头像青葱年少普通用户
上一篇 2023年5月27日
下一篇 2023年5月27日

相关推荐