形态学操作(腐蚀与膨胀(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)。这些操作主要用于图像处理,包括消除噪声、分割图像元素及连接相邻元素。函数dilate()和erode()分别用于实现膨胀和腐蚀,涉及的参数包括结构元素、锚点位置、迭代次数等,能够对图像进行定制化的形态学变换。
2709

被折叠的 条评论
为什么被折叠?



