一、理论概念

  区域生长是按照事先定义的生长准则将一个像素或者子区域逐步聚合成一个完整独立的连通区域过程。对于图像感兴趣目标区域R,z为区域R上事先发现的种子点,按照规定的生长准则逐步将与种子点z一定邻域内符合相似性判据的像素合并成一个种子群以备下一阶段的生长,这样不断的进行循环生长直到满足生长停止条件为止,从而完成了对感兴趣区域由一个种子点生长为一个独立连通区域的过程。其中相似性判据可以是像素灰度值、颜色、纹理特征等图像信息。

因此区域生长算法一般分为三个步骤实现:

(1)    确定生长种子点

(2)    规定生长准则

(3)    确定生长停止条件

实际工程应用中区域生长算法常被用于对二值化图像指定连通区域的分割。图1以图文方式对区域生长算法的三步骤进行解释:

①     原始二值化图像(a)中的红色标注的像素为指定生长点;

②     图像(b)和(c)是采用不同生长准则进行区域生长的结果,其中图(b)是在4邻域下,待测像素与生长点像素灰度值相等的像素集合。正如图中所示第1次生长时,与生长点像素灰度相等的像素有上、下、左、右四个像素,接着第二次生长时,就由前一次已经生长的像素按照同样的准则进行下去,直到遇到图像边界或背景区域时生长停止。图(c)是在8邻域下,待测像素与生长点像素灰度值相等的像素集合。

二、MATLAB示例代码实现

2.1 主函数文件

%主文件
clc;
clear all;
close all;
%申明全局变量 R:区域生长的结果图像;BW:二值化图像;counter:感兴趣连通区域的像素个数
%row:图像的行数;col:图像的列数
global R BW counter row col I = imread('E:\MATLAB仿真\fsr.bmp');
I = I(:,:,1);
[row,col] = size(I);
figure,imshow(I); level = graythresh(I);
BW = im2bw(I,level);
figure,imshow(BW); [y0,x0] = getpts;
x0 = uint32(x0);
y0 = uint32(y0);
counter = 0;
R = zeros(row,col);
R = uint8(R);
fsrRegiongrow(x0,y0,4);% fsrRegiongrow1(x0,y0,4);
figure,imshow(R);

2.2 函数模块1

function fsrRegiongrow(x0,y0,mode)
%功能: 通过函数递归方法对二值化图像指定连通区域实现区域生长
%输入参数: x0,y0表示生长点像素坐标,mode表示以多大邻域进行区域生长,常取mode = 4;mode = 8;
%输出参数: void
%作者&时间: 奔跑在湘边———2016年5月6日
global R BW counter row col if 8 == mode
for i = -1 : 1
for j = -1 : 1
x1 = x0 + i;
y1 = y0 + j;
%生长准则:判断生长点8邻域内像素的各自灰度值是否与生长点所在像素灰度值相等
if x1 > 0 && x1 <= row && y1 > 0 && y1 <= col && BW(x1,y1) == BW(x0,y0) && 0 == R(x1,y1)
R(x1,y1) = 255;
counter = counter + 1;
fsrRegiongrow(x1,y1,mode);
end
end
end
elseif 4 == mode
for i = -1 : 1
x1 = x0 + i;
y1 = y0;
if x1 > 0 && x1 <= row && y1 > 0 && y1 <= col && BW(x1,y1) == BW(x0,y0) && 0 == R(x1,y1)
R(x1,y1) = 255;
counter = counter + 1;
fsrRegiongrow(x1,y1,mode);
end
end
x1 = x0;
y1 = y0 - 1;
if x1 > 0 && x1 <= row && y1 > 0 && y1 <= col && BW(x1,y1) == BW(x0,y0) && 0 == R(x1,y1)
R(x1,y1) = 255;
counter = counter + 1;
fsrRegiongrow(x1,y1,mode);
end
x1 = x0;
y1 = y0 + 1;
if x1 > 0 && x1 <= row && y1 > 0 && y1 <= col && BW(x1,y1) == BW(x0,y0) && 0 == R(x1,y1)
R(x1,y1) = 255;
counter = counter + 1;
fsrRegiongrow(x1,y1,mode);
end
end
end

2.3 函数模块2

