形态学:开、闭、梯度、顶帽、黑帽

原理

下面的element指的是进行操作的核

  • 开操作(opening):
    d s t = d i l a t e ( e r o d e ( s r c , e l e m e n t ) ) dst=dilate(erode(src,element))
    作用:
  1. 平滑物体的轮廓
  2. 断开较窄的交界处
  3. 消除细小的噪声、突出物
    作用3




  • 闭操作(closing):
    d s t = e r o d e ( d i l a t e ( s r c , e l e m e n t ) ) dst=erode(dilate(src,element))
    作用:
  1. 平滑物体的轮廓
  2. 弥合较窄的交界处,填补轮廓线的断裂
  3. 消除细小的孔洞
    在这里插入图片描述
  • 形态学梯度(Morphological Gradient):
    d s t = d i l a t e ( s r c , e l e m e n t ) e r o d e ( s r c , e l e m e n t ) dst=dilate(src,element)−erode(src,element)
    作用:提取物体轮廓

在这里插入图片描述







  • 顶帽(top hat):
    d s t = s r c o p e n ( s r c , e l e m e n t ) dst=src−open(src,element)


.





  • 黑帽(black hat):
    d s t = c l o s e ( s r c , e l e m e n t ) s r c dst=close(src,element)−src





官方代码

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;


int morph_elem=0;
int morph_size=0;
int morph_operator=0;
int const max_operator=4;
int const max_elem=2;
int const max_kernel_size=21;

const char* window_name = "Morphlogy Transformation Demo";

void Morphlogy_Opertions(int , void*);

Mat src,dst;

int main(void)
{
	
    src = cv::imread("../res/1.jpg");
	if(src.empty())
	{
		cout << "load image failed" << endl;	
		return -1;
	}
	

	cv::namedWindow(window_name,cv::WINDOW_NORMAL);

//创建Trackbar
	cv::createTrackbar("Operator:\n 0:Opening-1:Closing\n2:Gradient-3:Top hat\n4:Black hat",window_name,&morph_operator,max_operator,Morphlogy_Opertions);
	cv::createTrackbar("Element:\n 0:Rect-1:Cross-2:Ellipse",window_name,&morph_elem,max_elem,Morphlogy_Opertions);
	cv::createTrackbar("Kernel size:\n2n+1",window_name,&morph_size,max_kernel_size,Morphlogy_Opertions);


	Morphlogy_Opertions(0,NULL);

	waitKey(0);
	return 0;

};


void Morphlogy_Opertions(int , void*)
{

	int operations= morph_operator+2; //因为第一个是开操作,枚举是2
	Mat element = cv::getStructuringElement(morph_elem,Size(2*morph_size+1,2*morph_size+1),Point(morph_size,morph_size));

	cv::morphologyEx(src,dst,operations,element);
	imshow(window_name,dst);


}

结果:
在这里插入图片描述

在这里插入图片描述



OpenCV API

此函数可以进行多种形态学操作:腐蚀、膨胀、开、等等

void cv::morphologyEx (
InputArray src,&emsp   //原图
OutputArray dst,&emsp   //输出图
int op,&emsp   // 进行的具体的形态学操作,枚举如下
InputArray kernel,&emsp   //核(可以根据cv::getStructuringElement得到)
Point anchor = Point(-1,-1),&emsp   //锚点(默认)
int iterations = 1,&emsp   //进行此操作的次数(默认)
int borderType = BORDER_CONSTANT,&emsp   //边界的处理(默认)
const Scalar & borderValue = morphologyDefaultBorderValue() &emsp   //边界的常数值(默认)
)

枚举名 数值 操作
MORPH_ERODE 0 腐蚀
MORPH_DILATE 1 膨胀
MORPH_OPEN 2
MORPH_CLOSE 3
MORPH_GRADIENT 4 形态梯度
MORPH_TOPHAT 5 顶帽
MORPH_BLACKHAT 6 黑帽
MORPH_HITMISS 7 击中、不击中

猜你喜欢

转载自blog.csdn.net/zzyczzyc/article/details/84943530