OpenCV黑帽运算(BLACKHAT)详解与实战

栗子
栗子
发布时间:2026-10-15 | 5人浏览过
原创

本文深入解析OpenCV中的黑帽运算(MORPH_BLACKHAT),阐述其通过闭运算结果减去原图以突出暗部细节的原理。详细列出morphologyEx函数的各项参数,并提供C++测试代码及效果演示,帮助开发者掌握该形态学操作在图像分析中的应用。

原理

形态学是图像处理领域的重要概念,其理论基础源于数学形态学,融合了格论与拓扑学的分析方法。黑帽运算属于形态学处理的一种,它结合了腐蚀与膨胀两种基本操作。

具体而言,黑帽运算的计算方式是用闭运算处理后的图像减去原始图像。这种操作能够有效增强图像中比周围轮廓更暗的区域,使细节更加显著。具体的视觉效果可参考下方的图1和图2。

函数原型

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 = morphologyDefaultBorderValue() );
其中op=MORPH_BLACKHAT

参数说明

  • src:输入图像,通常为Mat类型。
  • dst:输出图像,用于存储处理结果。
  • op:指定运算类型,执行黑帽运算时需设置为MORPH_BLACKHAT。
  • anchor:锚点位置,默认值为(-1, -1),即位于结构元素的中心,通常无需手动修改。
  • iterations:迭代次数,默认为1次。
  • borderType:边界像素的推断模式,OpenCV默认值为BORDER_CONSTANT。若需扩展图像边界,不同模式下生成像素的规则有所差异。
  • borderValue:当边界模式为常数时的边界值,默认调用morphologyDefaultBorderValue()函数获取。

测试代码

#include<iostream>
#include<opencv2/opencv.hpp>
#include<ctime>
using namespace std;
using namespace cv;
int main(void)
{
	cv::Mat test = cv::Mat::zeros(64, 64, CV_8UC1);
	cv::rectangle(test, cv::Rect(30, 30, 8, 8), 255, -1);
	cv::rectangle(test, cv::Rect(33, 30, 2, 2), 0, -1);
 
	cv::Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));
	cv::Mat result, close;
	cv::morphologyEx(test, close, MORPH_CLOSE, element);
	cv::morphologyEx(test, result, MORPH_BLACKHAT, element);
 
	imshow("original", test);
	imshow("close", close);
	imshow("result", result);
	waitKey(0);
 
	system("pause");
	return 0;
}

测试效果

如图所示,原始图像包含一个8x8的矩形,其中存在一个2x2的凹陷区域。使用3x3的矩形结构元素进行闭运算后(见图2),凹陷部分被填充消失;随后进行黑帽运算(见图3),该凹陷区域的细节被显著突出。

以上就是关于OpenCV黑帽运算(MORPH_BLACKHAT)的详细使用方法。如需了解更多OpenCV形态学处理相关内容,欢迎查阅本站过往文章或继续浏览后续教程,感谢支持!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表