【opencv】形态学操作(1)腐蚀与膨胀
程序员文章站
2022-07-14 11:53:47
...
形态学操作(1)腐蚀与膨胀。
简单来讲,形态学操作就是基于形状的一系列图像处理操作。通过将 结构元素 作用于输入图像来产生输出图像。
最基本的形态学操作有二:腐蚀与膨胀(Erosion 与 Dilation)。 他们的运用广泛:
消除噪声
分割(isolate)独立的图像元素,以及连接(join)相邻的元素。
寻找图像中的明显的极大值区域或极小值区域。
通过以下图像,我们简要来讨论一下膨胀与腐蚀操作(译者注:注意这张图像中的字母为黑色,背景为白色,而不是一般意义的背景为黑色,前景为白色):
腐蚀与膨胀的结构元素B的形状和大小可以是任意的;
可以通过一个API函数进行设定;
getStructuringElement(int shape,Size ksize,Point anchor)
其中:shape可以是以下三种类型:
1:矩形:MORPH_RECT
2:交叉形:MORPH_CROSS
3:椭圆形:MORPH_ELLIPSE
ksize:内核的大小可以是任意的奇数;(1,3,5,7。。。)
anchor:锚点:内核的中心位置;
腐蚀函数:
dilate(src,dst,kernel)
kernel 是上面那个函数设置的内核。
膨胀函数:
erode(src,dst,kernel);
具体应用看下面的案例:
#include<iostream>
#include<cstdlib>
#include<opencv2/opencv.hpp>
#include<highgui/highgui_c.h>
using namespace std;
using namespace cv;
Mat src, dst;
char OUTPUT_WIN[] = "output image";
int element_size = 0;
int max_size = 21;
void CallBack_dilate(int, void*);
void CallBack_erode(int, void*);
int main()
{
src = imread("F:/pic/lishi.png",CV_WINDOW_AUTOSIZE);
if (src.empty())
{
cout << "could not load the image!" << endl;
return -1;
}
namedWindow("imput image", CV_WINDOW_AUTOSIZE);
imshow("imput image", src);
namedWindow(OUTPUT_WIN, CV_WINDOW_AUTOSIZE);
createTrackbar("dilate", OUTPUT_WIN, &element_size, max_size, CallBack_dilate);
CallBack_dilate(0, 0);
createTrackbar("erode", OUTPUT_WIN, &element_size, max_size, CallBack_erode);
CallBack_erode(0, 0);
waitKey(0);
return 0;
}
//膨胀
void CallBack_dilate(int, void*)
{
int s = element_size * 2 + 1;
//设置内核的大小;
//内核有三种形状;1:矩形:MORPH_RECT; 2:交叉形:MORPH_CROSS . 3:椭圆形:MORPH_ELLIPSE;
//还可以指定内核大小,以及锚点位置。Point(-1,-1)表示默认为中间点。
Mat structureElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
//膨胀操作;src原图, dst 结果图, structureElement:腐蚀操作的内核。 如果不指定,默认为一个简单的 3x3 矩阵。
//否则,我们就要明确指定它的形状,可以使用函数 getStructuringElement:
dilate(src, dst, structureElement);
imshow(OUTPUT_WIN, dst);
}
//腐蚀
void CallBack_erode(int, void*)
{
int s = element_size * 2 + 1;
//设置内核的大小;
Mat structureElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
erode(src, dst, structureElement);
imshow(OUTPUT_WIN, dst);
}
上一篇: python高级--数据处理(jupyter安装及基本使用)
下一篇: 服务器搭建Jupyter平台