前言:
图像形态学操作 – 基于形状的一系列图像处理操作的合集,主要是基于集合论基础上的形态学数学
形态学有四个基本操作:腐蚀、膨胀、开、闭
膨胀与腐蚀是图像处理中最常用的形态学操作手段。
形态学操作-膨胀、腐蚀:
跟卷积操作类似,假设有图像A和结构元素B,结构元素B在A上面移动,其中B定义其中心为锚点,计算B覆盖下A的最大像素值用来替换锚点的像素,其中B作为结构体可以是任意形状。腐蚀跟膨胀操作的过程类似,唯一不同的是以最小值替换锚点重叠下图像的像素值。
相关API:
为形态学操作返回指定大小和形状的结构化元素。
函数构造并返回结构元素,这些元素可以进一步传递给erode、dilate或morphologyEx。
shape:1)MORPH_RECT 表示产生矩形的结构元
2)MORPH_ELLIPSEM 表示产生椭圆形的结构元
3)MORPH_CROSS 表示产生十字交叉形的结构元
ksize:表示结构元的尺寸,即(宽,高),必须是奇数
anchor:表示结构元的锚点。
创建跟踪栏并将其附加到指定窗口。
膨胀操作
腐蚀操作
代码示例:
首先读取并显示一副图片,然后创建跟踪栏,分别对源图像进行膨胀与腐蚀操作,并通过跟踪栏设置结构化元素的大小,比较膨胀与腐蚀的效果。
#include "pch.h"
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
void Callback_demo(int pos, void *userdata);
int main()
{
Mat src = imread("F:\\visual studio\\Image\\women1.jpg");
if (src.empty())
{
cout << "Can't load the image" << endl;
return -1;
}
imshow("src", src);
int elementSize = 0;
int maxSize = 21;
createTrackbar("Element Size", "src", &elementSize, maxSize, Callback_demo, (void*)(&src));
waitKey(0);
}
void Callback_demo(int pos, void *userdata)
{
cout << pos << endl;
Mat mat = *((Mat*)userdata);
int size = 2 * pos + 1;
Mat structureElement = getStructuringElement(MORPH_RECT, Size(size, size), Point(-1, -1));
Mat dst;
dilate(mat, dst, structureElement, Point(-1, -1));
//erode(mat, dst, structureElement, Point(-1, -1));
imshow("src", dst);
}
膨胀效果如下:
腐蚀效果如下: