概述
膨胀
膨胀是指将一些图像(或图像中的一些区域,A)与核(B)进行卷积。核可以是任何的形状或大小,它拥有一个单独定义出来的参考点。
膨胀举例:
腐蚀
腐蚀是膨胀的反操作,腐蚀操作要计算核区域像素的最小值。腐蚀算法:当核B与图像卷积时,计算被B覆盖区域的最小像素值,并把这个值放在参考点上。
举例:
调用函数
在OpenCV中,利用cvErode()和cvDilate()实现:
Erode
使用任意结构元素腐蚀图像
void cvErode( const CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1 );
-
src
- 输入图像. dst
- 输出图像. element
- 用于腐蚀的结构元素。若为 NULL, 则使用 3×3 正方形的结构元素 iterations
- 腐蚀的次数
函数 cvErode 对输入图像使用指定的结构元素进行腐蚀,该结构元素决定每个具有最小值象素点的邻域形状:
dst=erode(src,element): dst(x,y)=min((x',y') in element))src(x+x',y+y')
函数可能是本地操作,不需另外开辟存储空间的意思。腐蚀可以重复进行 (iterations) 次. 对彩色图像,每个彩色通道单独处理。
Dilate
使用任意结构元素膨胀图像
void cvDilate( const CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1 );
-
src
- 输入图像. dst
- 输出图像. element
- 用于膨胀的结构元素。若为 NULL, 则使用 3×3 长方形的结构元素 iterations
- 膨胀的次数
函数 cvDilate 对输入图像使用指定的结构元进行膨胀,该结构决定每个具有最小值象素点的邻域形状:
dst=dilate(src,element): dst(x,y)=max((x',y') in element))src(x+x',y+y')
函数支持(in-place)模式。膨胀可以重复进行 (iterations) 次. 对彩色图像,每个彩色通道单独处理。
实现代码:
/*
* 膨胀与腐蚀
*/
#include "highgui.h"
#include "cv.h"
void ErodeandDilate(IplImage *img)
{
IplImage* dst = cvCreateImage(
cvGetSize(img),
8,
3
);
//cvErode(img,dst,0,1);
cvDilate(img,dst,0,1);
cvNamedWindow("Dilate");
cvShowImage("Dilate",dst);
cvReleaseImage(&dst);
cvWaitKey(0);
cvDestroyWindow("Dilate");
}
结果分别是:
自定义核
CreateStructuringElementEx
创建结构元素
IplConvKernel* cvCreateStructuringElementEx( int cols, int rows, int anchor_x, int anchor_y, int shape, int* values=NULL );
-
cols
- 结构元素的列数目 rows
- 结构元素的行数目 anchor_x
- 锚点的相对水平偏移量 anchor_y
- 锚点的相对垂直偏移量 shape
-
结构元素的形状,可以是下列值:
- CV_SHAPE_RECT, 长方形元素;
- CV_SHAPE_CROSS, 交错元素 a cross-shaped element;
- CV_SHAPE_ELLIPSE, 椭圆元素;
- CV_SHAPE_CUSTOM, 用户自定义元素。这种情况下参数 values 定义了 mask,即象素的那个邻域必须考虑。
-
values
- 指向结构元素的指针,它是一个平面数组,表示对元素矩阵逐行扫描。(非零点表示该点属于结构元)。如果指针为空,则表示平面数组中的所有元素都是非零的,即结构元是一个长方形(该参数仅仅当shape参数是 CV_SHAPE_CUSTOM 时才予以考虑)。
函数 cv CreateStructuringElementEx 分配和填充结构 IplConvKernel, 它可作为形态操作中的结构元素。
实现代码:
/*
* 膨胀与腐蚀
*/
#include "highgui.h"
#include "cv.h"
void ErodeandDilate(IplImage *img)
{
IplImage* dst = cvCreateImage(
cvGetSize(img),
8,
3
);
//cvErode(img,dst,0,1);
//cvDilate(img,dst,0,1);
IplConvKernel* ker = cvCreateStructuringElementEx(5,5,2,2,CV_SHAPE_CROSS);
cvDilate(img,dst,ker,1);
cvNamedWindow("Dilate");
cvShowImage("Dilate",dst);
cvReleaseImage(&dst);
cvWaitKey(0);
cvDestroyWindow("Dilate");
}
结果
更通用的形态学
MorphologyEx
高级形态学变换
void cvMorphologyEx( const CvArr* src, CvArr* dst, CvArr* temp, IplConvKernel* element, int operation, int iterations=1 );
-
src
- 输入图像. dst
- 输出图像. temp
- 临时图像,某些情况下需要 element
- 结构元素 operation
-
形态操作的类型:
- CV_MOP_OPEN - 开运算
- CV_MOP_CLOSE - 闭运算
- CV_MOP_GRADIENT - 形态梯度
- CV_MOP_TOPHAT - "顶帽"
- CV_MOP_BLACKHAT - "黑帽"
-
iterations
- 膨胀和腐蚀次数.
函数 cvMorphologyEx 在膨胀和腐蚀基本操作的基础上,完成一些高级的形态变换:
-
开运算
- dst=open(src,element)=dilate(erode(src,element),element) 闭运算
- dst=close(src,element)=erode(dilate(src,element),element) 形态梯度
- dst=morph_grad(src,element)=dilate(src,element)-erode(src,element) "顶帽"
- dst=tophat(src,element)=src-open(src,element) "黑帽"
- dst=blackhat(src,element)=close(src,element)-src
临时图像 temp 在形态梯度以及对“顶帽”和“黑帽”操作时的 in-place 模式下需要。
开闭运算:
实现代码:
/*
* 开运算
*/
#include "highgui.h"
#include "cv.h"
void ErodeandDilate(IplImage *img)
{
IplImage* dst = cvCreateImage(
cvGetSize(img),
8,
3
);
//cvErode(img,dst,0,1);
//cvDilate(img,dst,0,1);
IplConvKernel* ker = cvCreateStructuringElementEx(5,5,2,2,CV_SHAPE_CROSS);
//cvDilate(img,dst,ker,1);
//实现开运算
cvMorphologyEx(img,dst,NULL,ker,CV_MOP_OPEN,1);
cvNamedWindow("OPEN");
cvShowImage("OPEN",dst);
cvReleaseImage(&dst);
cvWaitKey(0);
cvDestroyWindow("OPEN");
}
结果:
形态学梯度:
gradient = dilate - erode
可以是边缘突出。
调用:
cvMorphologyEx(img,dst,NULL,ker,CV_MOP_GRADIENT,1);
结果:
相关链接:
http://wiki.opencv.org.cn/index.php/Cv%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86#Erode
http://wenku.baidu.com/view/5c7c1a49e45c3b3567ec8b12.html###
最后
以上就是纯情火为你收集整理的OpenCV入门(八)--形态学图像处理的全部内容,希望文章能够帮你解决OpenCV入门(八)--形态学图像处理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复