[转]matlab队列实现区域填充

区域生长算法 图像分割是一种重要的图像处理技术,而区域生长是图像分割技术的一种。区域生长的基本思想是将具有相似性的像素集合起来构成区域。首先对每个需要分割的区域找出一个种子像素作为生长的七点,然后将种子像素周围邻域中与种子有相同或相似性质的像素(根据事先确定的生长或相似准则来确定)合并到种子像素所在的区域中。而新的像素继续作为种子向四周生长,直到再没有满足条件的像素可以包括进来,一个区域就生长而成了。 阅读详情

其实写过一步法二值图像连通区域标记之后我就感觉这个标记和填充基本上是一回事,所以我这里就用了一步法的那个队列算法。也没什么好说的,算法几乎一样,就是细节的区别。还有这里使用了ginput函数。至于堆栈版的实现,看情况吧。

复制代码
clear all;
close all;
clc;

img=imread('liantong.bmp');
img=img>128;
img=mat2gray(img);
imshow(img);

[m n]=size(img);
[x y]=ginput();
x=round(x);
y=round(y);

tmp=ones(m,n);
queue_head=1;       %队列头
queue_tail=1;       %队列尾
neighbour=[-1 -1;-1 0;-1 1;0 -1;0 1;1 -1;1 0;1 1];  %和当前像素坐标相加得到八个邻域坐标
%neighbour=[-1 0;1 0;0 1;0 -1];     %四邻域用的
q{queue_tail}=[y x];
queue_tail=queue_tail+1;
[ser1 ser2]=size(neighbour);

while queue_head~=queue_tail
    pix=q{queue_head};
    for i=1:ser1
        pix1=pix+neighbour(i,:);
        if pix1(1)>=1 && pix1(2)>=1 &&pix1(1)<=m && pix1(2)<=n
            if img(pix1(1),pix1(2))==1 
                img(pix1(1),pix1(2))=0;
                q{queue_tail}=[pix1(1) pix1(2)];
                queue_tail=queue_tail+1;

            end      
        end
    end

    queue_head=queue_head+1;
end

figure(1);
imshow(mat2gray(img));
复制代码

效果图:

原图

下面是不同的填充效果:

参考:

维基百科

一个不错的C实现

【投影条纹三维重建】如何把图片中的无效区域去除/赋为NaN 1、计算出图片各点处的幅,判断小于一个数,进行赋处理 问题: 筛选的数大了物体有缺失,小了有无效点 2、圈出物体边界,将边界外的剔除 matlab提取多边形区域_[载]【matlab中地图边界与掩膜(去掉边界外区域)的实现 matlab练习程序(区域填充算法,队列版) ... 阅读详情

相关推荐

Flood Fill算法详解及MATLAB实现

在主函数中,我们首先获取输入图像的行数和列数,并将目标颜色和边界颜色换为双精度类型。然后,通过检查种子点的位置和颜色,确保种子点在图像范围内且种子点的颜色与目标颜色不同。的函数,接受输入图像、种子点、目标颜色和边界颜色,并返回填充后的图像。在主循环中,从栈中取出一个像素点,检查其颜色是否与种子点的颜色相同,如果是,则将其颜色设置为目标颜色,并将其相邻的满足条件的像素点加入栈中。中取出一个像素点,检查其颜色是否与种子点的颜色相同。如果相同,则将其颜色设置为目标颜色,并将其相邻且满足条件的像素点加入。

YOLOv3333的博客 457

MATLAB提取候选区域并对连通区域进行操作

以下代码详细注释了使用MATLAB根据颜色信息提取候选区域,以及对连通区域进行一系列操作。 clear all;clc; %%提取候选区域 img = imread('1.png'); % 读取图像 figure; subplot(231); imshow(img); % 展示图像 title('原图'); % 将图像到hsv空间 img_hsv = rgb2hsv(img);...

RF~or的博客 5383

MATLAB实现填充圆与麦田圈区域的GUI开发

圆可以使用数学公式来定义,例如:- 参数方程:其中,(h, k)是圆心坐标,r是圆的半径。

weixin_29025501的博客 1070

MATLAB绘制平面填充图入门详解

在画图的时候,为了让图形更加清晰突出,往往需要对某一条或几条曲线围成的区域进行填冲颜色,以得到填充图。对于平面图形的填充,可以matlab的命令fill和area等实现

sunnyoldboy博客 3万+

matlab函数_连通区域

matlab函数_连通区域1、 matlab函数bwareaopen──删除小面积对象<br /><br /><br />格式:BW2 = bwareaopen(BW,P,conn)<br />作用:删除图像BW中面积小于P的对象,默认情况下使用8邻域。<br />算法:<br />(1)Determine the connected components.<br />L = bwlabeln(BW, conn);<br />(2)Compute the area of each component.<

cwqcgx的专栏 9141

Matlab实现支持代码生成的栈和队列数据结构

matlab没有内置的队列和栈数据结构,本文介绍一种使用Matlba函数和coder.varsize实现存储结构体的队列和栈方法,支持代码生成成C语言或mex。%CREATEVT 预创建结构体,方便代码生成% 此处显示详细说明vt=struct;vt.x=0;vt.y=0;vt.z=0;end。

anbuqi的博客 1581

matlab练习程序(区域填充算法,队列版)

  其实写过一步法图像连通区域标记之后我就感觉这个标记和填充基本上是一回事,所以我这里就用了一步法的那个队列算法。也没什么好说的,算法几乎一样,就是细节的区别。还有这里使用了ginput函数。至于堆栈版的实现,看情况吧。 clear all; close all; clc; img=imread('liantong.bmp'); img=img>128; img=ma...

weixin_33850890的博客 1807

MATLAB三维区域填充算法开发实战:FloodFill3D实现与应用

