学习OpenCV---形态学操作

图像形态学

形态学操作就是基于形状的一系列图像处理操作,也可以理解为一种滤波行为。最基本的形态学操作使:膨胀和腐蚀。


膨胀和腐蚀

膨胀是图像和核进行卷积,然后取覆盖区域的最大值,这样就会使图像的高亮区域增大,OpenCV的API是dilate。和膨胀相反的,腐蚀是取的覆盖区域最小值。这样会使图像的高亮区域减少,OpenCV的API是erode。

void dilate( InputArray src, OutputArray dst, InputArray kernel,
                          Point anchor = Point(-1,-1), int iterations = 1,
                          int borderType = BORDER_CONSTANT,
                          const Scalar& borderValue = morphologyDefaultBorderValue() );

void erode( InputArray src, OutputArray dst, InputArray kernel,
                         Point anchor = Point(-1,-1), int iterations = 1,
                         int borderType = BORDER_CONSTANT,
                         const Scalar& borderValue = morphologyDefaultBorderValue() );


和卷积核不同的是,我们可以自定义自己的形态核,形态核不需要任何数值的填充,核在图像上移动时候,核元素只需要确定简单的标明在哪个范围内取最大值和最小值。自定义核的API函数是getStructuringElement。

Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));

综合编程

Mat src,dst,dst1,mapx,mapy;
char OUTPUT[] ="Win2";
int TrackBarPos = 0;
int TrackBarMax = 21;	
void CallBack(int, void*);
int main()
{

	src = imread("D:/Lena.jpg");
	if(!src.data)  
	{  
		cout<<"Picture loading failed !"<

通用的形态学

通用的形态学操作使用的API函数是:
void morphologyEx( InputArray src, OutputArray dst,
                                int op, InputArray kernel,
                                Point anchor = Point(-1,-1), int iterations = 1,
                                int borderType = BORDER_CONSTANT,
                                const Scalar& borderValue = morphologyDefaultBorderValue() );

其中:op参数可以选择:
①腐蚀操作(MORPH_ERODE = 0)
②膨胀操作(MORPH_DILATE =1)
注意:腐蚀和膨胀都说的是亮的区域,膨胀是亮的区域变大,腐蚀和膨胀相反,是亮的区域变小。
③开运算(MORPH_OPEN =2)
开运算是先腐蚀再膨胀,开操作去除小的明亮区域,剩余亮的区域被隔绝,但是大小不变。
理解:先腐蚀的话,亮的区域变小,再膨胀操作,可以排除小团物体。
下图是进行开操作的结果:
学习OpenCV---形态学操作_第1张图片

④闭运算(MORPH_CLOSE = 3)
和开操作相反,闭运算是通过先对图像膨胀再腐蚀实现的。
⑤形态学梯度:把团块的边缘突出来。
⑥礼帽
礼帽是从A中减去A的开运算,局部的极大值点被分隔出来。
⑦黑帽 
闭运算结果图与原图像之差

综合编程

Mat src,dst,dst1,mapx,mapy;
char OUTPUT[] ="Win2";
int TrackBarPos = 0;
int TrackBarMax = 21;
int ModePos = 0;
int ModeMax = 6;
void CallBack(int, void*);
int main()
{

	src = imread("D:/dilate.jpg");
	if(!src.data)  
	{  
		cout<<"Picture loading failed !"<

实际例子

验证码的读取

int main()
{
	//读取图像
	Mat src, dst;
	src = imread("D:/121.png");
	if (!src.data)
	{
		cout<<"Picture loading failed !"<

程序结果:
学习OpenCV---形态学操作_第2张图片





























你可能感兴趣的:(OpenCV学习)