第11课 形态学操作之腐蚀与膨胀

1. 图像形态学操作(morphology operator)

  1. 定义: 图像形态学操作 – 基于形状的一系列图像处理操作的合集,主要是基于集合论基础上的形态学数学。
  2. 形态学有四个基本操作:腐蚀、膨胀、开、闭
  3. 膨胀与腐蚀是图像处理中最常用的形态学操作手段

2. 膨胀

  1. 定义:跟卷积操作类似,假设有图像A和结构元素B,结构元素B在A上面移动,其中B定义其中心为锚点,计算B覆盖下A的最大像素值用来替换锚点的像素,其中B作为结构体可以是任意形状。
  2. 公式:膨胀公式
    原图
    原图
    膨胀后的图
    膨胀后的图

3. 腐蚀

  1. 定义:腐蚀跟膨胀操作的过程类似,唯一不同的是以最小像素值替换锚点重叠下图像的像素值。
  2. 公式:
    腐蚀公式
  3. 结果展示:
    原图
    原图
    在这里插入图片描述
    腐蚀后的图

4. 相关API

4.1 生成结构元素B,即kernel

getStructuringElement(int shape, Size ksize, Point anchor);
  • 形状 (MORPH_RECT \MORPH_CROSS \MORPH_ELLIPSE)
  • 大小
  • 锚点 默认是Point(-1, -1)意思就是中心像素

4.2 膨胀

dilate(src, dst, kernel);
  1. 原图
  2. 生成图像
  3. 所采用的结构元素

4.3 腐蚀

erode(src, dst, kernel);

4.4 动态调整结构元素大小

createTrackbar(const String & trackbarname, const String winName,  int* value, int count, Trackbarcallback func, void* userdata=0)
  1. 按钮名
  2. 窗口名
  3. 按钮所指向的变量
  4. 最大值
  5. Callback函数(需要自己构建,如果设置为NULL就是说只有值update,但是不会调用callback的函数。)

5. 例程

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

Mat src, dst;
char OUTPUT_WIN[] = "output image";
int element_size = 3;
int max_size = 21;
void CallBack_Demo(int, void*);
int main(int argc, char** argv) {
	
	src = imread("D:/vcprojects/images/test1.png");
	if (!src.data) {
		printf("could not load image...\n");
		return -1;
	}
	namedWindow("input image", CV_WINDOW_AUTOSIZE);
	imshow("input image", src);

	namedWindow(OUTPUT_WIN, CV_WINDOW_AUTOSIZE);
	createTrackbar("Element Size :", OUTPUT_WIN, &element_size, max_size, CallBack_Demo);
	CallBack_Demo(0, 0);

	waitKey(0);
	return 0;
}

void CallBack_Demo(int, void*) {
	int s = element_size * 2   1;
	Mat structureElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
	// dilate(src, dst, structureElement, Point(-1, -1), 1);//膨胀
	erode(src, dst, structureElement);//腐蚀
	imshow(OUTPUT_WIN, dst);
	return;
}

发布了31 篇原创文章 · 获赞 12 · 访问量 2779

猜你喜欢

转载自blog.csdn.net/weixin_42877426/article/details/104175166