OpenCV学习笔记(三)形态学处理之上篇(膨胀腐蚀)

  OpenCV中的形态学处理包括:开运算、闭运算、形态学梯度、顶帽、黑帽等,本篇主要介绍其中的膨胀腐蚀及其开、闭运算。由于OpenCV中默认是白色为感兴趣颜色,不管是膨胀算法、还是腐蚀算法都是针对图像中白色区域来说的。形态学处理也是使用的图像卷积的方式处理的,与边缘检测等卷积滤波核不同的是,形态学处理中的卷积核是没有值的,它类似于中值滤波,在卷积核覆盖的原图像中选取最大或者是最小像素点代替待处理锚点,与卷积核的值无关。
 膨胀:在卷积核覆盖的原图像中选取最大的像素点的值代替待处理的像素点。结果就是原本高亮的区域变得更宽了。
 腐蚀:在卷积核覆盖的原图像中选取最小的像素点的值代替待处理的像素点。结果与膨胀操作相反,将图像中原本高亮的区域的范围缩小了。
 开运算:先腐蚀运算再膨胀运算,开运算的结果是消除小的物体、在纤细点处分离物体、平滑较大物体边界时并不改变其表面积等。
 闭运算:先膨胀运算再腐蚀运算,闭运算的结果是排除白色区域中的小黑洞。

膨胀操作

OpenCV学习笔记(三)形态学处理之上篇(膨胀腐蚀)_第1张图片
可以看出,原图像中的细胞壁等黑色边界部位被去除了,图像中白色区域明显扩大连接在一起了。

腐蚀操作

OpenCV学习笔记(三)形态学处理之上篇(膨胀腐蚀)_第2张图片
与膨胀操作相反,图像中的细胞壁、细胞核等黑色部位明显增大,白色区域被压缩。

开运算操作

OpenCV学习笔记(三)形态学处理之上篇(膨胀腐蚀)_第3张图片
这张图由于白色占主要所以可能看不出什么效果,下图是以黑色为主要背景。
OpenCV学习笔记(三)形态学处理之上篇(膨胀腐蚀)_第4张图片
可以看出,经过开运算以后,图像中的白色被明显压缩了,很多细胞核已经被滤除掉了,体现了开运算可以消除细小物体的作用。

闭运算操作

OpenCV学习笔记(三)形态学处理之上篇(膨胀腐蚀)_第5张图片
闭运算操作将图像中的细胞壁边界部分消除,使得细胞质连接起来。

源代码

#include "stdafx.h"
#include "highgui.h"
#include "cv.h"

using namespace std;
using namespace cv;

int _tmain(int argc, _TCHAR* argv[])
{
	Mat image;
	image=imread("cells.jpg",0);  //灰度图输入
	float fScale=1.2;
	Size dstsize=Size(image.cols*fScale,image.rows*fScale);
	Mat img,dst,dst1,dst2;
	img.create(dstsize,CV_32S);
	resize(image,img,dstsize);
	threshold(img,img,150,255,CV_THRESH_BINARY_INV);
//	imshow("src",img);
	//腐蚀运算 
//	erode(img,dst,Mat(),Point(-1,-1),2);
	//膨胀运算 
//	dilate(img,dst,Mat(),Point(-1,-1),1);

	//开运算(先腐蚀后膨胀)
 erode(img,dst,Mat(),Point(-1,-1),2);
 dilate(dst,dst,Mat(),Point(-1,-1),2);

	//闭运算(先膨胀后腐蚀)
// 	dilate(img,dst,Mat(),Point(-1,-1),1);
// 	erode(dst,dst,Mat(),Point(-1,-1),1);

	//形态学梯度
// 	dilate(img,dst1,Mat(),Point(-1,-1),1);
// 	erode(img,dst2,Mat(),Point(-1,-1),1);
// 	dst=dst1-dst2;

	//礼帽处理(原图像减去开运算后的图像)
// 	erode(img,dst,Mat(),Point(-1,-1),1);
// 	dilate(dst,dst,Mat(),Point(-1,-1),1);
// 	img=img-dst;

	//黑帽处理(原图像减去闭运算后的图像)
// 	dilate(img,dst,Mat(),Point(-1,-1),1);
// 	erode(dst,dst,Mat(),Point(-1,-1),1);
// 	img=dst-img;

	imshow("src",img);
	imshow("dst",dst);
	waitKey(0);
	return 0;
}

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