function fsrRegiongrow1(x0,y0,mode)
%功能: 模拟栈的先进后出思路对二值化图像指定连通区域实现区域生长
%输入参数: x0,y0表示生长点像素坐标,mode表示以多大邻域进行区域生长,常取mode = 4;mode = 8;
%输出参数: void
%作者&时间: 奔跑在湘边———2016年5月6日
global R BW counter row col zhan = zeros(row*col,2);%创建栈数组
pzhan = 1; %栈计数
zhan(pzhan,1) = x0;
zhan(pzhan,2) = y0;
R(x0,y0) = 255;
counter = 1; if 8 == mode
while pzhan > 0
x1 = zhan(pzhan,1);%出栈
y1 = zhan(pzhan,2);
pzhan = pzhan - 1; %栈计数减一
for i = -1 : 1
for j = -1 : 1
%生长准则:判断生长点8邻域内像素的各自灰度值是否与生长点所在像素灰度值相等
if x1+i > 0 && x1+i <= row && y1+j > 0 && y1+j <= col && BW(x1+i,y1+j) == BW(x1,y1) && R(x1+i,y1+j) ~= R(x1,y1)
R(x1+i,y1+j) = R(x1,y1);
counter = counter + 1;
pzhan = pzhan + 1; %栈计数增一
zhan(pzhan,1) = x1 + i;%入栈
zhan(pzhan,2) = y1 + j;
end
end
end
end
elseif 4 == mode
while pzhan > 0
x1 = zhan(pzhan,1);
y1 = zhan(pzhan,2);
pzhan = pzhan - 1;
for i = -1 : 2 : 1
j = 0;
if x1+i > 0 && x1+i <= row && y1+j > 0 && y1+j <= col && BW(x1+i,y1+j) == BW(x1,y1) && R(x1+i,y1+j) ~= R(x1,y1)
R(x1+i,y1+j) = R(x1,y1);
counter = counter + 1;
pzhan = pzhan + 1;
zhan(pzhan,1) = x1 + i;
zhan(pzhan,2) = y1 + j;
end
end
for j = -1 : 2 : 1
i = 0;
if x1+i > 0 && x1+i <= row && y1+j > 0 && y1+j <= col && BW(x1+i,y1+j) == BW(x1,y1) && R(x1+i,y1+j) ~= R(x1,y1)
R(x1+i,y1+j) = R(x1,y1);
counter = counter + 1;
pzhan = pzhan + 1;
zhan(pzhan,1) = x1 + i;
zhan(pzhan,2) = y1 + j;
end
end
end
end
end

三、说明

在基于MATLAB7.11.0(R2010b)平台调用函数模块fsrRegiongrow时,MATLAB会弹出如下警告

??? Maximum recursion limit of 500 reached. Use set(0,'RecursionLimit',N)

to change the limit.  Be aware that exceeding your available stack space can crash MATLAB and/or your computer.

Error in ==> fsrRegiongrow

上述警告表示递归次数超出了MATLAB默认值,也就是说待处理的感兴趣连通区域像素个数太多(大于500),此时用户可以尝试通过提示的set函数来修改函数递归次数,但是本文通过测试发现如果递归次数超出1591时(不同的平台该值可能不同),MATLAB软件会自动立即关闭。总之,大量的递归调用会建立函数的副本,消耗大量的时间和内存,但是递归可以使得程序结构清晰易懂,所以本文给出函数递归的方法来实现区域生长只是提供一个思路,如果待处理的连通区域像素个数很多,调用fsrRegiongrow1函数就可以了!fsrRegiongrow1函数模块是在堆上创建栈数组模拟栈的先进后出思想来实现的,可以快速的实现区域生长。

四、实验结果

