图像形态学的操作

OpenCV的形态学操作,多数是基于膨胀(dilate)与腐蚀(erode)形成的,在二值图像处理和灰度图像处理中有很多运用;彩色图像直接进行图像形态学操作效果不好;图像形态学操作主要针对二值图像
1、开操作-open;
2、闭操作-close;
3、形态学梯度- Morphological Gradient;
4、顶帽-top hat;
5、黑帽-black hat;

开操作(open)

1、开操作:指先腐蚀后膨胀;
2、可以去除小的对象;假设对象是前景色,背景是黑***r>

闭操作(close)

1、闭操作:指先膨胀后腐蚀;
2、可以填充小的洞(fill hole),假设对象是前景色,背景是黑***r>

形态学梯度(Morphological Gradient)

1、膨胀减去腐蚀;
2、又称为基本梯度,每个像素的值不同成梯度(其他还包括内部梯度(原图-腐蚀图),方向梯度(在x,y方向进行梯度计算))

顶帽(Tophat)

1、顶帽:指原图像与开操作之间的差值图像;

黑帽(Blackhat)

1、黑帽:指闭操作图像与原图像的差值图像;

相关API

1、形态学操作API:morphologyEx(src, dest, CV_MOP_BLACKHAT , kernel);(形态学扩展 )

//参数说明:
morphologyEx(src, dest, CV_MOP_BLACKHAT , kernel);
src : 输入图像
dest : 输出图像
int OPT : 形态学操作类型,可以传入的宏参数有:CV_MOP_OPEN/CV_MOP_CLOSE/CV_MOP_GRADIENT/CV_MOP_TOPHAT/CV_MOP_BLACKHAT;
Mat kernel : 结构元素
int iteration : 迭代次数,默认是1

Code

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
   
	Mat src = imread("C:\\Users\\hello\\Desktop\\9.jpg");
	if (!src.data)
	{
   
		cout << "could not load the image..." << endl;
		return -1;
	}
	namedWindow("input image", CV_WINDOW_AUTOSIZE);
	imshow("input image", src);

	char output_title[] = "morphology demo";
	namedWindow(output_title, CV_WINDOW_AUTOSIZE);

	Mat dest;
	//结构元素大小的选取和要去除的对象有关系,必须能够部分覆盖要去除的对象;
	Mat kernel = getStructuringElement(MORPH_RECT,Size(11,11),Point(-1,-1));
	//开操作
	//morphologyEx(src, dest, CV_MOP_OPEN, kernel);
	//闭操作
	//morphologyEx(src, dest, CV_MOP_CLOSE, kernel);
	//形态学梯度
	morphologyEx(src, dest, CV_MOP_GRADIENT, kernel);
	//Tophat
	//morphologyEx(src, dest, CV_MOP_TOPHAT, kernel);
	//Blackhat
	morphologyEx(src, dest, CV_MOP_BLACKHAT, kernel);

	imshow(output_title, dest);

	waitKey(0);
	return 0;
}

效果

形态学腐蚀:

顶帽:
黑帽:(闭操作的特性是填洞)(实际运用中可以用来寻找坏点