根据应用需求,常用邻接模式包括:6-邻接:仅面相邻(±1 in one axis)18-邻接:面+边相邻26-邻接:包含角相邻,确保最大连通性边界判断需满足坐标合法性:$0 \leq x < X,\ 0 \leq y < Y,\ 0 \leq z < Z$。函数的输入设计直接影响其通用性和易用性。

weixin_42502040的博客 547

matlab中种子填充算法

因为作业要求用简单种子填充和线扫描填充,所以在网上找了一个用matlab写的简单种子填充算法。https://www.cnblogs.com/tiandsp/archive/2012/12/06/2806186.html#undefined以下是具体程序:clear all;close all;clc;img=imread('liantong.bmp');img=img&gt;128;img=ma...

cunshang_chun_shu的博客 5460

Matlab中基于区域生长的肝影像分割系统

然后将这些新像素当作新的生长点,继续上面的操作,一直重复此过程,直到没有满足条件的像素可被包括进来,此时就表示生长点已经不能生长,这样一个区域就生长成了。然后将这些新像素当作新的生长点,继续上面的操作,一直重复此过程,直到没有满足条件的像素可被包括进来,此时就表示生长点已经不能生长,这样一个区域就生长成了。其基本思想是从一组生长点开始(生长点可以是单个像素,也可以是某个小区域),将与该生长点性质相似的相邻像素或者区域与生长点合并。区域生长:它是根据事先定义的准则将像素或者子区域聚合成更大区域的过程。

pVPkTAeVGPdZ的博客 202

Matlab基于区域生长的肝影像分割系统 区域生长:它是根据事先定义的准则将像素或者子区域聚合...

然后将这些新像素当作新的生长点,继续上面的操作,一直重复此过程,直到没有满足条件的像素可被包括进来,此时就表示生长点已经不能生长,这样一个区域就生长成了。然后将这些新像素当作新的生长点,继续上面的操作,一直重复此过程,直到没有满足条件的像素可被包括进来,此时就表示生长点已经不能生长,这样一个区域就生长成了。其基本思想是从一组生长点开始(生长点可以是单个像素,也可以是某个小区域),将与该生长点性质相似的相邻像素或者区域与生长点合并。区域生长:它是根据事先定义的准则将像素或者子区域聚合成更大区域的过程。

vQAvXEsg的博客 266

C/C++实现matlab的imfill()函数

matlab移植C/C++代码时,发现不管是opencv还是IPP库都没有填充联通区域函数imfill(),于是只能自己动手了。 先展示一下imfill()函数的功能,如下图: 上图中,左图是一个图像,白色是手臂边缘像素为1,黑色区域像素为0,现在想将手臂填充1,用imfill()函数可以实现该功能,但C/C++代码需要自己实现。 C/C++代码: bool imFill(Ipp8u *img, int width, int height) { vector<int> q; int

weixin_42615026的博客 2793

Atitit Seed-Filling种子填充算法attilax总结

Atitit Seed-Filling种子填充算法attilax总结 种子填充的原理,4联通与8联通区域的选择。。 三个队列 waitProcessPixList tempPixList ProcessedPixList /atiplat_img/src/com/attilax/cca/SeedFillAlgo.java p...

weixin_30627341的博客 128

【OpenCV】漫水填充

漫水填充:也就是用一定颜色填充联通区域,通过设置可连通像素的上下限以及连通方式来达到不同的填充效果;漫水填充经常被用来标记或分离图像的一分以便对其进行进一步处理或分析,也可以用来从输入图像获取掩码区域,掩码会加速处理过程,或只处理掩码指定的像素点,操作的结果总是某个连续的区域。 种子填充算法 种子填充算法是从多边形区域的一点开始,由此出发找到区域内的所有像素。 种子填充算法采用的边界定...

weixin_30371469的博客 106

matlab 画图被覆盖,利用Matlab的数组运算解决残缺棋盘覆盖问题

利用Matlab的数组运算解决残缺棋盘覆盖问题姓名:易华龙学号:200431020149年级:2004级班级:测绘工程一班摘要:利用Matlab的数组运算解决覆盖问题关键词:残缺棋盘, 覆盖, 队列, 动态数组,Matlab1 概述问题是用三格板覆盖缺了一格的残缺棋盘,不能覆盖缺少的一格.棋盘的长宽为2的k次方.本程序是队列运用的典型实例.采用广度优先法探索剩余子棋盘,其中用队列来保存入口,并用M...

weixin_32652003的博客 1304

GUI编程之MATLAB入门详解(01)

MATLAB为用户构建应用程序提供了两个平台——GUIDE和App Designer。图形用户界面的设计是MATLAB的核心应用之一。当用户与计算机之间或用户与计算机程序之间进行交互操作时,舒服高效的用户接口功能则会对用户产生极大的吸引力。图形用户界面GUI则通过窗口、图标、按钮、菜单、文本等图形对象构成用户界面。

twg666的博客 2709

图像分割】用于图像分割的原始详细分水岭算法(Matlab代码实现

详细分水岭算法(Detailed Watershed Algorithm)是一种用于图像分割的经典算法,主要用于分割具有不同密度或灰度级别的图像中的对象。首先,将输入图像换为灰度图像,以便在单一通道上执行分割操作。通过计算图像的梯度,确定图像中的边缘和区域边界。通常使用梯度算子(如Sobel、Prewitt等)来计算图像的梯度。基于图像梯度,生成一组初始标记(markers)。这些标记通常表示可能的对象或区域的种子点。可以使用阈、梯度幅或手动选择标记来初始化。

weixin_46039719的博客 657
下一篇: int main(int argc, char*argv[])详解
zm_funxy
博客等级 码龄14年 0粉丝 0原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值