先簡單描述一下問題:用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);
uj5u.com熱心網友回復:
matlab應該可以單步或設斷點除錯。轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/133315.html
標籤:圖形處理/算法
