opencv学习笔记第五章:基于形态学运算的图像变换(1)形态学运算进行腐蚀和膨胀

来源:互联网 发布:数控铣床手工编程 编辑:程序博客网 时间:2024/06/05 16:04

腐蚀和膨胀是最基本的形态学运算。数学形态学最基本的工具是结构元素。结构元素简单的定义为像素的结构(形状)以及一个原点(锚点)。使用形态学滤波涉及对图像的每个像素应用这个结构元素。当结构元素的原点与给定的像素对齐,它与图像相交部分定义了一组进行形态学运算的像素。

腐蚀:每个像素与结构相交的集合替换成最小的像素值

膨胀:每个像素与结构相交的集合替换成最小的像素值

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


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( const Mat& src, Mat& dst, const Mat& element,Point anchor=Point(-1,-1), int iterations=1,int borderType=BORDER_CONSTANT,const Scalar& borderValue=morphologyDefaultBorderValue() );
void dilate( const Mat& src, Mat& dst, const Mat& element,Point anchor=Point(-1,-1), int iterations=1,int borderType=BORDER_CONSTANT,const Scalar& borderValue=morphologyDefaultBorderValue() );

可见,腐蚀和膨胀的参数完全一样。

参数:

src:原图像。

dst:目标图像。

element:腐蚀操作的内核。 如果不指定,默认为一个简单的 bubuko.com,布布扣 矩阵。否则,我们就要明确指定它的形状,可以使用函数getStructuringElement().

anchor:默认为Point(-1,-1),内核中心点。省略时为默认值。

iterations:腐蚀次数。省略时为默认值1。

borderType:推断边缘类型,具体参见borderInterpolate函数。默认为BORDER_DEFAULT,省略时为默认值。

borderValue:边缘值,具体可参见createMorphoogyFilter函数。可省略。

 

通常情况下,我们可以使用函数getStructuringElement()来制作操作内核。

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

参数:

shape:内核形状,主要有MORPH_RECT,MORPH_CROSSMORPH_ELLIPSE,分别为矩形、椭圆形和交叉形,对应的值分别为0,1,2

  

enum { MORPH_RECT=0, MORPH_CROSS=1, MORPH_ELLIPSE=2 };

 

 

esize:内核大小。

anchor:内核锚点,默认为内核中心点。

例:

Mat element = getStructuringElement( 0,Size( 2*i + 1, 2*i+1 ), Point(i, i ) );  /// 腐蚀操作  erode( src, dst, element );
Mat element = getStructuringElement( 0,Size( 2*i + 1, 2*i+1 ), Point(i, i ) );  /// 膨胀操作  dilate( src, dst, element );


#include <iostream>#include "opencv2/opencv.hpp"using namespace std;using namespace cv;int main(){Mat image, eroded, dilated;image = imread("D:/1.jpg", 0);erode(image, eroded, Mat());dilate(image, dilated, Mat());namedWindow("image");imshow("image", image);namedWindow("eroded");imshow("eroded", eroded);namedWindow("dilated");imshow("dilated", dilated);waitKey(0);}












阅读全文
0 0
原创粉丝点击