图像处理之形态学黑帽运算

1.认识黑帽运算

图像黑帽运算

是图像经过闭运算操作后再减去原始图像的结果,得到图像内部的小孔,或者前景色中的小黑点部分。表达式如下:

<code>dst = blackhat(src,element) = close(src,element) - src/<code>

1.1运用场景

常用于背景和轮廓提取。

1.2优势

用黑帽运算来分离比邻近点暗一些的斑块,可以获得非常完美的轮廓效果图。

图像处理之形态学黑帽运算


2.OpenCV函数

<code>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() );/<code>

参数解释:

  • src:输入图像,即源图像,填Mat类的对象即可。图像位深应该为以下五种之一:CV_8U, CV_16U,CV_16S, CV_32F 或CV_64F。
  • dst:OutputArray类型的dst,即目标图像,函数的输出参数,需要和源图片有一样的尺寸和类型。
  • op:int类型的op,表示形态学运算的类型。
  • kernel:InputArray类型的kernel,形态学运算的内核。若为NULL时,表示的是使用参考点位于中心3x3的核。我们一般使用函数 getStructuringElement()配合这个参数的使用。getStructuringElement()函数会返回指定形状和尺寸的结构元素(内核矩阵)。关于getStructuringElement()函数,请见文章里有相关讲解:【拜小白opencv】36-形态学滤波1——腐蚀
  • anchor:Point类型的anchor,锚的位置,其有默认值(-1,-1),表示锚位于中心。
  • iterations:int类型的iterations,迭代使用函数的次数,默认值为1。
  • borderType:int类型的borderType,用于推断图像外部像素的某种边界模式。注意它有默认值BORDER_ CONSTANT。
  • borderValue:const Scalar&类型的borderValue,当边界为常数时的边界值,有默认值morphologyDefaultBorderValue(),一般我们不用去管他。需要用到它时,可以看官方文档中的createMorphologyFilter()函数得到更详细的解释。

往往只需要填前面的四个参数,后面的四个参数都有默认值。

3.C++实现

<code>//--------------------------------------【程序说明】-------------------------------------------
//\t\t程序描述:形态学黑帽运算
//\t\t开发测试所用操作系统: Windows 10 64bit
//\t\t开发测试所用IDE版本:Visual Studio 2017
//\t\t开发测试所用OpenCV版本:\t3.4
//\t\t2020年3月 Created by @DL小宝
//\t\t2020年3月 Revised by @DL小宝
//------------------------------------------------------------------------------------------------

//---------------------------------【头文件、命名空间包含部分】----------------------------
//\t\t描述:包含程序所使用的头文件和命名空间
//------------------------------------------------------------------------------------------------
#include <opencv2>
#include <opencv2>
#include <opencv2>
using namespace cv;

//-----------------------------------【main( )函数】--------------------------------------------
//\t\t描述:控制台应用程序的入口函数,我们的程序从这里开始

//-----------------------------------------------------------------------------------------------
int main()
{
\t//载入原始图
\tMat image = imread("hmm.jpg"); //工程目录下应该有一张名为hmm.jpg的素材图
\t//创建窗口
\tnamedWindow("【原始图】黑帽运算");
\tnamedWindow("【效果图】黑帽运算");
\t//显示原始图
\timshow("【原始图】黑帽运算", image);
\t//定义核
\tMat element = getStructuringElement(MORPH_RECT, Size(15, 15));
\t//进行形态学操作
\tmorphologyEx(image, image, MORPH_BLACKHAT, element);
\t//显示效果图
\timshow("【效果图】黑帽运算", image);
\twaitKey(0);
\treturn 0;
}/<opencv2>/<opencv2>/<opencv2>/<code>

4.可视化


图像处理之形态学黑帽运算


图像处理之形态学黑帽运算


分享到:


相關文章: