`
javasogo
  • 浏览: 1815854 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

OpenCV形态学操作

阅读更多

OpenCV形态学操作

一、图像腐蚀 膨胀 细化的基本原理

1.图像细化的基本原理
图像形态学处理的概念
数字图像处理中的形态学处理是指将数字形态学作为工具从图像中提取对于表达和描绘区域形状有用处的图像分量,比如边界、骨架以及凸壳,还包括用于预处理或后处理的形态学过滤、细化和修剪等。图像形态学处理中我们感兴趣的主要是二值图像。
在二值图像中,所有黑色像素的集合是图像完整的形态学描述,二值图像的各个分量是Z2的元素。假定二值图像A和形态学处理的结构元素B是定义在笛卡儿网格上的集合,网格中值为1的点是集合的元素,当结构元素的原点移到点(x,y)时,记为Sxy,为简单起见,结构元素为3x3,且全都为1,在这种限制下,决定输出结果的是逻辑运算。

二值图像的逻辑运算
逻辑运算尽管本质上很简单,但对于实现以形态学为基础额图像处理算法是一种有力的补充手段。在图像处理中用到的主要逻辑运算是:与、或和非(求补),它们可以互相组合形成其他逻辑运算。

膨胀和腐蚀
膨胀和腐蚀这两种操作是形态学处理的基础,许多形态学算法都是以这两种运算为基础的。
膨胀
是以得到B的相对与它自身原点的映像并且由z对映像进行移位为基础的。AB膨胀是所有位移z的集合,这样, 和A至少有一个元素是重叠的。我们可以把上式改写为:
结构元素B可以看作一个卷积模板,区别在于膨胀是以集合运算为基础的,卷积是以算术运算为基础的,但两者的处理过程是相似的。
用结构元素B,扫描图像A的每一个像素
用结构元素与其覆盖的二值图像做操作
如果都为0,结果图像的该像素为0。否则为1

腐蚀
Z中的集合ABBA进行腐蚀的整个过程如下:
用结构元素B,扫描图像A的每一个像素
用结构元素与其覆盖的二值图像做操作
如果都为1,结果图像的该像素为1。否则为0
腐蚀处理的结果是使原来的二值图像减小一圈。

击中(匹配)或击不中变换
假设集合A是由3个子集XYZ组成的集合,击中(匹配)的目的是要在A中找到X的位置,我们设X被包围在一个小窗口W中,与W有关的X的局部背景定义为集合的差(WX),则XA内能得到精确拟合位置集合是由XA的腐蚀后由(WX)对A的补集Ac腐蚀的交集,这个交集就是我们要找的位置,我们用集合B来表示由XX的背景构成的集合,我们可以令B=(B1B2),这里B1XB2=(WX),则在A中对B进行匹配可以表示为:
A⊙B
我们称为形态学上的击中或击不中变换。

开闭操作
开操作是先腐蚀、后膨胀处理。

闭操作是先膨胀、后腐蚀处理。

(6) 细化
图像细化一般作为一种图像预处理技术出现,目的是提取源图像的骨架,即是将原图像中线条宽度大于1个像素的线条细化成只有一个像素宽,形成骨架,形成骨架后能比较容易的分析图像,如提取图像的特征。
细化基本思想是层层剥夺,即从线条边缘开始一层一层向里剥夺,直到线条剩下一个像素的为止。图像细化大大地压缩了原始图像地数据量,并保持其形状的基本拓扑结构不变,从而为文字识别中的特征抽取等应用奠定了基础。细化算法应满足以下条件:
将条形区域变成一条薄线;
薄线应位与原条形区域的中心;
薄线应保持原图像的拓扑特性。
细化分成串行细化和并行细化,串行细化即是一边检测满足细化条件的点,一边删除细化点;并行细化即是检测细化点的时候不进行点的删除只进行标记,而在检测完整幅图像后一次性去除要细化的点。
常用的图像细化算法有hilditch算法,pavlidis算法和rosenfeld算法等。
注:进行细化算法前要先对图像进行二值化,即图像中只包含两种颜色。

具体详细的图像形态学资料参考:http://wenku.baidu.com/view/1923d18fcc22bcd126ff0ccc.html

二、OpenCv形态学操作相关函数

1MorphologyEx 高级形态学变换

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 模式下需要。

2Dilate 使用任意结构元素膨胀图像

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) . 对彩色图像,每个彩色通道单独处理。

3Erode 使用任意结构元素腐蚀图像

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) . 对彩色图像,每个彩色通道单独处理。

注:CreateStructuringElementEx 创建结构元素;ReleaseStructuringElement 删除结构元素。

三、OpenCv形态学实例代码:

1、腐蚀、膨胀、开运算、闭运算

内容参考:http://blog.csdn.net/gnuhpc/archive/2009/06/21/4286177.aspx

/*******************************

数学形态运算,最常见的基本运算有七种,

分别为:腐蚀、膨胀、开运算、闭运算、击中、细化和粗化,

它们是全部形态学的基础。

********************************/

#include "cv.h"

#include "highgui.h"

#include <stdlib.h>

#include <stdio.h>

IplImage *src=0;

IplImage *dst=0;

IplConvKernel *element=0;//声明一个结构元素

int element_shape=CV_SHAPE_RECT;//长方形形状的元素

int max_iters=10;

int open_close_pos=0;

int erode_dilate_pos=0;

void OpenClose(int pos)

{

int n=open_close_pos-max_iters;

int an=n>0?n:-n;

element = cvCreateStructuringElementEx(an*2+1, an*2+1,an,an,element_shape,0);//创建结构元素

if (n<0)

{

cvErode(src,dst,element,1);//腐蚀图像

cvDilate(dst,dst,element,1);//膨胀图像

}

else

{

cvDilate(dst,dst,element,1);//膨胀图像

cvErode(src,dst,element,1);//腐蚀图像

}

cvReleaseStructuringElement(&element);

cvShowImage("Open/Close",dst);

}

void ErodeDilate(int pos)

{

int n=erode_dilate_pos-max_iters;

int an=n>0?n:-n;

element = cvCreateStructuringElementEx(an*2+1,an*2+1,an,an,element_shape,0);

if (n<0)

{

cvErode(src,dst,element,1);

}

else

{

cvDilate(src,dst,element,1);

}

cvReleaseStructuringElement(&element);

cvShowImage("Erode/Dilate",dst);

}

int main(int argc,char **argv)

{

char *filename =argc ==2?argv[1]:(char *)"lena.jpg";

if( (src = cvLoadImage(filename,1)) == 0 )

return -1;

dst=cvCloneImage(src);

cvNamedWindow("Open/Close",1);

cvNamedWindow("Erode/Dilate",1);

open_close_pos = erode_dilate_pos = max_iters;

cvCreateTrackbar("iterations","Open/Close",&open_close_pos,max_iters*2+1,OpenClose);

cvCreateTrackbar("iterations","Erode/Dilate",&erode_dilate_pos,max_iters*2+1,ErodeDilate);

for (;;)

{

int c;

OpenClose(open_close_pos);

ErodeDilate(erode_dilate_pos);

c= cvWaitKey(0);

if (c==27)

{

break;

}

switch(c) {

case 'e':

element_shape=CV_SHAPE_ELLIPSE;

break;

case 'r':

element_shape=CV_SHAPE_RECT;

break;

case '\r':

element_shape=(element_shape+1)%3;

break;

default:

break;

}

}

cvReleaseImage(&src);

cvReleaseImage(&dst);

cvDestroyWindow("Open/Close");

cvDestroyWindow("Erode/Dilate");

return 0;

}

/*****************************

腐蚀和膨胀,看上去好像是一对互逆的操作,实际上,这两种操作不具有互逆的关系。

开运算和闭运算正是依据腐蚀和膨胀的不可逆性,演变而来的。

先腐蚀后膨胀的过程就称为开运算。

闭运算是通过对腐蚀和膨胀的另一种不同次序的执行而得到的,

闭运算是先膨胀后腐蚀的过程,其功能是用来填充物体内细小空洞、连接邻近物体、平滑其边界,

同时不明显改变不明显改变其面积。

******************************/

2opencv实现二值图像细化

内容参考:http://blog.csdn.net/byxdaz/archive/2010/06/02/5642669.aspx

分享到:
评论

相关推荐

    opencv形态学操作实例下载

    OpenCV形态学操作是计算机视觉领域中的重要技术,主要用于图像处理和分析。这些操作基于数学形态学理论,能够有效地对图像进行噪声去除、边缘检测、物体分离等任务。本实例下载包含OpenCV库中形态学操作的相关接口...

    opencv形态学操作应用提取水平和垂直线.rtf

    opencv形态学操作应用提取水平和垂直线.rtf

    基于Android的OpenCV形态学操作的实现

    OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,网络上一些小伙伴写的一些关于Android版OpenCV的博客,大部分都模糊不清,基本就复制粘贴的,有些甚至没有实践就直接贴上去了,这样...

    opencv 形态学处理 膨胀腐蚀源代码

    本项目聚焦于OpenCV中的形态学处理,特别是图像的膨胀和腐蚀操作。形态学处理是图像处理的一种基本技术,它通过数学形态学运算来改变图像的形状和结构,常用于噪声去除、边缘检测、连通组件分析等任务。 首先,让...

    openCV形态学开闭重构

    根据提供的文件信息,本文将详细解释“OpenCV形态学开闭重构”的概念、原理以及具体的实现方式。 ### 形态学基本概念 形态学是一种基于图像形状分析的技术,主要用于二值图像处理。它通过一系列的基本操作(如膨胀...

    xingtai.rar_OpenCV形态学

    本项目“xingtai.rar_OpenCV形态学”显然旨在演示如何利用OpenCV库进行形态学操作。 形态学操作主要包括腐蚀、膨胀、开运算、闭运算、形态学梯度、顶帽和黑帽等。下面将详细介绍这些概念: 1. **腐蚀**:腐蚀操作...

    xingtaixue.zip_OpenCV形态学

    **OpenCV形态学图像处理详解** 在计算机视觉领域,OpenCV是一个强大的库,它提供了丰富的功能来处理和分析图像。其中,形态学操作是图像处理中的一个重要部分,它主要用于改善图像质量,消除噪声,以及提取图像特征...

    87360992形态学操作opencv

    本项目"87360992形态学操作opencv"将OpenCV库的函数与VC++编程环境相结合,实现了一系列形态学操作,便于开发者在C++环境中应用这些功能。 形态学操作主要包括膨胀、腐蚀、开运算、闭运算以及形态学梯度等。以下是...

    opencv形态学处理.zip

    在"opencv形态学处理.zip"这个压缩包中,很显然,学生将学习到如何利用OpenCV库进行形态学操作。形态学处理是图像处理中的一个重要分支,主要应用于图像分割、噪声去除、物体轮廓提取等场景。 形态学处理主要包括...

    opencv2形态学骨架提取

    在OpenCV2中,提供了丰富的形态学操作函数,使得开发者可以方便地进行骨架提取。本文将深入探讨OpenCV2中的形态学骨架提取及其在实际应用中的价值。 首先,我们需要了解形态学的基本概念。形态学是数学形态学的简称...

    基于opencv的图像形态学操作的源代码

    本文将深入探讨如何利用OpenCV进行图像的形态学操作,特别是腐蚀、膨胀以及开闭运算,这些都是图像处理中的核心概念,对于去除噪声、连接断开的线条、分离相近的物体等具有重要意义。 首先,我们要理解什么是图像...

    opencv形态学变换函数

    在OpenCV中,这些形态学操作可以通过`cv2.erode()`, `cv2.dilate()`, `cv2.morphologyEx()`等函数实现。`cv2.morphologyEx()`函数提供了一种更灵活的方式,它可以执行上述四种基本操作,甚至还可以进行形态学梯度、...

    OpenCVSharp形态学操作示例

    本示例主要探讨的是如何使用OpenCVSharp进行形态学操作,特别是针对特定区域的标注、膨胀和腐蚀操作。形态学操作是图像处理中的重要一环,它们可以用于消除噪声、连接分离的物体、分离相邻物体等。 1. **形态学基础...

    OpenCV之形态学操作源码

    本篇将详细探讨OpenCV中的形态学操作,这是一种强大的工具,用于处理图像的噪声、修复边缘、连接断开的线段等。形态学操作主要包括腐蚀、膨胀、开运算、闭运算、形态学梯度、顶帽和黑帽等。 1. **腐蚀(Erosion)** ...

    基于OpenCV的图像形态学处理.zip

    形态学(morphology)一词...简单来讲,形态学操作就是基于形状的一系列图像处理操作。OpenCV 为进行图像的形 态学变换提供了快捷、方便的函数。最基本的形态学操作有两种,分别是:膨胀(dilate) 与腐蚀(erode)。

    opencv形态学处理膨胀腐蚀开闭运算黑帽顶帽(VS2015+OpenCV3.4.9)

    1. **膨胀**:膨胀是一种基本的形态学操作,用于扩大图像中的白色区域(前景)。它通过在每个像素处应用结构元素与图像的卷积来完成。膨胀过程会把结构元素中心与图像中非零像素对齐,然后将结构元素覆盖的区域内...

    基于OpenCV的形态学开源库OpenMorph

    OpenMorph就是基于OpenCV的一个专门针对形态学操作的开源库,它扩展了OpenCV的功能,使得用户能够更方便地进行形态学操作。 **OpenMorph的核心功能** 1. **腐蚀和膨胀**:形态学的基本操作之一,腐蚀用于消除物体...

    OpenCV-python 学习笔记 OpenCV形态学转换1

    在实际应用中,可以通过调整结构元素的大小和形状,以及迭代次数来控制形态学操作的效果。 总之,OpenCV-Python 提供的形态学转换工具对于图像处理和分析有着强大的功能,能够有效地处理各种图像问题,如噪声过滤、...

    《基于OpenCV的形态学开源库》配套代码

    本文档配套的开源库是对OpenCV形态学功能的增强和补充。作者针对OpenCV的不足,开发了更高效、功能更丰富的形态学算法。这个库可能包括但不限于以下特性: 1. **多核并行处理**:利用现代CPU的多核心能力,提升形态...

Global site tag (gtag.js) - Google Analytics