OpenCV-图像处理(11、形态学操作)

版权声明:本文由 Micheal 超 博客 创作,转载请附带链接,有问题欢迎交流。 https://blog.csdn.net/qq_42887760/article/details/86179553

开操作- open

  • 先腐蚀后膨胀
    在这里插入图片描述
  • 可以去掉小的对象,假设对象是前景色,背景是黑色
    在这里插入图片描述

闭操作- close

  • 先膨胀后腐蚀(bin2)在这里插入图片描述
  • 可以填充小的洞(fill hole),假设对象是前景色,背景是黑色
    在这里插入图片描述

形态学梯度- Morphological Gradient

  • 膨胀减去腐蚀:形态学梯度就是指膨胀结果减去腐蚀结果。因为膨胀是取领域内的最大值,从而增大亮度高的区域的面积(在二值图中,就是增大白色区域的面积);而腐蚀是取邻域内的最小值,从而减小亮度高的区域的面积,所以,形态学梯度得到的就是图像中物体的边界。
    在这里插入图片描述
  • 又称为基本梯度(其它还包括-内部梯度、方向梯度)
    在这里插入图片描述

顶帽 – top hat

  • 顶帽 是原图像与开操作之间的差值图像
    在这里插入图片描述

黑帽 – black hat

  • 黑帽是闭操作图像与源图像的差值图像
    在这里插入图片描述

相关API

morphologyEx(src, dest, CV_MOP_BLACKHAT, kernel);

  • Mat src – 输入图像,图像位深应该为以下五种之一:CV_8U, CV_16U,CV_16S, CV_32F 或CV_64F。
  • Mat dest – 输出结果,需要和源图片有一样的尺寸和类型。
  • int类型的op,表示形态学运算的类型,可以是如下之一的标识符:
    • MORPH_OPEN – 开运算(Opening operation)
    • MORPH_CLOSE – 闭运算(Closing operation)
    • MORPH_GRADIENT -形态学梯度(Morphological gradient)
    • MORPH_TOPHAT - “顶帽”(“Top hat”)
    • MORPH_BLACKHAT - “黑帽”(“Black hat")
      注意:另有CV版本的标识符也可选择,如CV_MOP_CLOSE,CV_MOP_GRADIENT,CV_MOP_TOPHAT,CV_MOP_BLACKHAT,这应该是OpenCV1.0系列版本遗留下来的标识符,和上面的“MORPH_OPEN”一样的效果。
  • Mat kernel 结构元素,形态学运算的内核。若为NULL时,表示的是使用参考点位于中心3x3的核。我们一般使用函数 getStructuringElement配合这个参数的使用。getStructuringElement函数会返回指定形状和尺寸的结构元素(内核矩阵)。
  • int Iteration 迭代次数,默认是1
    在这里插入图片描述

代码示例

#include<opencv2/opencv.hpp>
#include <iostream>
using namespace cv;

Mat src,dst;
char Windows_Name[]="Morphology Transformations";
int morph_operator=0,morph_elem=0,morph_size=0;//形态学操作、卷积核类型,卷积核大小
int const max_operator = 4,max_elem = 2,max_kernel_size = 21;
void Morphology_Operations(int, void*);

int main(int argc,char** argv){
	//1、加载图像
	src=imread("E:/Experiment/OpenCV/Pictures/ErodeAndDilate.jpg");
	if(!src.data){return -1;}
	//2、创建一个窗口以显示“形态”操作的结果
	namedWindow(Windows_Name,CV_WINDOW_AUTOSIZE);
	//3、为用户创建03轨道栏以输入参数:
	//每次我们移动任何滑块时,将调用用户的函数Morphology_Operations以实现新的形态学操作,并且它将基于当前轨迹栏值更新输出图像。
	createTrackbar("形态学操作", Windows_Name, &morph_operator, max_operator,Morphology_Operations);
	createTrackbar("卷积核类型", Windows_Name, &morph_elem, max_elem,Morphology_Operations);
	createTrackbar("卷积核大小", Windows_Name, &morph_size, max_kernel_size,Morphology_Operations);

	Morphology_Operations(0,0);

	waitKey(0);
	return 0;
}
void Morphology_Operations(int, void*){
	int operation = morph_operator + 2;
	Mat element = getStructuringElement( morph_elem, Size( 2*morph_size + 1, 2*morph_size+1 ), Point( morph_size, morph_size ) );
	morphologyEx( src, dst, operation, element );
	imshow( Windows_Name, dst );
}

运行结果

在这里插入图片描述

参考博客

  1. https://blog.csdn.net/weixin_41695564/article/details/79935028
  2. https://blog.csdn.net/LYKymy/article/details/83153226

猜你喜欢

转载自blog.csdn.net/qq_42887760/article/details/86179553