【OpenCV(C++)】图像处理:形态学滤波

  • 形态学(morphology)
  • 膨胀与腐蚀
  • 膨胀
  • 腐蚀
  • 其它形态学滤波
  • 开运算(Opening Operation)
  • 闭运算(Closing Operation)
  • 形态学梯度(Morphological Gradient)
  • 顶帽(Top Hat)
  • 黑帽(Black Hat)
  • element


形态学(morphology)

图像处理中的形态学指的是数学形态学(Mathmatical morphology),它是一门建立在格论和拓扑学基础之上的图像分析学科。形态学操作就是基于形状的一系列图像处理操作。

膨胀与腐蚀

膨胀(dilate)与腐蚀(erode)是最基本的形态学操作,能实现多种多样的功能:

  • 消除噪声
  • 分割出独立的图像元素,在图像中连接相邻的元素
  • 寻找图像中明显的极大值区域或极小值区域
  • 求出图像的梯度

注:腐蚀和膨胀是对高亮部分而言的

膨胀

膨胀是求局部最大值的操作。

opencv 形态学运算 opencv形态学滤波_运算符


dilate函数使用像素邻域内的局部极大运算符来膨胀一张图片。

#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>

using namespace cv;
using namespace std;

int main()
{
	Mat srcImage = imread("fg.jpg");
	namedWindow("【原图】膨胀操作");
	namedWindow("【处理图】膨胀操作");
	imshow("【原图】膨胀操作", srcImage);

	Mat element = getStructuringElement(MORPH_BLACKHAT, Size(100, 100));
		
	Mat dstImage;

	dilate(srcImage, dstImage, element);

	imshow("【处理图】膨胀操作", dstImage);
	waitKey(0);

	return 0;
}

运行效果如下:

opencv 形态学运算 opencv形态学滤波_#include_02

腐蚀

腐蚀是求局部最小值的操作。

opencv 形态学运算 opencv形态学滤波_图像处理_03


erode函数使用像素邻域内的局部极小运算符来腐蚀一张图片。

erode(g_srcImage, g_dstImage, element);

opencv 形态学运算 opencv形态学滤波_opencv 形态学运算_04

其它形态学滤波

开运算(Opening Operation)

开运算即先腐蚀后膨胀的过程。可以用来消除小物体,在纤细点处分离物体,并且在平滑较大物体的边界的同时不明显改变其面积。

opencv 形态学运算 opencv形态学滤波_#include_05

闭运算(Closing Operation)

闭运算即先膨胀后腐蚀的过程。能够排除小型黑洞(黑色区域)。

opencv 形态学运算 opencv形态学滤波_#include_06

形态学梯度(Morphological Gradient)

即膨胀图与腐蚀图之差。对二值图像进行这一操作可以将blob的边缘突出出来。

顶帽(Top Hat)

即原图与开运算之差,突出比原图轮廓周围更明亮的区域。

opencv 形态学运算 opencv形态学滤波_opencv 形态学运算_07

黑帽(Black Hat)

即原图与闭运算之差,突出比原图轮廓周围更暗的区域。

opencv 形态学运算 opencv形态学滤波_图像处理_08

element

下面分别为使用十字形、矩形、椭圆作为元素element的运行效果:

  • 十字形

opencv 形态学运算 opencv形态学滤波_运算符_09

  • 矩形

opencv 形态学运算 opencv形态学滤波_图像处理_10

  • 椭圆

opencv 形态学运算 opencv形态学滤波_图像处理_11