Opencv基础入门笔记10

Opencv基础入门笔记10:形态学操作

上一节我们已经知道形态学操作包括基本的腐蚀膨胀,及开闭运算,那还有其他什么形态学操作呢

基本的运算包括:二值腐蚀和膨胀、二值开闭运算、骨架抽取、极限腐蚀、形态学梯度、顶帽黑帽变换、颗粒分析、流域变换、灰值腐蚀和膨胀、灰值开闭运算、灰值形态学梯度等。本节笔记复习基本的开闭运算,顶帽黑帽运算。

补充上一节内容:腐蚀和膨胀是对白色部分(高亮部分)而言的,不是黑色部分。膨胀就是图像中的高亮部分进行膨胀,“领域扩张”,效果图拥有比原图更大的高亮区域。腐蚀就是原图中的高亮部分被腐蚀,“领域被蚕食”,效果图拥有比原图更小的高亮区域。

1.类型介绍

1.开运算
开运算就是先腐蚀后膨胀,效果:去除小的对象,在纤细处分离物体和平滑较大物体边界的作用。(假设前景就是对象)
在这里插入图片描述
2.闭运算
闭运算就是先膨胀后腐蚀,效果:可以填充小的hole(fillhole),连接邻近物体和平滑边界的作用(假设对象是前景色,背景是黑色)
在这里插入图片描述
3.形态学梯度
对图片分别进行腐蚀,膨胀,然后用膨胀得到的图片减去腐蚀得到的图片,得形态学梯度图片,又叫基本梯度;效果:提取想要的特征,用于过滤
在这里插入图片描述
ps:其他的包括方向梯度,内部梯度等,没有相关API,但是可以自己实现

4.顶帽
原图像作了开运算后的图片之间相差的图像;效果:提取想要的特征
在这里插入图片描述
5.黑帽
原图像作了闭运算后的图片之间相差的图像;效果:提取想要的特征

在这里插入图片描述

2.相关AP(morphologyEx)

void morphologyEx(InputArray src, OutputArray dst, int op, InputArray kernel, Point anchor=Point(-1,-1), intiterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue() )
1.输入的图像;
2.输出的图像;
3.形态学操作的方法,如顶帽;
4.InputArray类型的kernel,形态学运算的内核。若为NULL时,表示的是使用参考点位于中心3x3的核。如果设置5*5的即:Mat(5, 5, CV_8U)
5.kernel的anchor,锚点,默认是(-1,-1),中心锚点
6.迭代次数,默认是1,进行这个操作几次
7.int类型的borderType,用于推断图像外部像素的某种边界模式。注意它有默认值BORDER_ CONSTANT。
8.const Scalar&类型的borderValue,当边界为常数时的边界值,有默认值morphologyDefaultBorderValue()

3.代码演示相关操作

int Opt = 0,腐蚀 ,MORPH_ERODE
int Opt = 1,膨胀,MORPH_DILATE
int Opt = 2,开运算,MORPH_OPEN
int Opt = 3,闭运算,MORPH_CLOSE
int Opt = 4,形态学梯度,MORPH_GRADIENT
int Opt = 5,黑帽,MORPH_BLACKHAT
int Opt = 6,顶帽,MORPH_TOPHAT
Opencv基础入门笔记10_第1张图片
用5*5的kernel,创建滑动条事件演示如下

腐蚀
Opencv基础入门笔记10_第2张图片
膨胀
Opencv基础入门笔记10_第3张图片
开运算
Opencv基础入门笔记10_第4张图片
闭运算
Opencv基础入门笔记10_第5张图片
形态学梯度
Opencv基础入门笔记10_第6张图片
黑帽
Opencv基础入门笔记10_第7张图片
顶帽
Opencv基础入门笔记10_第8张图片

// Opencv 文件.cpp :
#include "pch.h"
#include
#include 
using namespace cv;
using namespace std;
int Opt = 1;
int max_opt = 6;
void Callback_demo(int, void*);
Mat dst;
Mat src1;
char OUTPUT_WIN[] = "output_image";


int main()
{
	src1 = imread("E:\\360downloads\\hl.png");
	if (!src1.data) {//!src.data与src.empty()一样;
		printf("failure to load the image1 ");
		return -1;
	}
	namedWindow(OUTPUT_WIN, WINDOW_AUTOSIZE);
	imshow("src1", src1);
	//
	createTrackbar("Opt", OUTPUT_WIN, &Opt, max_opt, Callback_demo);
	Callback_demo(0, 0);


	waitKey(0);
	return 0;
}
void Callback_demo(int, void*) {
	//定义一个卷积核,kernel 的shape;
	Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5), Point(-1, -1));//这里用MORPH_RECT,不用MORPH_CROSS
	//进行形态学操作
	morphologyEx(src1, dst, Opt, kernel, Point(-1, -1), 1, 0);
	imshow(OUTPUT_WIN, dst);
	return;


}

	



ps:这里只进行了简单的演示,没有二值化

你可能感兴趣的:(#,opencv基础笔记,计算机视觉,opencv)