形态学操作(腐蚀与膨胀(Erosion 与 Dilation)):
就是基于形状的一系列图像处理操作。通过将 结构元素 作用于输入图像来产生输出图像。
目的有三:
消除噪声
分割(isolate)独立的图像元素,以及连接(join)相邻的元素
寻找图像中的明显的极大值区域或极小值区域
dilate:
dilate(InputArray src, OutputArray dst, InputArray kernel, Point anchor=Point(-1,-1),int iterations=1,
int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue() )
src
dst
element – 结构元素. 如果结构元素为Mat() , 则默认为是一个3 x 3 矩形
anchor – 结构元素中的锚. 如果Point(-1, -1) 则表示为结构元素的中心
iterations – 迭代的次数
borderType – 像素外推法
borderValue –边界值
erode:
void erode(InputArray src, OutputArray dst, InputArray kernel, Point anchor=Point(-1,-1),
int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& border-
Value=morphologyDefaultBorderValue() )
参数含义同上
// 1.1.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include"opencv243.h" using namespace std; using namespace cv; Mat src,erosion_dst,dilation_dst; int erosion_elem=0; int erosion_size=0; int dilation_elem=0; int dilation_size=0; int const max_elem=2; int const max_kernel_size=21; void Erosion(int ,void*) { int erosion_type; if(erosion_elem==0){erosion_type=MORPH_RECT;} //选择内核矩型 else if (erosion_elem==1){erosion_type=MORPH_CROSS;} //选择内核交叉型 else if (erosion_elem==2){erosion_type=MORPH_ELLIPSE;} //选择内核椭圆型 /*element: 腐蚀操作的内核。如果不指定,默认为一个简单的3*3矩阵。 否则,我们就要明确指定它的形状,可以使用函数 getStructuringElement*/ Mat element=getStructuringElement(erosion_type,Size(2*erosion_size+1,2*erosion_size+1),Point(erosion_size,erosion_size)); erode(src,erosion_dst,element); imshow("Erosion Demo",erosion_dst); } void Dilation(int , void*) { int dilation_type; if(dilation_elem==0){dilation_type=MORPH_RECT;} else if (dilation_elem==1){dilation_type=MORPH_CROSS;} else if (dilation_elem==2){dilation_type=MORPH_ELLIPSE;} Mat element=getStructuringElement(dilation_type,Size(2*dilation_size+1,2*dilation_size+1),Point(dilation_size,dilation_size)); dilate(src,dilation_dst,element); imshow("Dilation Demo",dilation_dst); } int _tmain(int argc, _TCHAR* argv[]) { src=imread("C:\\Users\\sony\\Desktop\\Lena.jpg"); if(src.empty()) return -1; //创建显示窗口 namedWindow("Erosion Demo",CV_WINDOW_AUTOSIZE); namedWindow("Dilation Demo",CV_WINDOW_AUTOSIZE); //创建腐蚀Trackbar createTrackbar("Element:\r\n 0: Rect\r\n 1: Cross\r\n 2: Ellipse","Erosion Demo", &erosion_elem,max_elem,Erosion); createTrackbar("Kernel size:\n 2n+1","Erosion Demo",&erosion_size, max_kernel_size,Erosion); //创建膨胀Trackbar createTrackbar( "Element:\n 0: Rect \n 1: Cross \n 2: Ellipse", "Dilation Demo", &dilation_elem, max_elem,Dilation ); createTrackbar( "Kernel size:\n 2n +1", "Dilation Demo", &dilation_size, max_kernel_size, Dilation); Erosion(0,0); Dilation(0,0); waitKey(0); return 0; }