Opencv图像识别从零到精通(16)------膨胀腐蚀

一、形态学操作就是基于形状的一系列图像处理操作。有很多的,这里先看最简单的操作。

            膨胀与腐蚀(Dilation与Erosion)。能实现多种多样的功能,主要如下:

    • 消除噪声,通过低尺寸结构元素的腐蚀操作很容易去掉分散的椒盐噪声点
    • 分割(isolate)出独立的图像元素,在图像中连接(join)相邻的元素。
    • 寻找图像中的明显的极大值区域或极小值区域
    • 求出图像的梯度
二、记住下面红体字

(1)腐蚀操作描述为:扫描图像的每一个像素,用结构元素与其覆盖的二值图像做“与”操作:如果都为1,结果图像的该像素为1,否则为0。

(2)膨胀操作描述为:扫描图像的每一个像素,用结构元素与其覆盖的二值图像做“与”操作:如果都为0,结果图像的该像素为0,否则为1。


(1)腐蚀运算是由结构元素确定的邻域块中选取图像值与结构元素值的差的最小值。

(2)膨胀运算是由结构元素确定的邻域块中选取图像值与结构元素值的和的最大值。


三、图解:

Opencv图像识别从零到精通(16)------膨胀腐蚀_第1张图片               Opencv图像识别从零到精通(16)------膨胀腐蚀_第2张图片

四、函数与定义

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

  • 第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。图像通道的数量可以是任意的,但图像深度应为CV_8U,CV_16U,CV_16S,CV_32F或 CV_64F其中之一。
  • 第二个参数,OutputArray类型的dst,即目标图像,需要和源图片有一样的尺寸和类型。
  • 第三个参数,InputArray类型的kernel,膨胀操作的核。若为NULL时,表示的是使用参考点位于中心3x3的核。
  • 第四个参数,Point类型的anchor,锚的位置,其有默认值(-1,-1),表示锚位于中心。
  • 第五个参数,int类型的iterations,迭代使用erode()函数的次数,默认值为1。
  • 第六个参数,int类型的borderType,用于推断图像外部像素的某种边界模式。注意它有默认值BORDER_DEFAULT。
  • 第七个参数,const Scalar&类型的borderValue,当边界为常数时的边界值,有默认值morphologyDefaultBorderValue(),一般我们不用去管他。需要用到它时,可以看官方文档中的createMorphologyFilter()函数得到更详细的解释。
对于核来说有三个
  • 矩形: MORPH_RECT
  • 交叉形: MORPH_CROSS
  • 椭圆形: MORPH_ELLIPSE
  • 基础用法如下
 int g_nStructElementSize = 3; //结构元素(内核矩阵)的尺寸
 
//获取自定义核
Mat element = getStructuringElement(MORPH_RECT,
	Size(2*g_nStructElementSize+1,2*g_nStructElementSize+1),
	Point( g_nStructElementSize, g_nStructElementSize ));
对于腐蚀和膨胀其实差不多,定义如下,具体的解释裤和上面差不多,这里不再重复介绍这些参数了
下面来看一下具体的例子
#include "opencv2/imgproc/imgproc.hpp"  
#include "opencv2/highgui/highgui.hpp"  
#include "highgui.h"  
#include   
#include    
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* );  
void Dilation( int, void* );    
int main( int argc, char** argv )  
{  
  src = imread("1.png" );  
  if( !src.data )  
    { return -1; }  
  namedWindow( "Erosion Demo", CV_WINDOW_AUTOSIZE );  
  namedWindow( "Dilation Demo", CV_WINDOW_AUTOSIZE );  
  cvMoveWindow( "Dilation Demo", src.cols, 0 );    
  createTrackbar( "Element:\n 0: Rect \n 1: Cross \n 2: Ellipse", "Erosion Demo", &erosion_elem, max_elem,Erosion );  
  createTrackbar( "Kernel size:\n 2n +1", "Erosion Demo",  &erosion_size, max_kernel_size, Erosion );    
  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;  
}  
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;} 
  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 );  
} 


Opencv图像识别从零到精通(16)------膨胀腐蚀_第3张图片
五、Matlab辅助
I=imread('d:\1.png');
SE=strel('rectangle',[3 3]);
I2=imdilate(I,SE);
I3=imerode(I,SE);
figure
subplot(121),imshow(I2),title('膨胀')
subplot(122),imshow(I3),title('腐蚀')

                                           Opencv图像识别从零到精通(16)------膨胀腐蚀_第4张图片
图像识别算法交流 QQ群:145076161,欢迎图像识别与图像算法,共同学习与交流

你可能感兴趣的:(Opencv图像识别从零到精通,Opencv图像识别从零到精通)