学习opencv之Eroding和Dilating

形态学操作(腐蚀与膨胀(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;
}

在这里有个问题,在trackbar控件上的名字\n符怎么没用,即名字不能分行表示?

你可能感兴趣的:(学习opencv之Eroding和Dilating)