区域生长算法(附MATLAB代码实现)的更多相关文章

  1. 拉丁超立方体初始化种群(附Matlab代码)

    拉丁超立方体初始化种群 1.引言 群智能算法一般以随机方式产生初始化种群的位置,但是这种方式可能导致种群内个体分布不均匀.拉丁超立方体抽样方法产生的初始种群位置,可以保证全空间填充和抽样非重叠,从而使 ...

  2. 常见排序算法(附java代码)

    常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...

  3. 【K-means算法】matlab代码实例学习

    1. MATLAB函数Kmeans 使用方法:Idx=Kmeans(X,K)[Idx,C]=Kmeans(X,K) [Idx,C,sumD]=Kmeans(X,K) [Idx,C,sumD,D]=Km ...

  4. 区域生长算法 全局分类 C++ & matlab

    // 注:本内容为作者原创,禁止在其他网站复述内容以及用于商业盈利,如需引用,请标明出处:https://www.cnblogs.com/lv-anchoret/ 今天我们来介绍用C++算法如何来实现 ...

  5. 自动曝光修复算法 附完整C代码

    众所周知, 图像方面的3A算法有: AF自动对焦(Automatic Focus)自动对焦即调节摄像头焦距自动得到清晰的图像的过程 AE自动曝光(Automatic Exposure)自动曝光的是为了 ...

  6. 基于傅里叶变换的音频重采样算法 (附完整c代码)

    前面有提到音频采样算法: WebRTC 音频采样算法 附完整C++示例代码 简洁明了的插值音频重采样算法例子 (附完整C代码) 近段时间有不少朋友给我写过邮件,说了一些他们使用的情况和问题. 坦白讲, ...

  7. 一个例子"入坑"布谷鸟算法(附完整py代码)

    布谷鸟是比较新的启发式最优化算法,但其与传统的遗传算法,退火算法等相比,被证明收敛速度更快,计算效率更高! 文章目录 本文诞生的缘由 布谷鸟算法思想简介 更新位置的方式 莱维飞行 局部随机行走 抛出个 ...

  8. 【年终分享】彩票数据预测算法(一):离散型马尔可夫链模型实现【附C#代码】

    原文:[年终分享]彩票数据预测算法(一):离散型马尔可夫链模型实现[附C#代码] 前言:彩票是一个坑,千万不要往里面跳.任何预测彩票的方法都不可能100%,都只能说比你盲目去买要多那么一些机会而已. ...

  9. 图片文档倾斜矫正算法 附完整c代码

    2年前在学习图像算法的时候看到一个文档倾斜矫正的算法. 也就是说能将一些文档图像进行旋转矫正, 当然这个算法一般用于一些文档扫描软件做后处理 或者用于ocr 文字识别做前处理. 相关的关键词: 抗倾斜 ...

随机推荐

  1. $_SERVER 相关变量

    PHP编程中经常需要用到一些服务器的一些资料,特把$_SERVER的详细参数整理下,方便以后使用. $_SERVER['PHP_SELF'] #当前正在执行脚本的文件名,与 document root ...

  2. css之四大类选择器

    一.选择器: 关于组合选择器之间的区别: 后代选择器(A B)与子选择器(A>B)之间的区别: 后代选择器: 子选择器: 总结:后代选择器的作用范围是一个元素里面包含的所有元素,即包括的是所有的 ...

  3. SQLite介绍、学习笔记、性能测试

    SQLite介绍.学习笔记.性能测试 哪些人,哪些公司或软件在用SQLite: Nokia's Symbian,Mozilla,Abobe,Google,阿里旺旺,飞信,Chrome,FireFox可 ...

  4. 剑指offer系列36----二叉搜索树的第k个节点

    [题目]给定一颗二叉搜索树,请找出其中的第k大的结点. * 例如, 5 * / \ * 3 7 * / \ / \ * 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4. 中序遍历:2 3 4 ...

  5. bzoj1201: [HNOI2005]数三角形

    Description Input 大三角形的所有短边可以看成由(n+1)*n/2个单位三角形的边界组成.如下图的灰色三角形所示.其中第1排有1个灰色三角形,第2排有2个灰色三角形,……,第n排有n个 ...

  6. Configure Puppet Master with Passenger and Apache on Centos

    What is Passenger? Passenger (AKA mod_rails or mod_rack) is an Apache 2.x module which lets you run ...

  7. .NET常用方法——邮件发送

    邮件发送类文件,可直接使用: 调用方法(实例化.静态调用): 实例化: string exception = ""; SendEmail.SendEmail SE = new Se ...

  8. [系统集成] Android 自动构建系统

    一.简介 android app 自动构建服务器用于自动下载app代码.自动打包.发布,要建立这样的服务器,关键要解决以下几个问题: 1. android app 自动化打包android 的打包一般 ...

  9. TMDS协议

    1 概述 1.1    连接结构 图1 TMDS连接结构 数据流中包含了像素和控制数据,发送器在任何给定的输入时钟周期,到底是编码像素数据还是控制数据取决于数据使能信号DE,DE有效时,指示像素数 据 ...

  10. memcached简介(转)

     背景 memcached是一个高性能.分布式的内存对象缓存系统.    memcached广泛应用在大负载高并发的网站上,是一种非常成熟的产品(称为一项技术也未尝不可).像facebook,yout ...