Вот моя попытка. Код является грубым, но это общая идея о том, как вы можете использовать границу и подписанную кривизну, чтобы найти две точки, которые отделяют «верхнюю часть грибов» от остальной части тела, а затем используют предикат поворота, чтобы определить точки интерес.
clear; clc;
binary_img = imread('bin.jpg') > 100;
% Get boundaries
b = bwboundaries(binary_img);
% Get largest boundary
b = b{cellfun(@length,b) == max(cellfun(@length,b))};
% Filter boundary - use circular convolution
b(:,1) = cconv(b(:,1),fspecial('gaussian',[1 81],40)',size(b,1));
b(:,2) = cconv(b(:,2),fspecial('gaussian',[1 81],40)',size(b,1));
% Find curvature
curv_vec = zeros(length(b),1);
for i = 0:size(b,1)-1
p_b = b(mod(i-25,length(b))+1,:); % p_b = point before
p_m = b(mod(i,length(b))+1,:); % p_m = point middle
p_a = b(mod(i+25,length(b))+1,:); % p_a = point after
dx_ds = p_a(1)-p_m(1); % First derivative
dy_ds = p_a(2)-p_m(2); % First derivative
ddx_ds = p_a(1)-2*p_m(1)+p_b(1); % Second derivative
ddy_ds = p_a(2)-2*p_m(2)+p_b(2); % Second derivative
curv_vec(i+1) = dx_ds*ddy_ds-dy_ds*ddx_ds;
end
% Find local maxima for curvature
[pks,locs] = findpeaks(curv_vec);
[pks,pks_idx] = sort(pks);
% Select two largest curvatures
p1_max = b(curv_vec == pks(end),:);
p2_max = b(curv_vec == pks(end-1),:);
% Paint biggest contiguous region
rp = regionprops(binary_img,'Area','PixelIdxList','PixelList');
rp = rp(max(vertcat(rp.Area)) == vertcat(rp.Area));
% Paint all points to the left of the line
img = zeros(size(binary_img));
img(rp.PixelIdxList) = 0.5;
for i = 1:length(rp.PixelList)
turn = sign(det([1 p1_max(1) p1_max(2);
1 p2_max(1) p2_max(2);
1 rp.PixelList(i,2) rp.PixelList(i,1);]));
if (turn > 0)
img(rp.PixelList(i,2),rp.PixelList(i,1)) = 1;
end
end
figure(1);
subplot(1,3,1);
plot(b(:,1), b(:,2),'o');
hold on;
plot(p1_max(1), p1_max(2),'ro','Markersize',5,'LineWidth', 5);
plot(p2_max(1), p2_max(2),'ro','Markersize',5,'LineWidth', 5);
subplot(1,3,2);
plot(curv_vec);
subplot(1,3,3);
imshow(img);
Используя это изображение:

Выход:

Посмотрите [Matlab Image Processing Toolbox] (http://uk.mathworks.com/products/image/index.html?s_tid=gn_loc_drop). – Miki
Если у вас есть Image Processing Toolbox, вам должно быть легко найти края, так как у вас уже есть хорошая маска, просто используйте edge(). http://uk.mathworks.com/help/images/ref/edge.html Прежде чем вы сможете продолжить разговор, вам, вероятно, придется связать точки, найденные с помощью edge(), используя элемент структурирования. См. Http://uk.mathworks.com/help/images/examples/detecting-a-cell-using-image-segmentation.html. Интересным для вас является, вероятно, только шаг 6. – lhcgeneva