求助各位大神~关于图像分割的区域生长算法的问题

qq_35425274 2016-06-25 10:41:54
先简单描述一下问题:用matlab标记以下两个部分(如图1)
我用的是区域生长的算法。当我选中左边区域中的任意一点时,程序运行成功(如图2)
可是当我选中右边区域的点时,程序运行错误,提示:??? Attempted to access neg_list(0,:); index must be a positive integer or logical.

Error in ==> Untitled1 at 92
neg_list(index,:) = neg_list(neg_pos,:);
然后我又选了其他的一个点,结果是图3
很惊讶。。。为什么图像右边的一部分没被处理呢
附上代码:
% Segment based on area, Region Growing;
clear all; close all; clc
[fileName,pathName] = uigetfile('*.*','Please select an image');%文件筐,选择文件
if(fileName)
fileName = strcat(pathName,fileName);
fileName = lower(fileName);%一致的小写字母形式
else
J = 0;%记录区域生长所分割得到的区域
msgbox('Please select an image');
return; %退出程序
end

I = imread(fileName);
if( ~( size(I,3)-3 ))
I = rgb2gray(I);%转化为单通道灰度图
end
I=im2double(I);

%种子点的交互式选择
if( exist('x','var') == 0 && exist('y','var') == 0)
figure,imshow(I,[]);
hold on;
[y,x] = getpts;%鼠标取点 回车确定
x = round(x(1));%选择种子点
y = round(y(1));
end

if( nargin == 0)
reg_maxdist = 0.1;
%nargin是matlab代码编写中常用的一个技巧,主要用于计算当前主函数的输入参数个
%数,一般可以根据nargin的返回值来确定主函数输入参数的缺省值。在实现中,如果
%用户输入的参数个数为零,那么默认为0.2
end
J = zeros(size(I)); % 主函数的返回值,记录区域生长所得到的区域
Isizes = size(I);
reg_mean = I(x,y);%表示分割好的区域内的平均值,初始化为种子点的灰度值
reg_size = 1;%分割的到的区域,初始化只有种子点一个
neg_free = 100000; %动态分配内存的时候每次申请的连续空间大小
neg_list = zeros(neg_free,3);
%定义邻域列表,并且预先分配用于储存待分析的像素点的坐标值和灰度值的空间,加速
%如果图像比较大,需要结合neg_free来实现matlab内存的动态分配
neg_pos = 0;%用于记录neg_list中的待分析的像素点的个数
pixdist = 0;
%记录最新像素点增加到分割区域后的距离测度
%下一次待分析的四个邻域像素点和当前种子点的距离
%如果当前坐标为(x,y)那么通过neigb我们可以得到其四个邻域像素的位置
neigb = [ -1 0;
1 0;
0 -1;
0 1];
%开始进行区域生长,当所有待分析的邻域像素点和已经分割好的区域像素点的灰度值距离
%大于reg_maxdis,区域生长结束
counter=0;
while (pixdist < 0.06 && reg_size <569491)
%增加新的邻域像素到neg_list中

for j=1:4
xn = x + neigb(j,1);
yn = y + neigb(j,2);
%检查邻域像素是否超过了图像的边界
ins = (xn>=1)&&(yn>=1)&&(xn<=Isizes(1))&&(yn<=Isizes(1));
%如果邻域像素在图像内部,并且尚未分割好;那么将它添加到邻域列表中
if( ins && J(xn,yn)==0)
neg_pos = neg_pos+1;
neg_list(neg_pos,:) =[ xn, yn, I(xn,yn)];%存储对应点的灰度值
J(xn,yn) = 1;%标注该邻域像素点已经被访问过 并不意味着,他在分割区域内
counter=counter+1;
end
end
%如果分配的内存空问不够,申请新的内存空间
if (neg_pos+10>neg_free)
neg_free = neg_free + 100000;
neg_list((neg_pos +1):neg_free,:) = 0;
end
%从所有待分析的像素点中选择一个像素点,该点的灰度值和已经分割好区域灰度均值的
%差的绝对值时所待分析像素中最小的
dist = abs(neg_list(1:neg_pos,3)-reg_mean);
[pixdist,index] = min(dist);
%计算区域的新的均值
reg_mean = (reg_mean * reg_size +neg_list(index,3))/(reg_size + 1);
reg_size = reg_size + 1;
%将旧的种子点标记为已经分割好的区域像素点
J(x,y)=2;%标志该像素点已经是分割好的像素点
x = neg_list(index,1);
y = neg_list(index,2);
% pause(0.0005);%动态绘制
% if(J(x,y)==2)
% plot(x,y,'r.');
% end
%将新的种子点从待分析的邻域像素列表中移除

neg_list(index,:) = neg_list(neg_pos,:);
neg_pos = neg_pos -1;
end
J = (J==2);%我们之前将分割好的像素点标记为2
hold off;
counter;
figure,imshow(I+J);
...全文
1474 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-06-27
  • 打赏
  • 举报
回复
matlab应该可以单步或设断点调试。

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