n=50;
m=50;
k=20;%執行次數
z=zeros(n,m);
ve=z;
number=37;
r=z; %r爲邊界 初始化
r([5,45],:)=1;%邊界值爲1
r(:,[5,45])=1;
ve=r;%veg此時爲邊界(值均爲1)加一個值爲37的點
ve(25,25)=37;
for i=1:k
X=find(ve==1);%尋找邊界的序號 保存在X 因爲靠近值爲37的邊界會被更新爲37 所以需要還原 每次擴散步長爲1 所以不會越出邊界
ve=number*((ve(1:n,[m 1:m-1])==number)|(ve(1:n,[2:m 1])==number)| ...
(ve([n 1:n-1], 1:m)==number)|(ve([2:n 1],1:m)==number)|(ve(:,:)==number)+z);%(A|B|C|D)括號裏面命題ABCD用邏輯詞|連接會將矩陣ve轉換爲邏輯矩陣(只能賦值爲0或1)
%所以可以與0矩陣運算一下變爲double矩陣
ve(X)=1; %還原邊界值
end
image(cat(3,ve,z,z));
若用for循環 不能產生理想的效果 原因是每一個值更新後 會影響與它靠近的下一個元素
而邏輯運算利用的數據是默認不變的 然後一次性全部更新
此方法可對區域內部所有點賦值編爲相同號 從而方便判斷某點處於哪個區域
具體操作可先用ginput()獲得邊界內部一點值 然後賦值爲區域編號 調用上述方法即可
%%%%參數
n=50;
m=50;
k=20;%執行次數
number=10;
%%%%初始化
z=zeros(n,m);
ve=z;
S=z;%總集合
r=z; %r爲邊界 初始化
r([5,45],:)=1;%邊界值爲1
r(:,[5,45])=1;
ve=r;%veg此時爲邊界(值均爲1)
XX=find(ve==1);%尋找邊界的序號 保存在X 因爲靠近值爲37的邊界會被更新爲37 所以需要還原 每次擴散步長爲1 所以不會越出邊界
S(XX)=1;%S是總集合 這一步將邊界包括入內
image(cat(3,S,ve,z));
for kase=1:6
number=number+1;
[Y,X]=ginput(1);
ve(ceil(X),ceil(Y))=number;
for i=1:k
ve=number*((ve(1:n,[m 1:m-1])==number)|(ve(1:n,[2:m 1])==number)| ...
(ve([n 1:n-1], 1:m)==number)|(ve([2:n 1],1:m)==number)|(ve(:,:)==number)+z);%(A|B|C|D)括號裏面命題ABCD用邏輯詞|連接會將矩陣ve轉換爲邏輯矩陣(只能賦值爲0或1)
%所以可以與0矩陣運算一下變爲double矩陣
ve(XX)=1; %還原邊界值
end
N=find(ve==number);%
S(N)=number;%將新結果併入S
image(cat(3,S,ve,z));
end