مهم اینه که یک محدوده کاملا بسته داشته باشیم تا بتونید اون را پر کنیم
اون لبه دست که شما گذاشته بودید بعضی جا ها منافذی داشت که با عملیات مورفولوژیکی پر شد پایین دست هم باید بسته می شد
در شمن به جای اون حلقه میشه از دستور imfill استفاده کرد که داخل محدوده را پر کنه
غیر از این روش یک روش دیگه را می تونید استفاده کنید که لبه دست را با استفاده از گزینه Lindeberg از دستور edge به دست بیارید و تعداد زیادی خط ایجاد می شه که بلند ترین اونها لبه دست مورد نظره که با استفاده از bwconncomp و لیبل گذاری هر سگمنت میشه اون را استخراج و داخل اون را پر کرد
contourIm=imread('2.bmp')>100;
maskIm=contourIm;
kernel=[-1, -size(maskIm,1), 1, size(maskIm,1)];
maskIm=(bwmorph(bwmorph(maskIm,'bridge'),'spur'));
maskIm=(bwmorph(maskIm & bwmorph(maskIm==0,'majority'),'bridge'));
maskIm=(bwmorph(maskIm,'shrink'));
idx=find(maskIm-bwmorph(maskIm,'shrink'));
[p1r p1c]= ind2sub(size(maskIm),idx(1));
[p2r p2c]= ind2sub(size(maskIm),idx(2));
Length=max([abs(p2c-p1c) abs(p2r-p1r)])+2;
lr= round(linspace(p1r,p2r,Length));
lc= round(linspace(p1c,p2c,Length));
idx2=sub2ind(size(maskIm),lr,lc);
maskIm(idx2)=1;
list1=[sub2ind(size(maskIm),round(size(maskIm,1)/2),round(size(maskIm,2)/2))];
while numel(list1)>0
list2=[];
for L=1:numel(list1)
idxkernel=list1(L)+kernel;
idxfill=idxkernel(find(maskIm(idxkernel)==0));
maskIm(idxfill)=1;
list2=[list2 idxfill];
end
list1=list2;
end
imshow(maskIm);