精华内容
下载资源
问答
  • 形态学图像处理

    2020-12-19 22:34:21
    形态学,即数学形态学(mathematical Morphology),是图像处理中应用最为广泛的技术之一,主要用于从图像中提取对表达和描绘区域形状有意义的图像分量,使后续的识别工作能够抓住目标对象最为本质〈最具区分能力-...

    形态学,即数学形态学(mathematical Morphology),是图像处理中应用最为广泛的技术之一,主要用于从图像中提取对表达和描绘区域形状有意义的图像分量,使后续的识别工作能够抓住目标对象最为本质〈最具区分能力-most discriminative)的形状特征,如边界和连通区域等。同时像细化、像素化和修剪毛刺等技术也常应用于图像的预处理和后处理中,成为图像增强技术的有力补充。

    本文主要包括以下内容

    二值图像的基本形态学运算, 包括腐蚀、膨胀、开和闭。

    二值形态学的经典应用, 包括击中击不中变换、边界提取和跟踪、区域填充、提取连通分量、细化和像素化, 以及凸壳

    灰度图像的形态学运算, 包括灰度腐蚀、灰度膨胀、灰度开和灰度闭

    本章的典型案例分析

    在人脸局部图像中定位嘴的中心

    显微镜下图像的细菌计数

    利用顶帽变换(top-hat)技术解决光照不均问题

    预备知识

    在数字图像处理中, 形态学是借助集合论的语言来描述的, 本章后面的各节内容均以本集合论为基础。

    结构元素(structure element)

    设有两幅图像A, S。若A是被处理的对象, 而S是用来处理A的, 则称S为结构元素。结构元素通常都是一些比较小的图像, A与S的关系类似于滤波中图像和模板的关系.

    二值图像中的基本形态学运算

    本节介绍几种二值图像的基本形态学运算, 包括腐蚀、膨胀, 以及开、闭运算。由于所有形态学运算都是针对图像中的前景物体进行的, 因而首先对图像前景和背景的认定给出必要的说明.

    注意: 大多数图像,一般相对于背景而言物体的颜色(灰度)更深, 二值化之后物体会成为黑色, 而背景则成为白色, 因此我们通常是习惯于将物体用黑色(灰度值0)表示, 而背景用白色(灰度值255)表示,本章所有的算法示意图以及所有的Visual C++的程序实例都遵从这种约定;但Matlab 在二位图像形态学处理中,默认情况下白色的(二位图像中灰度值为1的像素,或灰度图像中灰度值为255的像素)

    是前景(物体),黑色的为背景, 因而本章涉及Matlab 的所有程序实例又都遵从Matlab本身的这种前景认定习惯.

    实际上, 无论以什么灰度值为前景和背景都只是一种处理上的习惯, 与形态学算法本身无关。例如对于上面两幅图片, 只需要在形态学处理之前先对图像反色就可以在两种认定习惯之间自由切换。

    腐蚀及其实现

    腐蚀和膨胀是两种最基本也是最重要的形态学运算, 它们是后续要介绍的很多高级形态学处理的基础, 很多其他的形态学算法都是由这两种基本运算复合而成

    matlab实现

    Matlab中与腐蚀相关的两个常用函数为imerode和strel。

    imerode函数用于完成图像腐蚀.其常用调用形式如下:I2 = imrode(I,SE)

    I为原始图像,可以是二位或灰度图像(对应于灰度腐蚀).

    SE是由strel函数返回的自定义或预设的结构元素对象.

    strel函数可以为各种常见形态学运算生成结构元素SE, 当生成供二值形态学使用的结构元素肘, 其调用形式为:SE=strl(shape,parameter)

    shape指定了结构元素的形状, 其常用合法取值如在8.1所示.

    腐蚀的作用“ 顾名思义,腐蚀能够消融物体的边界,而具体的腐蚀结果与图像本身和结构元素的形状有关。如果物体整体上大于结构元素,腐蚀的结构是使物体变“ 瘦”一圈,而

    这一圈到底有多大是由结构元素决定的:如果物体本身小于结构元素, 则在腐蚀后的图像中物体将完全消失:如物体仅有部分区域小于结构元素〈如细小的连通3,则腐蚀后物体会在细

    连通处断裂,分离为两部分。

    I = imread('erode_dilate.bmp');

    se = strel('square',3);

    Ib = imerode(I,se);

    se = strel([0 1 0;1 1 1;0 1 0]);

    Ic = imerode(I,se);

    se = strel('square',5);

    Id = imerode(I,se);

    figure;

    subplot(2,2,1);

    imshow(I);

    subplot(2,2,2);

    imshow(Ib);

    subplot(2,2,3);

    imshow(Ic);

    subplot(2,2,4);

    imshow(Id);

    随着腐蚀结构元素的逐步增大,小于结构元素的物体相继消失。由于腐蚀运算具有上述的特点,可以用于滤波。选择适当大小和形状的结构元素,可以滤除掉所有不能 完全包含结构元素的噪声点。然而,利用腐蚀滤除噪声有一个缺点,即在去除噪声点的同时,对图像中前景物体的形状也会有影响,但当我们只关心物体的位置或者个数时,则影响不大

    膨胀及其实现

    实际上, 膨胀和腐蚀对子集合求补和反射运算是彼此对偶的.

    这里值得注意的是定义中要求和A有公共交集的不是结构元素S本身, 而是S的反射集, 觉得熟悉吗?这在形式上似乎容易让我们回忆起卷积运算, 而腐蚀在形式上则更像相关运算。由于图8.8 中使用的是对称的结构元素, 故使用S 和S^' 的膨胀结果相同:但对于图8.9中非对称结构元素的膨胀示例, 则会产生完全不同的结果, 因此在实现膨胀运算时一定要先计算S^'

    matlab实现

    imdilate函数用于完成图像膨胀, 其常用调用形式如下:

    I2 = imdilate(I,SE);

    I为原始图像, 可以是二位或灰度图像(对应于灰度膨胀).

    SE是由strel函数返回的自定义或预设的结构元素对象

    膨胀的作用和腐蚀相反, 膨胀能使物体边界扩大, 具体的膨胀结果与图像本身和结构元素的形状有关。膨胀常用于将图像中原本断裂开来的同一物体桥接起来, 对图像进行二值化之后, 很容易使一个连通的物体断裂为两个部分, 而这会给后续的图像分析(如要基于连通区域的分析统计物体的个数〉造成困扰,此时就可借助膨胀桥接断裂的缝隙

    I = imread('starcraft.bmp');

    Ie1 = imerode(I,[1 1 1;1 1 1;1 1 1]);

    Ie2 = imerode(Ie1,[0 1 0;1 1 1;0 1 0]);

    Id1 = imdilate(Ie2,[1 1 1;1 1 1;1 1 1]);

    Id2 = imdilate(Id1,[0 1 0;1 1 1;0 1 0]);

    figure;

    subplot(2,2,1);

    imshow(Ie1);

    subplot(2,2,2);

    imshow(Ie2);

    subplot(2,2,3);

    imshow(Id1);

    subplot(2,2,4);

    imshow(Id2);

    开运算及其实现

    开运算和闭运算都由腐蚀和膨胀复合而成, 开运算是先腐蚀后膨胀, 而闭运算是先膨胀后腐蚀。

    一般来说, 开运算可以使图像的轮廓变得光滑, 还能使狭窄的连接断开和消除细毛刺。

    如图8.11所示, 开运算断开了团中两个小区域间两个像素宽的连接〈断开了狭窄连接〉,并且去除了右侧物体上部突出的一个小于结构元素的2×2的区域〈去除细小毛刺〉: 但与腐蚀不同的是, 图像大的轮廓并没有发生整体的收缩, 物体位置也没有发生任何变化。

    根据图8.12 的开运算示意图, 可以帮助大家更好地理解开运算的特点。为了比较, 图中也标示出了相应的腐蚀运算的结果:

    matlab实现

    根据定义,以相同的结构元素先后调用imerode和imdilate即可实现开操作。此外,Matlab 中也直接提供了开运算函数imopen, 其调用形式如下:

    I2 = imopen(I,SE);

    I = imread('erode_dilate.bmp');

    Io = imopen(I,ones(6,6));

    figure;

    subplot(1,2,1);

    imshow(I);

    subplot(1,2,2);

    imshow(Io);

    从图8.13中可以看到同腐蚀相比,开运算在过滤噪声的同时并没有对物体的形状、轮廓造成明显的影响,这是一大优势。但当我们只关心物体的位置或者个数时,物体形状的改变不会给我们带来困扰,此时用腐蚀滤波具有处理速度上的优势〈同开运算相比节省了一次膨胀运算〉。

    闭运算及其实现

    闭运算同样可以使轮廓变得光滑, 但与开运算相反, 它通常能够弥合狭窄的间断, 填充小的孔洞。

    Matlab实现

    根据定义,以相同的结构元素先后调用imdilate 和imerode 即可实现闭操作。此外,Matlab中也直接提供了闭运算函数imclose, 其用法同imopen 类似

    二值图像中的形态学应用

    击中与击不中交换及其实现

    I = zeros(120,180);

    I(11:80,16:75)=1;

    I(56:105,86:135)=1;

    I(26:55,141:170)=1;

    se = zeros(58,58);

    se(5:54,5:54)=1;

    Ie1 = imerode(I,se);

    Ic = 1 - I;

    S2 = 1 - se;

    Ie2 = imerode(Ic,S2);

    Ihm = Ie1&Ie2;

    figure;

    subplot(2,2,1);

    imshow(I);

    subplot(2,2,2);

    imshow(Ie1);

    subplot(2,2,3);

    imshow(Ie2);

    subplot(2,2,4);

    imshow(Ihm);

    图中给出了变换的最终结果。为便于观察在显示时每幅图像周围都环绕着一圈黑色边框, 注意该边框并不是图像本身的一部分。

    注意: 注意对于结构元素s,我们感兴趣的物体S1之外的背景S2不能选择得太宽,因为使得S包含背景S2的目的仅仅是定义出物体S1的外轮廓,以便在图像中能够

    找到准确的完全匹配位置. 从这个意义上说, 物体S1周围有一个像素宽的背景环绕就足够了, 例8.3中选择了4个像素宽的背景,是为了使结构元素背景部分应

    看起来比较明显, 但如果背景部分过大, 则会影响击中/击不中变换的计算结果.在上例中, 中间的正方形Y与右上的正方形Z之间的水平距离为6,如果在定义S时, S2的宽度超过6个像素, 则最终的计算结果将是空集.

    边界提取与跟踪及其实现

    轮廓是对物体形状的有力描述, 对图像分析和识别十分有用。通过边界提取算法可以得到物体的边界轮廓:而边界跟踪算法在提取边界的同时还能依次记录下边界像素的位置信息,下面分别介绍.

    边界提取

    要在二值图像中提取物体的边界,容易想到的一个方法是将所有物体内部的点删除(置为背景色〉。具体地说,可以逐行扫描原图像,如果发现一个黑点〈图8.17 中黑点为前景点)的8个邻域都是黑点, 则该点为内部点, 在目标图像中将它删除。实际上这相当于采用一个3*3的结构元素对原图像进行腐蚀, 使得只有那些8个邻域都有黑点的内部点被保留,再用原图像减去腐蚀后的图像, 恰好删除了这些内部点, 留下了边界像素。这一过程可参

    见图8.17 。

    I = imread('head_portrait.bmp');

    se = strel('square',3);

    Ie = imerode(I,se);

    Iout = I - Ie;

    figure;

    subplot(1,2,1);

    imshow(I);

    subplot(1,2,2);

    imshow(Iout);

    边界跟踪

    区域填充

    区域填充可视为边界提取的反过程, 它是在边界已知的情况下得到边界包围的整个区域的形态学技术。

    理论基础

    问题的描述如下: 己知某-8连通边界和边界内部的某个点, 要求从该点开始填充整个边界包围的区域, 这一过程称为种子填充, 填充的开始点被称为种子.

    如图8.20 所示, 对于4 连通的边界, 其围成的内部区域是8 连通的, 而8连通的边界围成的内部区域却是4连通的.

    为了填充4 连通的边界应选择图8.20 (b )中的3 × 3 结构元素, 但如果想在8 连通边界内从种子点得到区域则需选用图8.20 (d)的十字结构元素S 对初始时仅为种子点的图像B进行膨胀,十字结构元素S能够保证只要B在边界A的内部〈不包括边界本身〉,每次膨胀都不会产生边界之外的点(新膨胀出来的点或者在边界内部, 或者落在边界上〉, 这样只需把每次膨胀的结果图像和边界的补图像Ac相交, 就能把膨胀限制在边界内部。随着对B的

    不断膨胀, B的区域不断生长, 但每次膨胀后与Ac的交又将B限制在边界d的内部, 这样一直到最终B充满整个A的内部区域,停止生长。此时的B与d的并集即为最终的区域填充结果。

    连通分量提取及其实现

    连通分量的概念在0.3.1小节中曾介绍过。在二值图像中提取连通分量是许多自动图像分析应用中的核心任务。提取连通分量的过程实际上也是标注连通分量的过程, 通常的做法是给原图像中的每个连通区分配一个唯一代表该区域的编号, 在输出图像中该连通区内的所有像素的像素值就赋值为该区域的编号, 我们将这样的输出图像称为标注图像。

    matlab实现

    在Matlab中, 连通分量的相关操作主要借助IPT函数bwlabel实现. 其调用语法为

    [L num]= bwlabel(Ibw,conn);

    Ibw为一幅输入二位图像.

    conn为可选参数, 指明要提取的连通分量是4连边还是8连通, 默认值为8.

    L为类似于图8.23 ( b)的标注图像.

    num为二维图像Ibw中连通分量的个数.

    提取连通分量的应用十分广泛, 利用标注图像可以方便地进行很多基于连通区的操作。例如要计算某一连通分量的大小, 只需扫描一遍标注图像, 对像素值为该区编号的像素进行计数: 又如要计算某一连通分量的质心, 只需扫描一遍标注图像, 找出所有像素值为该区编号的像素的x、y坐标, 然后计算其平均值.

    在人脸局部图像中定位嘴的中心

    我们希望在如图8.24 (a )所示的图像中定位嘴的中心,假定已经掌握了输入图像中的某些先验知识,嘴部占据了图像的大部分区域且从灰度上易于与周围皮肤分离开来. 于是针

    对性地拟定了在二位化图像中寻找最大连通区域中心的解决方案, 具体步骤为:

    (1)对输入图像进行二位化处理.

    (2)标注二值图像中的连通分量.

    (3)找出最大的连通分量.

    (4)计算最大连通分量的中心.

    % locateMouth.m

    I = imread('mouth.bmp'); %读入图像

    Id = im2double(I);

    figure, imshow(Id) % 得到8.24(a)

    Ibw = im2bw(Id, 0.38); % 以0.38为阈值二值化

    Ibw = 1 - Ibw; %为在Matlab中进行处理,将图像反色

    figure, imshow(Ibw) % 得到8.24(b)

    hold on

    [L, num] = bwlabel(Ibw, 8); % 标注连通分量

    disp(['图中共有' num2str(num) '个连通分量'])

    % 找出最大的连通分量(嘴)

    max = 0; % 当前最大连通分量的大小

    indMax = 0; % 当前最大连通分量的索引

    for k = 1:num

    [y x] = find(L == k); % 找出编号为k的连通区的行索引集合y和列索引集合x

    nSize = length(y); %计算该连通区中的像素数目

    if(nSize > max)

    max = nSize;

    indMax = k;

    end

    end

    if indMax == 0

    disp('没有找到连通分量')

    return

    end

    % 计算并显示最大连通分量(嘴)的中心

    [y x] = find(L == indMax);

    yMean = mean(y);

    xMean = mean(x);

    plot(xMean, yMean, 'Marker', 'o', 'MarkerSize', 14, 'MarkerEdgeColor', 'w', 'MarkerFaceColor', 'w');

    plot(xMean, yMean, 'Marker', '*', 'MarkerSize', 12, 'MarkerEdgeColor', 'k'); % 得到8.24(c)

    细菌计数

    I = imread('bw_bacteria.bmp');

    [L,num]=bwlabel(I,8);

    Idil = imdilate(I,ones(3,3));

    [L,num] = bwlabel(Idil,8);

    figure;

    subplot(1,2,1);

    imshow(I);

    subplot(1,2,2);

    imshow(Idil);

    展开全文
  • 这里给出形态学的一般原理,以及用形态学进行边界提取,角点提取好骨架提取的原代码一 引言数学形态学是一门建立在集论基础上的学科,是几何形态学分析和描述的有力工具。数学形态学的历史可回溯到19世纪。196...

    形态学一般是使用二值图像,进行边界提取,骨架提取,孔洞填充,角点提取,图像重建。

    基本的算法:膨胀腐蚀,开操作,闭操作,击中击不中变换

    几种算法进行组合,就可以实现一些非常复杂的功能,而且逻辑严密。

    这里给出形态学的一般原理,以及用形态学进行边界提取,角点提取好骨架提取的原代码

    一    引言

    数学形态学是一门建立在集论基础上的学科,是几何形态学分析和描述的有力工具。数学形态学的历史可回溯到19世纪。1964年法国的Matheron和Serra在积分几何的研究成果上,将数学形态学引入图像处理领域,并研制了基于数学形态学的图像处理系统。1982年出版的专著《Image Analysis and Mathematical Morphology》是数学形态学发展的重要里程碑,表明数学形态学在理论上趋于完备及应用上不断深入。数学形态学蓬勃发展,由于其并行快速,易于硬件实现,已引起了人们的广泛关注。目前,数学形态学已在计算机视觉、信号处理与图像分析、模式识别、计算方法与数据处理等方面得到了极为广泛的应用。

    数学形态学可以用来解决抑制噪声、特征提取、边缘检测、图像分割、形状识别、纹理分析、图像恢复与重建、图像压缩等图像处理问题。该文将主要对数学形态学的基本理论及其在图像处理中的应用进行综述。

    二    数学形态学的定义和分类

    数学形态学是以形态结构元素为基础对图像进行分析的数学工具。它的基本思想是用具有一定形态的结构元素去度量和提取图像中的对应形状以达到对图像分析和识别的目的。数学形态学的应用可以简化图像数据,保持它们基本的形状特征,并除去不相干的结构。数学形态学的基本运算有4个:膨胀、腐蚀、开启和闭合。它们在二值图像中和灰度图像中各有特点。基于这些基本运算还可以推导和组合成各种数学形态学实用算法。

    (1)二值形态学        数学形态学中二值图像的形态变换是一种针对集合的处理过程。其形态算子的实质是表达物体或形状的集合与结构元素间的相互作用,结构元素的形状就决定了这种运算所提取的信号的形状信息。形态学图像处理是在图像中移动一个结构元素,然后将结构元素与下面的二值图像进行交、并等集合运算。

    基本的形态运算是腐蚀和膨胀。

    在形态学中,结构元素是最重要最基本的概念。结构元素在形态变换中的作用相当于信号处理中的“滤波窗口”。用B(x)代表结构元素,对工作空间E中的每一点x,腐蚀和膨胀的定义为:

    用B(x)对E进行腐蚀的结果就是把结构元素B平移后使B包含于E的所有点构成的集合。用B(x)对E进行膨胀的结果就是把结构元素B平移后使B与E的交集非空的点构成的集合。先腐蚀后膨胀的过程称为开运算。它具有消除细小物体,在纤细处分离物体和平滑较大物体边界的作用。先膨胀后腐蚀的过程称为闭运算。它具有填充物体内细小空洞,连接邻近物体和平滑边界的作用。

    可见,二值形态膨胀与腐蚀可转化为集合的逻辑运算,算法简单,适于并行处理,且易于硬件实现,适于对二值图像进行图像分割、细化、抽取骨架、边缘提取、形状分析。但是,在不同的应用场合,结构元素的选择及其相应的处理算法是不一样的,对不同的目标图像需设计不同的结构元素和不同的处理算法。结构元素的大小、形状选择合适与否,将直接影响图像的形态运算结果。因此,很多学者结合自己的应用实际,提出了一系列的改进算法。如梁勇提出的用多方位形态学结构元素进行边缘检测算法既具有较好的边缘定位能力,又具有很好的噪声平滑能力。许超提出的以最短线段结构元素构造准圆结构元素或序列结构元素生成准圆结构元素相结合的设计方法,用于骨架的提取,可大大减少形态运算的计算量,并可同时满足尺度、平移及旋转相容性,适于对形状进行分析和描述。

    (2)灰度数学形态学

    二值数学形态学可方便地推广到灰度图像空间。只是灰度数学形态学的运算对象不是集合,而是图像函数。以下设f(x,y)是输入图像,b(x,y)是结构元素。用结构元素b对输入图像y进行膨胀和腐蚀运算分别定义为:

    对灰度图像的膨胀(或腐蚀)操作有两类效果:

    (1)如果结构元素的值都为正的,则输出图像会比输入图像亮(或暗);

    (2)根据输入图像中暗(或亮)细节的灰度值以及它们的形状相对于结构元素的关系,它们在运算中或被消减或被除掉。灰度数学形态学中开启和闭合运算的定义与在二值数学形态学中的定义一致。用b对f进行开启和闭合运算的定义为:

    (3)模糊数学形态学

    将模糊集合理论用于数学形态学就形成了模糊形态学。模糊算子的定义不同,相应的模糊形态运算的定义也不相同。在此,选用Shinba的定义方法。模糊性由结构元素对原图像的适应程度来确定。用有界支撑的模糊结构元素对模糊图像的腐蚀和膨胀运算按它们的隶属函数定义为:

    其中,x,y∈Z2代表空间坐标,ua,ub分别代表图像和结构元素的隶属函数。从(7),(8)式的结果可知,经模糊形态腐蚀膨胀运算后的隶属函数均落在[0,1]的区间内。模糊形态学是传统数学形态学从二值逻辑向模糊逻辑的推广,与传统数学形态学有相似的计算结果和相似的代数特性。模糊形态学重点研究n维空间目标物体的形状特征和形态变换,主要应用于图像处理领域,如模糊增强、模糊边缘检测、模糊分割等。

    三 数学形态学在图像处理中的主要应用

    近年来,数学形态学在图像处理方面得到了日益广泛的应用。下面主要就数学形态学在边缘检测、图像分割、图像细化以及噪声滤除等方面的应用做简要介绍。

    (1)       边缘检测

    边缘检测是大多数图像处理必不可少的一步,提供了物体形状的重要信息。对于二值图像,边缘检测是求一个集合A的边界,记为B(A):

    对于灰度图像,边缘检测是求一幅图像的形态学梯度,记为g:

    数学形态学运算用于边缘检测,存在着结构元素单一的问题。它对与结构元素同方向的边缘敏感,而与其不同方向的边缘(或噪声)会被平滑掉,即边缘的方向可以由结构元素的形状确定。但如果采用对称的结构元素,又会减弱对图像边缘的方向敏感性。所以在边缘检测中,可以考虑用多方位的形态结构元素,运用不同的结构元素的逻辑组合检测出不同方向的边缘。

    梁勇等人构造了8个方向的多方位形态学结构元素,应用基本形态运算,得到8个方向的边缘检测结果,再把这些结果进行归一化运算、加权求和,得到最终的图像边缘。该算法在保持图像细节特征和平滑边缘等方面,取得了较好的效果。

    边缘检测源代码:

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

    形态学基本操作采用二值图像

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

    #include

    #include

    int main(){

    IplImage * image,*image2,*image3;

    image = cvLoadImage("E:\\image\\mapleleaf.tif", 0);

    cvNamedWindow("image",1);

    cvShowImage("image",image);

    /*边界提取*/

    image2 = cvCreateImage(cvSize(image->width, image->height),image->depth ,1);

    image3 = cvCreateImage(cvSize(image->width, image->height),image->depth ,1);

    int i , j ;

    int left,right, up , down;

    int n = 2;//窗口大小为5*5

    int r,s,flag;

    unsigned char * ptr, *dst;

    for (i = 0 ; i< image->height; i++)

    {

    for (j = 0 ; j< image->width; j++)

    {

    //窗口设定

    left = j - n;

    right = j +n;

    up = i -n;

    down = i+n;

    //窗口出界处理

    if(left< 0){left = 0;}

    if(right >= image->width){right = image->width-1;}

    if(up< 0){up =0;}

    if(down >= image->height){down = image->height -1;}

    //腐蚀处理

    dst = (unsigned char *)image2->imageData + image2->widthStep*i + j;

    flag = 1;

    for (r = up;r <= down;r++)

    {

    for (s = left ; s<= right; s++)

    {

    ptr = (unsigned char *)image->imageData + r*image->widthStep + s;

    if(*ptr != 255){

    flag = 0;

    }

    }

    }

    if (flag == 1)

    {

    *dst = 255;

    }

    else{

    *dst = 0;

    }

    }

    }

    cvSub(image,image2,image3,0);

    cvNamedWindow("image3",1);

    cvShowImage("image3",image3);

    cvSaveImage("mapleleafboard.bmp", image3);

    cvWaitKey(0);

    cvReleaseImage(&image);

    cvReleaseImage(&image2);

    cvReleaseImage(&image3);

    cvDestroyAllWindows();

    return 0 ;

    }原图:

    

    边界提取:

    (2)       图像分割

    基于数学形态学的图像分割算法是利用数学形态学变换,把复杂目标X分割成一系列互不相交的简单子集X1,X2,…,XN,即:

    对目标X的分割过程可按下面的方法完成:首先求出X的最大内接“圆”X1,然后将X1从X中减去,再求X-X1的最大内接“圆”X2,…,依此类推,直到最后得到的集合为空集为止。下面以二值图像为例,介绍用数学形态学方法求解子集X1,X2,…,XN的过程。

    设B为结构元素,B可以是圆、三角形、正方形等简单的几何基元,那么“简单”形状集合Xi可以用下面的公式来定义:

    式中ni为一整数,用上式定义Xi分割目标,有时会产生分割过程不唯一的现象。为此可采用下面公式来定义简单集合Xi:

    其中Li为一个点或一条线,当Li为点时,则与(12)式定义等价。(13)式定义的简单形状Xi可由niB沿线Li移动而产生。即将“产生器”niB的中心沿“脊骨”Li移动产生。如果niB为圆,则得到的Xi称Blum带。它具有一些特殊的性质,如Xi的边界是光滑的,Xi的最大圆与其边界相切,Xi的脊骨与产生器都是唯一的等等。

    有了简单形状集合Xi的定义,则目标X可按下面方法分割。首先按式(14)求出X的最大内切结构元素Xi:

    数学形态学用于图像分割的缺点是对边界噪声敏感。为了改善这一问题,刘志敏等人提出了基于图像最大内切圆的数学形态学形状描述图像分割算法和基于目标最小闭包结构元素的数学形态学形状描述图像分割算法,并使用该算法对二值图像进行了分割,取得了较好的效果。邓世伟等人提出一种基于数学形态学的深度图像分割算法。作者首先利用形态学算子获得分别含有阶跃边缘与屋脊边缘的凸脊和凹谷图像,然后利用控制区域生长过程得到最终的分割结果。与传统方法相比,该方法速度快,抗噪性能好。

    (3)       形态骨架提取

    形态骨架描述了物体的形状和方向信息。它具有平移不变性、逆扩张性和等幂性等性质,是一种有效的形状描述方法。二值图像A的形态骨架可以通过选定合适的结构元素B,对A进行连续腐蚀和开启运算来求取,设S(A)代表A的骨架,定义为:

    蒋刚毅等人运用数学形态学方法,对交通标志的内核形状提取形态骨架函数,将其作为用于模式匹配的形状特征。A的形态骨架函数SKF(A)表示为:

    SKF(X)中值较大的点对应大的n,并代表了形态骨架的主要成分,即表达了形状的主体结构;而SKF(X)中值较小的点对应小的n,是形态骨架的细节成分,与形状的边缘信息相联系。

    形态骨架函数完整简洁地表达了形态骨架的所有信息,因此,根据形态骨架函数的模式匹配能够实现对不同形状物体的识别。算法具有位移不变性,因而使识别更具稳健性。

    骨架提取原代码:

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

    /* 骨架提取*/

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

    #include

    #include

    int main(){

    IplImage* image = cvLoadImage("E:\\image\\bone.tif",0);

    cvNamedWindow("image",1);

    cvNamedWindow("image2",1);

    cvNamedWindow("image3",1);

    cvNamedWindow("image4",1);

    cvNamedWindow("image5",1);

    cvNamedWindow("image6",1);

    cvNamedWindow("result",1);

    cvShowImage("image", image);

    //cvWaitKey(0);

    //当前图片image2 当前被腐蚀后的图片image3 被腐蚀开操作之后的图片 image5

    //image4 作为开操作的中间值 作差后的图片image6 并之后的图片result

    IplImage *image2, *image3 , *image4, *image5,*image6,*result;

    image2 = cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);

    image3 = cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);

    image5 = cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);

    image4 = cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);

    image6 = cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);

    result = cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);

    //循环标志 flag

    bool flag = true;

    //腐蚀判断标志 flag2

    bool flag2 = true;

    int i,j,r,s;

    unsigned char * ptr,*dst;

    unsigned char B[9] = {255 ,255,255,255,255,255,255,255,255};

    //对result进行赋值 全部为0

    for (i = 0 ; i< result->height; i++)

    {

    for (j = 0 ; j< result->width ; j++)

    {

    dst = (unsigned char *)(result->imageData + result->widthStep *i +j);

    *dst = 0;

    }

    }

    image2 = cvCloneImage(image);

    cvShowImage("image2", image2);

    //cvWaitKey(0);

    while (flag)

    {

    //flag = false;

    cvShowImage("image2",image2);

    //进行腐蚀操作,开环操作 作差 并

    for (i = 0 ; i< image3->height; i++)

    {

    for (j = 0 ; j< image3->width ; j++)

    {

    dst = (unsigned char *)(image3->imageData + i*image3->widthStep + j);

    if ((i == 0 )|| (j == 0) ||( i == image->height -1 ) || (j == image->width -1 ))

    {

    *dst = 0;

    //break;

    }

    else{

    flag2 = true;

    for (r = i-1 ; r<= i+1 ; r++)

    {

    for (s = j -1 ; s<= j+1 ; s++)

    {

    ptr = (unsigned char *)(image2->imageData + r*image2->widthStep + j);

    if(*ptr != 255){

    flag2 =false;

    }

    }

    }

    if (flag2)

    {

    *dst = 255;

    }

    else {*dst = 0;}

    }

    }

    }

    cvShowImage("image3",image3);

    //开操作 先腐蚀 后膨胀

    for (i = 0 ; i< image4->height; i++)

    {

    for (j = 0 ; j< image4->width ; j++)

    {

    dst = (unsigned char *)(image4->imageData + i*image4->widthStep + j);

    if ((i == 0 )|| (j == 0) ||( i == image->height -1 ) || (j == image->width -1 ))

    {

    *dst = 0;

    //break;

    }

    else{

    flag2 = true;

    for (r = i-1 ; r<= i+1 ; r++)

    {

    for (s = j -1 ; s<= j+1 ; s++)

    {

    ptr = (unsigned char *)(image3->imageData + r*image3->widthStep + s);

    if(*ptr != 255){

    flag2 =false;

    }

    }

    }

    if (flag2)

    {

    *dst = 255;

    }

    else {*dst = 0;}

    }

    }

    }

    cvShowImage("image4",image4);

    //膨胀操作

    for (i = 0 ; i< image5->height; i++)

    {

    for (j = 0 ; j< image5->width ; j++)

    {

    dst = (unsigned char *)(image5->imageData + i*image5->widthStep + j);

    if ((i == 0 )|| (j == 0) ||( i == image5->height -1 ) || (j == image5->width -1 ))

    {

    *dst = 0;

    //break;

    }

    else{

    flag2 = false;

    for (r = i-1 ; r<= i+1 ; r++)

    {

    for (s = j -1 ; s<= j+1 ; s++)

    {

    ptr = (unsigned char *)(image4->imageData + r*image4->widthStep + s);

    if(*ptr == 255){

    flag2 = true;

    }

    }

    }

    if (flag2)

    {

    *dst = 255;

    }

    else {*dst = 0;}

    }

    }

    }

    cvShowImage("image5",image5);

    //作差

    cvSub(image3,image5,image6,0);

    //并运算

    for (i = 0 ; i< result->height; i++)

    {

    for (j = 0 ; j< result->width ; j++)

    {

    dst = (unsigned char *)(result->imageData + result->widthStep *i +j);

    ptr = (unsigned char *)(image6->imageData + image6->widthStep *i +j);

    if (*ptr == 255)

    {

    *dst = 255;

    }

    }

    }

    cvShowImage("image6",image6);

    //将腐蚀后的图像复制给当前图像image2

    image2 = cvCloneImage(image3);

    //循环标志判定

    flag = false;

    for (i = 0 ; i< image2->height; i++)

    {

    for (j = 0 ; j< image2->width ; j++)

    {

    ptr = (unsigned char *)(image2->imageData + image2->widthStep *i +j);

    if (*ptr == 255)

    {

    flag = true;

    }

    }

    }

    cvShowImage("result", result);

    cvWaitKey(40);

    }

    cvShowImage("image2", image2);

    cvShowImage("image3", image3);

    //cvShowImage("image4", image4);

    //cvShowImage("image5", image5);

    //cvShowImage("image6", image6);

    cvShowImage("result",result);

    cvSaveImage("E:\\image\\bonegujia.bmp",result);

    cvWaitKey(0);

    cvReleaseImage(&image);

    cvDestroyAllWindows();

    return 0;

    }

    原图:

    提取的骨架:

    DNA原图:

    骨架:

    形态学算法对于提取交叉的物体,会产生断裂,一般会在提取之后紧跟连接操作。

    角点提取源代码:采用击中击不中变换

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

    形态学基本操作采用二值图像 形态学方法在边界获取和形状检测中有很多应用 寻找角点

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

    #include

    #include

    int main(){

    IplImage * image,*image2,*image3,*image4,*result;

    image = cvLoadImage("E:\\image\\jiaodian.bmp", 0);

    cvNamedWindow("image",1);

    cvShowImage("image",image);

    /*击中击不中变换 寻找角点*/

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

    /* 最终结果为(79, 85 )和 (129 ,134)两个符合要求的角点 在结果图像中可以看到两个白点*/

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

    image2 = cvCreateImage(cvSize(image->width, image->height),image->depth ,1);

    image3 = cvCreateImage(cvSize(image->width, image->height),image->depth ,1);

    image4 = cvCreateImage(cvSize(image->width, image->height),image->depth ,1);

    result = cvCreateImage(cvSize(image->width, image->height),image->depth ,1);

    int i,j,r,s ;

    unsigned char B1[9] ={ 255,255,255,255,0,0,255,0,0};

    unsigned char B2[9] = {0,0,0,0,255,255,0,255,255 };

    int flag;

    //iamge2 是对image进行求补的结果

    unsigned char *ptr, *dst,*ptr2;

    for (i = 0 ; i< image2->height; i++)

    {

    for (j = 0 ; j< image2->width; j++)

    {

    ptr = (unsigned char*)image->imageData + i * image->widthStep+ j;

    dst = (unsigned char*)image2->imageData + i*image2->widthStep + j;

    *dst = 255- (*ptr);

    }

    }

    //对源图像进行腐蚀

    for (i = 0 ; i< image3->height; i++)

    {

    for (j = 0 ; j< image3->width; j++)

    {

    flag = 1;

    dst = (unsigned char*)image3->imageData + i*image3->widthStep +j;

    //边界判断

    if (( i == 0) || (j == 0) || (i == image3->height-1) || (j == image3->width -1 ))

    {

    *dst = 0;

    }

    else{

    for (r = i -1 ; r<= i+1; r++)

    {

    for (s = j-1 ; s <= j +1 ; s++)

    {

    ptr = (unsigned char*)image->imageData + r * image->widthStep+ s;

    if (*ptr != B1[3*(r-i+1) + s-j+1])

    {

    flag = 0;

    break;

    }

    }

    }

    if (flag == 1)

    {

    ptr = (unsigned char*)image->imageData + i * image->widthStep+ j;

    *dst = 255;

    }

    else{

    *dst = 0;

    }

    }

    }

    }

    //显示腐蚀结果

    for (i = 0 ; i< image2->height; i++)

    {

    for (j = 0 ; j< image2->width; j++)

    {

    ptr = (unsigned char*)image->imageData + i * image->widthStep+ j;

    ptr2 = (unsigned char*)image3->imageData + i*image3->widthStep + j;

    if (*ptr2 == 255)

    {

    printf("x, %d y: %d %d\n",j, i, *ptr2 - *ptr);

    }

    }

    }

    //对补图像进行腐蚀

    for (i = 0 ; i< image4->height; i++)

    {

    for (j = 0 ; j< image4->width; j++)

    {

    flag = 1;

    dst = (unsigned char*)image4->imageData + i*image4->widthStep +j;

    //边界判断

    if (( i == 0) || (j == 0) || (i == image4->height-1) || (j == image4->width -1 ))

    {

    *dst = 0;

    }

    else{

    for (r = i -1 ; r<= i+1; r++)

    {

    for (s = j-1 ; s <= j +1 ; s++)

    {

    ptr = (unsigned char*)image2->imageData + r * image2->widthStep+ s;

    if ((*ptr) != B2[3*(r- i+1) + s-j +1])

    {

    flag = 0;

    }

    }

    }

    if (flag == 1)

    {

    ptr = (unsigned char*)image2->imageData + i * image2->widthStep+ j;

    *dst = 255;

    }

    else{

    *dst = 0;

    }

    }

    }

    }

    //显示腐蚀结果

    for (i = 0 ; i< image4->height; i++)

    {

    for (j = 0 ; j< image4->width; j++)

    {

    ptr = (unsigned char*)image2->imageData + i * image->widthStep+ j;

    ptr2 = (unsigned char*)image4->imageData + i*image3->widthStep + j;

    if (*ptr2 == 255)

    {

    printf("x, %d y: %d %d\n",j,i, *ptr2 - *ptr);

    }

    }

    }

    //二者求交集

    for (i = 0 ; i< result->height; i++)

    {

    for (j = 0 ; j< result->width; j++)

    {

    ptr = (unsigned char *)image3->imageData + image3->widthStep * i + j;

    ptr2 = (unsigned char *)image4->imageData + image4->widthStep * i + j;

    dst = (unsigned char *)result->imageData + result->widthStep*i + j;

    if (((*ptr) == 255) && ((*ptr2) == 255))

    {

    *dst = 255;

    printf("x : %d\n" , j);

    printf("y : %d\n" , i);

    }

    else{

    *dst = 0;

    }

    }

    }

    cvNamedWindow("image3",1);

    cvNamedWindow("image4",1);

    cvNamedWindow("result",1);

    cvShowImage("image3",image3);

    cvShowImage("image4",image4);

    cvShowImage("result",result);

    //cvSaveImage("mapleleafboard.bmp", image3);

    cvWaitKey(0);

    cvReleaseImage(&image);

    cvReleaseImage(&image2);

    cvReleaseImage(&image3);

    cvDestroyAllWindows();

    return 0 ;

    }原图:

    提取的角点:

    如果要提取十字型角点只需换用十字型的模板即可

    (4)       噪声滤除

    对图像中的噪声进行滤除是图像预处理中不可缺少的操作。将开启和闭合运算结合起来可构成形态学噪声滤除器。

    对于二值图像,噪声表现为目标周围的噪声块和目标内部的噪声孔。用结构元素B对集合A进行开启操作,就可以将目标周围的噪声块消除掉;用B对A进行闭合操作,则可以将目标内部的噪声孔消除掉。该方法中,对结构元素的选取相当重要,它应当比所有的噪声孔和噪声块都要大。

    对于灰度图像,滤除噪声就是进行形态学平滑。实际中常用开启运算消除与结构元素相比尺寸较小的亮细节,而保持图像整体灰度值和大的亮区域基本不变;用闭合运算消除与结构元素相比尺寸较小的暗细节,而保持图像整体灰度值和大的暗区域基本不变。将这两种操作综合起来可达到滤除亮区和暗区中各类噪声的效果。同样的,结构元素的选取也是个重要问题。

    四 选取结构元素的方法

    分析表明,各种数学形态学算法的应用可分解为形态学运算和结构元素选择两个基本问题,形态学运算的规则已由定义确定,于是形态学算法的性能就取决于结构元素的选择,亦即结构元素决定着形态学算法的目的和性能。因此如何自适应地优化确定结构元素,就成为形态学领域中人们长期关注的研究热点和技术难点。目前较多采用多个结构元素对图像进行处理的方法。

    (1)       多结构元素运算

    在许多形态学应用中,往往只采用一个结构元素,这通常不能产生满意的结果。在模式识别中,如果要提取某个特定的模式,只采用一个结构元素,那么,只有与结构元素形状、大小完全相同的模式才能被提取,而与此结构元素表示的模式即使有微小差别的其他模式的信息都不能获取。

    解决此问题的一个有效方法之一就是将形态学运算与集合运算结合起来,同时采用多个结构元素,分别对图像进行运算,然后将运算后的图像合并起来,即多结构元素形态学运算。

    (2)       用遗传算法选取结构元素

    遗传算法的思想来源于自然界物竞天择、优胜劣汰、适者生存的演化规律和生物进化原理,并引用随机统计理论而形成,具有高效并行全局优化搜索能力,能有效地解决机器学习中参数的复杂优化和组合优化等难题。

    近年来不少国外学者已进行了这方面的探索与研究,Ehrgardt设计了形态滤波的遗传算法,用于二值图像的去噪和根据二值纹理特性消除预定目标;Huttumen利用遗传算法构造了软式形态滤波器及其参数优化的设计方法,以实现灰度图像的降噪功能。余农、李予蜀等人用遗传算法在自然景象的目标检测与提取方面进行了研究,通过自适应优化训练使结构元素具有图像目标的形态结构特征,从而赋予结构元素特定的知识,使形态滤波过程融入特有的智能,以实现对复杂变化的图像具有良好的滤波性能和稳健的适应能力。其实质是解决滤波器设计中知识获取和知识精炼的机器学习问题。

    五 数学形态学存在的问题与进一步的研究方向

    数学形态学是一门建立在集论基础之上的学科,是几何形状分析和描述的有力工具。近年来,数学形态学在数字图像处理、计算机视觉与模式识别等领域中得到了越来越广泛的应用,渐渐形成了一种新的数字图像分析方法和理论,引起了国内外相关领域研究人员的广泛关注。目前,数学形态学存在的问题及研究方向主要集中在以下几个方面:

    (1)            形态运算实质上是一种二维卷积运算,当图像维数较大时,特别是用灰度形态学、软数学形态学、模糊形态学等方法时,运算速度很慢,因而不适于实时处理。

    (2)            由于结构元素对形态运算的结果有决定性的作用,所以,需结合实际应用背景和期望合理选择结构元素的大小与形状。

    (3)             软数学形态学中关于结构元素核心、软边界的定义,及对加权统计次数*的选择也具有较大的灵活性,应根据图像拓扑结构合理选择,没有统一的设计标准。

    (4)           为达到最佳的滤波效果,需结合图像的拓扑特性选择形态开、闭运算的复合方式。

    (5)            对模糊形态学,不同的模糊算子会直接影响模糊形态学的定义及其运算结果。

    (6)           有待进一步将数学形态学与神经网络、模糊数学结合研究灰度图像、彩色图像的处理和分析方法。

    (7)            有待进一步研究开发形态运算的光学实现及其它硬件实现方法。

    (8)            有待将形态学与小波、分形等方法结合起来对现有图像处理方法进行改进,进一步推广应用。所以如何实现灰度形态学、软数学形态学、模糊软数学形态学的快速算法,如何改善形态运算的通用性,增强形态运算的适应性,并结合数学形态学的最新应用进展,将其应用到图像处理领域,丰富和发展利用数学形态学的图像处理与分析方法,成为数学形态学今后的发展方向。

    六 结论

    数学形态学对图像的处理具有直观上的简明性和数学上的严谨性,在定量描述图像的形态特征上具有独特的优势,为基于形状细节进行图像处理提供了强有力的手段。建立在集合理论基础上的数学形态学,主要通过选择相应的结构元素采用膨胀、腐蚀、开启、闭合#种基本运算的组合来处理图像。数学形态学在图像处理中的应用广泛,有许多实用的算法,但在每种算法中结构元素的选取都是一个重要的问题。

    展开全文
  • nbsp图形图像数字图像处理在二值形态学及其灰度形态学方面的应用.ppt32页本文档一共被下载:次,您可全文免费在线阅读后下载本文档。 下载提示1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载...

    您所在位置:网站首页 > 海量文档

    &nbsp>&nbsp计算机&nbsp>&nbsp图形图像

    2a1a028d081056ab14b40d3afcc4d675.gif

    数字图像处理在二值形态学及其灰度形态学方面的应用.ppt32页

    本文档一共被下载:2377011b61454b208b34ad77b4c31088.gif次,您可全文免费在线阅读后下载本文档。

    072ad097814a33d1ad18e33ca14a5a9e.png

    9ec2792a743ebdf4575ee09a03c275ea.png

    7af312d1be2cfc1e59f15880bb7a7e7a.png

    5f207613e329ca76dc87c76d3ff77e64.png

    adf7aa3071c520b8a2063089f549261c.png

    下载提示

    1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。

    2.该文档所得收入(下载+内容+预览三)归上传者、原创者。

    3.登录后可充值,立即自动返金币,充值渠道很便利

    灰度形态学的一些应用 top-hat变换 灰度图像梯度处理结果:增强阴影的细节 纹理分割 灰度形态学的一些应用 a 原始图像 b 显示不同纹理边界的图像 先用一系列逐步增大的圆形结构元素进行闭操作,除去小圆, 剩下较 亮的背景; 再用比大圆之间间隙较大的结构元素进行开操作,使空隙区域变的更暗 Confidential BMIE 形态学图像处理 林海叶 形态学图像处理 二值形态学基本操作 2 基本的集合定义 3 1 灰度形态学基本操作 3 3 基本的集合定义 集合:具有某种特定性质,区别于其它事物的一个整体,常用A,B表示. 元素:组成集合的各事物,常用a,b表示.如果a为A的元素,记为 子集: 集合A中的所有元素同时是集合B的元素,记为 并集: 交集: 补集: 差集: 映射: 位移: , 二值形态学基本操作 什么是结构元素? 本身是一个图像集合,是一个包含0或1的数组; 可直接携带(形态、大小、灰度或色度)等信息; 在图像中移动,了解图像各个部分之间的相互关系; 结构元素的原点是结构元素参与形态学运算的参考点; 一般结构元素的尺寸要明显小于目标图像的尺寸。 数学形态学是用结构元素对图像进行的操作 膨胀运算 定义: 膨胀的结果:结构元素B的参考点的集合 实例: 或 集合A 结构元素B 膨胀结果 膨胀运算 基本图像的膨胀运算示例: 0 1 0 1 1 0 1 0 结论: 目标的面积大于原有的面积; 膨胀运算可以将断开的目标物进行连接。 结构元素 腐蚀运算 定义: 腐蚀的结果:结构元素在集合A中的参考点的集合。 实例: 腐蚀运算 基于图像的腐蚀运算示例: 结论: 减小了目标物的面积; 将粘连的目标物分开。 膨胀腐蚀的基本性质 对偶性: 交换性和结合性:只有膨胀运算具有这种性质 递增性: 分配性: 证明: 开操作运算 定义: 结论:开操作可以去掉细长的突出、边缘毛刺、孤立斑点,断开目标物之间粘连;与腐蚀作用相似,可以保持目标物尺寸大小不变 示例: 0 1 0 1 1 0 1 0 结构元素 闭操作运算 定义: 结论:闭运算可以填充目标内的细小空间和裂缝; 与膨胀运算相似,可以基本保持目标物尺度大小不变 示例: 开、闭运算的基本性质 对偶性: 开操作满足下列性质: 是A的子集; 如果C是D的子集,则 是 的子集; 幂等: 闭操作满足下列性质: A是 的子集; 如果C是D的子集,则 是 的子集; 幂等: 击中击不中变换 HMT 实例: 定义: 或 解释: 目标对象互不相交情况下, B1在A中找到了匹配(击中)B2在Ac中找到了匹配(击中) 击中击不中变换 HMT 实例:在大小不一的目标图像中,找到尺寸15x 15的目标 噪声滤除 假定所有噪声分量物理大小小于结构元素B 腐蚀消除背景噪声 腐蚀增加物体自身噪声的大小,通过闭操作消除 定义: 实例: 原理: 图像边界提取 定义: 图像边界提取 提取图像边界实例: 0 1 0 1 1 0 1 0 结构元素 区域填充 定义: 给定初值: 当 时,终止迭代。 区域填充 区域填充实例: 连通组元提取 定义: 区域骨架提取 提取骨架定义: 对提取的骨架进行重构: 骨架的定义 在二值图像的内部任意给定一点,如果以该点为圆心存在一个最大圆盘,其整个盘体都在图像的内部, 且至少有两点与目标边界相切,则该点便是骨架上的点。所有最大圆盘的圆心构成了图像的骨架 实现过程: 区域骨架提取 简单图形骨架实例: 区域骨架提取 效果图: 原始二值图像 3x3结构元素 5x5结构元素 7x7结构元素 灰度形态学基本操作 膨胀运算: 一维函数: 二维函数: 腐蚀运算: 一维函数: 二维函数: 设f的长度为N, b的长度为M,腐蚀结果长度为N-M+1. 如果结构元素值都大于零,结果图像灰度值变大,图像变的更亮 如果结构元素值都大于零,结果图像灰度值变小,图像变的更暗 设f的长度为N, b的长度为M,膨胀结果长度为N+M-1. 灰度形态学基本操作 灰度图像处理: 腐蚀效果: 在输入图像中亮的细节面积比结构元素面积小,则亮的效果将被消弱。 消弱的程度取决于环绕于亮细节周围的灰度值和结构元素自身的形状和幅值

    发表评论

    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。

    用户名:

    验证码:

    c9f2bced460b0329ba0aadbbc3f0fc71.png

    匿名?

    发表评论

    展开全文
  • 文章目录形态学图像处理1 膨胀和腐蚀1.1 膨胀1.2 腐蚀2 开操作和闭操作3 击中或击不中变换4 一些基本的形态学算法4.1 边界提取4.2 区域填充4.3 连通分量的提取图像分割1 间断检测1.1 点检测1.2 线检测1.3 边缘检测2 ...

    文章目录

    形态学图像处理

    1 膨胀和腐蚀

    1.1 膨胀

    1.2 腐蚀

    2 开操作和闭操作

    3 击中或击不中变换

    4 一些基本的形态学算法

    4.1 边界提取

    4.2 区域填充

    4.3 连通分量的提取

    图像分割

    1 间断检测

    1.1 点检测

    1.2 线检测

    1.3 边缘检测

    2 边缘连接

    2.1 局部处理

    2.2 通过霍夫曼变换进行整体处理

    总结

    形态学图像处理

    数学形态学的语言是集合论。它为大量的图像处理问题提供了一种一致的有力方法。数学形态学中的集合表示图像中的不同对象。

    例如,在一幅二值图像中所有黑色像素的集合是图像完整的形态学描述。在二值图像中,正在被讨论的集合是二维整数空间的元素,在这个二维整数空间中,集合的每个元素都是一个多元组,是一个黑色(或白色,取决于事先约定)像素在图像中的坐标(x,y)。

    1 膨胀和腐蚀

    膨胀和腐蚀是许多形态学算法的基础。

    1.1 膨胀

    由于A和B是定义在Z^2中的集合,A被B膨胀定义为:

    也可以写成:

    集合B通常叫做膨胀的结构元素。

    图1 膨胀示意图

    1.2 腐蚀

    对Z中的集合A和B,使用B对A进行腐蚀,定义为:

    图2 腐蚀示意图

    膨胀和腐蚀对于集合求补运算和反射运算是彼此对偶的,即:

    2 开操作和闭操作

    开操作和闭操作是另外两种重要的形态学操作。

    开操作一般使对象的轮廓变得光滑。断开狭窄的间断和消除细的突出物。闭操作同样使轮廓线更为光滑,但与开操作相反的是,它通常连接狭窄的间断是长细的鸿沟,消除小的孔洞,并填补轮廓线中的断裂。

    使用结构元素B对集合A进行开操作,定义为:

    使用结构元素B对集合A进行闭操作,定义为:

    图3 形态学中对开操作和闭操作的说明

    对开操作可以做一个简单的几何解释:

    图4 对开操作的几何解释

    假设将结构元素B看作一个“转球”,AºB的边界通过B中的点完成,即B在A的边界内转动时,B中的点所能到达的A的边界的最远点。这个开操作的几何拟合特性使得出一个集合论的公式,这个公式说明用B对A进行开操作是通过求取B在A中的平移的并集得到的,就是说,开操作可以表示为:

    对于闭操作有相似的几何解释,只是现在在边界的外部转动B。从几何上讲,当且仅当对包含w的(B)z进行的所有平移都满足(B)z∩A≠∅时,点w是A·B的一个元素。

    图5 对闭操作的几何解释 同样,开操作和闭操作也是一对关于集合求补及映射的对偶操作,即:

    3 击中或击不中变换

    形态学中的击中或击不中变换时形状检测的基本工具。

    令每种形状的重心为它的原点。设X被包围在一个小窗口W中,与W有关的X的局部背景定义为集合的差(W-X)。如果B表示由X和X的背景构成的集合,则在A中对B进行的匹配(或匹配操作的集合)表示为:

    4 一些基本的形态学算法

    4.1 边界提取

    集合A的边界表示为β(A),它可以通过先由B对A腐蚀,而后用A减去腐蚀得到,即:

    4.2 区域填充

    图6 区域填充

    如图所示,A表示一个包含子集的集合,其子集的元素均是区域的8连通边界点。目的是从边界内的一个点开始,用1填充整个区域。我们采用:所有非边界(背景)点标记为0,则以将1赋给p点开始。下列过程将整个区域用1填充:

    4.3 连通分量的提取

    实际上,在二值图像中提取连通分量是许多自动图像分析应用中的核心任务。令Y表示一个包含于集合A的连通分量,并且假设Y中的一个点p是已知的。而后,用下列的迭代表达式生成Y的所有元素:

    图像分割

    图像分割将图像细分为构成它的子区域或对象。分割的程度取决于要解决的问题。就是说,在应用中,当感兴趣的对象已经被分离出来时,就停止分割。

    图像分割算法一般是基于亮度值的两个基本特性之一:不连续性和相似性。

    第一类性质的应用途径是基于亮度的不连续变化分割图像,比如图像的边缘。第二类的主要应用途径是依据事先制定的准则将图像分割为相似的区域。门限处理、区域生长是这类方法的实例。

    1 间断检测

    寻找间断最一般的方法是,将整幅图像使用一个模板进行检测,这一过程包含计算模板所包围区域内灰度级与模板系数的乘积之和。

    1.1 点检测

    点检测的基本思想是:如果一个孤立的点(此点的灰度级与其背景的差异相当大并且它所在的位置是一个均匀的或近似的区域)与它周围的点很不相同,则很容易被这类模板检查到。

    1.2 线检测

    上图中四个模板分别对4个方向上单像素宽的线有最大响应。

    令R1,R2,R3,R4代表图中从左到右模板的响应。假设4个模板分别应用于一幅图像,在图像中心的点,如果|R1|>|Rj|,则此点被认为与在模板i方向的线更相关。如果只检测特定方向上的线,我们应使用与这一方向有关的模板,并设置该模板的输出门限。

    1.3 边缘检测

    一条理想的边缘应该是每个像素都处在灰度级跃变的一个垂直台阶上。一阶导数可以用于检测图像中的一个点是否是边缘的点(也是判断一个点是否在斜坡上)。同样,二阶导数的符号可以用于判断一个边缘像素是在边缘亮的一边还是暗的一边。

    二阶导数有两个附加性质:

    (1)对图像中的每条边缘二阶导数生成两个值。

    (2)一条连接二阶导数正极值和负极值的虚构直线将在边缘中点附近穿过零点。

    故可以得到这样的结论:

    为了对有意义的边缘点进行分类,与这个点相联系的灰度级变化必须比在这一点的背景上的变化更为有效。由于我们用局部计算进行处理,决定一个值是否有效的选择方法就是使用,门限。因此,如果一个点的二维一阶导数比指定的门限大,就定义图像中的此点是一个边缘点。如果选择使用二阶导数,则另一个可用的定义是将图像中的边缘点定义为它的二阶导数的零交叉点。

    一幅数字图像的一阶导数是基于各种二维梯度的近似值。图像f(x,y)在位置(x,y)处为下列向量:

    在边缘检测中,一个重要的量是这个向量的大小

    这个量给出了在▽f方向上每增加单位距离后f(x,y)值增大的最大变化率。一般来讲▽f称为梯度。

    梯度向量的方向也是一个重要的量。令α(x,y)表示向量▽f在9x,y)处的方向角。然后由向量分析得到:

    角度是以x轴为基准度量的。边缘在(x,y)处的方向与此点的梯度向量的方向垂直。

    2 边缘连接

    由于噪声、不均匀的照明而产生的边缘间断以及其他由于引入虚假的亮度间断所带来的影响,使得到的一组像素很少能完整地描绘一条边缘。因此,典型的做法是在使用边缘检测算法后紧跟着使用连接过程将边缘像素组合成有意义的边缘。

    2.1 局部处理

    连接边缘点最简单的方法之一是分析图像中每个点(x,y)的一个小邻域内像素的特点,将所有依据事先预定的准则而被认为是相似的点连接起来,形成由共同满足这些准则的像素组成的一条边缘。在这种分析过程中确定边缘像素相似性的两个主要性质是:(1)用于生成边缘像素的梯度算子的响应强度和(2)梯度向量的方向。

    2.2 通过霍夫曼变换进行整体处理

    假设已知图像中有直线边缘,在图像中检测出n个边缘点,希望找到最有可能的直线。那么首先应找到这些点中位于直线上的点组成的子集。

    考虑一个点(xi,yi)和一条直线的斜截式方程yi=axi+b。通过点(xi,yi)的直线有无数条,且对不同的a、b值它满足这个等式。然而,将等式写成b=-axi+yi的形式并参考ab平面将得到对于点(xi,yi)的唯一直线方程。霍夫曼变换在计算上的吸引力在于将参数空间进一步分割为累加器单元。开始的时候这些单元被置位0,然后对图像平面中的每个边缘点(xi,yi)令参数a分别等于a轴上每个允许的细分值,同时使用等式得到对应的b。然后对得到的b进行舍入的带b轴上允许的近似值。在ab平面上的细分数目决定了这些点的共线性精确度。

    一种基于霍夫曼变换的连接方法如下:

    计算图像的梯度并对其设置门限得到一幅二值图像

    在ρ、θ平面内确定再细分

    对像素高度集中的地方检验其累加器单元的数目

    检验选择的单元中像素之间的关系

    此时连续性的概念通常是基于不连续像素间距离的计算,这些不连续像素是在遍历给定累加器单元对应的像素集合的过程中识别出来的。如果一点和它最接近的相邻点之间的距离超过某一门限,就认为点之间的间隔是有意义的。

    总结

    形态学图像处理将数学形态学作为工具从图像中提取表达和描绘区域形状的有用图像分量,用集合论的方法为为大量的图像处理提供一种一致有力的方法。

    其中最基础的操作就是膨胀和腐蚀。腐蚀通常是缩小或细化二值图像中的物体,可以将其看做形态学滤波操作,将小于结构元的图像细节从图像中滤除。而膨胀则是正常或者粗化二值图像中的物体。

    开操作一般会平滑物体的轮廓、断开较窄的狭径并消除较细的突出物,闭操作同样也会平滑轮廓的一部分,但与开操作相反的是它通常会弥补较窄的间断和细长的沟壑,消除较小的孔洞,填补轮廓线中的断裂。开操作执行先腐蚀后膨胀,闭操作执行先膨胀再腐蚀。

    图像分割是在输入是图像输出是从这些图像中提取出来的属性的图像处理方法的一个关键步骤。将图像细分为它的子区域或物体,细分的程度取决于要解决的问题。

    我们感兴趣的三种图像特征为孤立点、线和边缘。故而以点、线和边缘处的灰度级剧烈变化检测为基础的图像分割方法。

    展开全文
  • 最近在学习形态学重建的知识,发现在百度上资料很少,经过挣扎在matlab官网上和一些paper中找到了些教程,现在做个记录整理。理解形态学重建形态学重建可以看作是对一个图像进行连续的膨胀操作,这个图像称之为标识...
  • 结构元:研究一幅图像中感兴趣特性所用的小集合或子图像,结构元基本形态是矩形、十字形和椭圆形,其选择和实际情况有关;2.腐蚀:假设我们有一图像A,以及一个结构元B,一个结构元定义一个中心点,B对A的腐蚀就是...
  • Matlab 形态学常用算法

    2021-04-30 02:32:02
    开运算和闭运算都包含膨胀与腐蚀操作,开运算是先腐蚀在膨胀,其作用是消除小的亮孤立点,剩余两区域基本不变; 闭运算是先膨胀再腐蚀,起作用是将亮区域连接在一起,迭代开运算或者是闭运算不是膨胀--腐蚀--膨胀--...
  • 本发明属于图像处理技术,具体涉及一种基于形态学的目标特征提取方法。背景技术:特征提取是图像识别的关键技术,图像的特征有颜色特征,纹理特征,几何特征等等。目标的几何特征是图像识别中常用的特征。通常目标...
  • 第9章 数学形态学以及二值图像形态学处理 9.1 数学形态学概述 9.1.1 数学形态学简介 数学形态学(Mathematical Morphology)诞生于1964年。法国巴黎矿业学院博士生赛拉 (J.Serra)和导师马瑟荣,在从事铁矿核的定量岩石...
  • 0引言柔性形态变换是Koskinen等人在经典形态变换...但在运用柔性数学形态学检测图像边缘时,往往要进行大量的数学计算。目前流行用Fortran、C语言等编制计算程序,既需要对有关算法有深刻的了解,还需要熟练地掌握所用...
  • 图像的形态学操作

    2021-08-30 19:43:36
    目录一、基本的形态学操作二、复合的形态学操作二、相关代码 一、基本的形态学操作 简单来讲,形态学操作就是基于形状的一系列图像处理操作。通过将 结构元素 作用于输入图像来产生输出图像。 最典型的两种操作,...
  • 本章详细的介绍利用MATLAB软件进行形态学图像处理,主要内容包括基本运算、组合形态学运算以及二值图像的其他形态学运算等内容。 12.1 基本的形态学运算 数学形态学可以看作是一种特殊的数字图像处理方法和理论,...
  • 图像形态学

    2021-09-01 11:25:42
    形态学(Morphology)是生物学中研究动植物形态和结构的一个学科分支。数学形态学(Mathematical Morphology)是一门建立在集合论基础上的学科,它是几何形态分析和描述的有力工具。数学形态学是一种有效的非线性图像...
  • 2012 年 2 月第 31 卷 第 2 期 理论与方法 中国科技核心期刊 一种基于数学形态学的灰度图像边缘检测方法 杨丽雯1,2 曾朝阳1 张永继3 ( 1. 装备学院 光电装备系 北京 101416; 2. 装备学院研究生管理大队 北京 ...
  • 实验二 形态算子一、实验目的与要求目的:学习常见的数学形态学运算基本方法,了解腐蚀、膨胀、开运算、闭运算取得的效果,培养处理实际图像的能力。要求:上机运行,调试通过。二、 实验设备:计算机、Matlab软件、...
  • 数学形态学(Mathematical Morphology)——二值形态学算法1、基本概念函数结构元素(Structure Element):spa设有两幅图象B,A。若A是被处理的对象,而B是用来处理A的,则称B为结构元素,又被形象地称作刷子。结构元素...
  • 形态学操作

    2021-09-16 21:38:58
    腐蚀和膨胀是计算机视觉任务中两种最基本也是最重要的形态学运算, 它们是后续要介绍的很多高级形态学处理的基础,很多其他的形态学算法都是由这两种基本运算复合而成。 首先,先明确什么是结构元素。设有两幅图像p1...
  • 点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达 关于OpenCV形态学使用基础可以查看公众号免费的OpenCV视频教程,其中有详细介绍,本篇文章主...
  • 形态学--骨架

    2021-04-18 09:36:16
    纹理分割 形态学的纹理分割目的是:以纹理内容为基础找到两个区域的边界,将一幅图像分为不同的区域的处理称为分割。 其原理:使用一个比小斑点大的结构元对图像做闭操作,这些斑点将被删除。之后使用尺寸大于剩余...
  • 图像处理——形态学

    2020-12-31 15:21:52
    什么形态学 形态学(morphology)一词通常表示生物学的一个分支,该分支主要研究动植物的形态和结构。而我们图像处理中指的形态学,往往表示的是数学形态学。 数学形态学(Mathematical morphology) 是一门建立在...
  • 其基本的运算包括:腐蚀和膨胀、开运算和闭运算、图像顶帽运算和图像底帽运算、骨架抽取、形态学梯度、Top-hat变换等。万字长文整理,希望对您有所帮助。该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解...
  • 2018年9月5-8日,在...大会会场大会举行了“全国检验形态学通关大赛”,来自全国各地的检验同行在此进行紧张又激烈的角逐。本届形态学技能竞赛分个人赛和团体赛。命题范围包括骨髓细胞、外周血细胞、尿液有形成分...
  • 一、什么形态学 形态学一般指生物学中研究动物和植物结构的一个分支。用数学形态学(也称图像代数)表示以形态为基础对图像进行分析的数学工具。基本思想是用具有一定形态的结构元素去度量和提取图像中的对应形状...
  • 9.2.1 Python图像处理之图像数学形态学-二值形态学应用之噪声消除 文章目录9.2.1 Python图像处理之图像数学形态学-二值形态学应用之噪声消除1 算法原理2 代码3 效果 1 算法原理 二值图像中常有一些小孔或小岛。这些...
  • OpenCV 形态学操作

    2021-06-29 16:46:48
    形态学操作主要包含:腐蚀、膨胀、开运算、闭运算、形态学梯度运算、顶帽运算(礼帽运算)、黑帽运算等操作。 案例来源于傅老师。 1.腐蚀 腐蚀是最基本的形态学操作之一,它能够将图像的边界点消除,使图像沿着边界...
  • 15、OpenCV形态学操作——Hit-or-Miss

    千次阅读 2021-01-28 10:03:00
    OpenCV形态学操作——Hit-or-Miss一、学习目标二、Hit-or-Miss 一、学习目标 理解什么是Hit-or-Miss 学会在OpenCV中使用Hit-or-Miss 二、Hit-or-Miss 形态学算子根据图像的形状来处理图像。这些操作符将一个或多个...
  • 形态学处理: 开运算:先腐蚀后膨胀的过程。用来消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时并不明显改变其面积。开运算通常是在需要去除小颗粒噪声,以及断开目标物之间粘连时使用。.
  • 表1 属性字符串列表 properties值 度量图像区域的属性或功能 'Area' 图像各个区域中像素总个数 'BoundingBox' 包含相应区域的最小矩形 'Centroid' 每个区域的质心(重心) 'MajorAxisLength' 与区域具有相同标准...
  • Date: 2019-3-10前言形态学边缘检测算子是一种非线性差分算子,在以上定义的梯度算子中,腐蚀运算可以滤去图像中比结构元素小的亮细节;膨胀运算可以去掉比结构元素小的亮细节,而保持图像整体灰度和大的亮区域基本不...
  • 点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达 本文转自:AI算法与图像处理二值图像分析一块核心技能就是图像形态学操作技巧,这里也打算根据我自己的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 65,750
精华内容 26,300
关键字:

形态学包括什么