Convhull() не дает желаемого результата.

Я хочу получить выпуклый корпус ладони с помощью функции convhull(). Я работаю над изображением, в котором есть только ладонь. Сначала я преобразовал его в бинарное изображение, а затем применил функцию convhull. Но это не дает мне желаемого результата. Пожалуйста, найдите ошибку в моем коде. Вот мой код:

thresh1 = 0;
thresh2 = 20;
image = imread('C:\Users\...\1_depth.png');
subplot(3,3,1)
imshow(image)
image_bin1 = (image < thresh2);
image_bin2 = (thresh1 < image);
image_bin = abs(image_bin2- image_bin1);
image_bin_filt = medfilt2(image_bin, [18,18]);
subplot(3,3,2)
imshow(imcomplement(image_bin_filt));

BW = im2bw(image_bin_filt, 0.5);
BW = imcomplement(BW);
subplot(3,3,3)
imshow(BW)
title('Binary Image of Hand');

BW2 = bwareaopen(BW, 1000);
subplot(3,3,4)
imshow(BW2)
[y,x] = find(BW2);
k = convhull(x,y);
subplot(3,3,5)
imshow(BW2,'InitialMagnification', 'fit')
hold on;
plot(x,y, 'b.')
plot(x(k), y(k), 'r', 'LineWidth', 2)
title('Objects Convex Hull');

% Find centroid.
labeledImage = bwlabel(BW2);
measurements = regionprops(labeledImage, 'Centroid', 'BoundingBox');
%xCentroid = measurements.Centroid(1);
% yCentroid = measurements.Centroid(2);
centroids = cat(1, measurements.Centroid);
subplot(3, 3, 6);
imshow(BW2);
title('Binary Image with Centroid Marked', 'FontSize', 12); 
hold on;
plot(centroids(:,1),centroids(:,2), 'b*')

% Crop the image and display it in a new figure.
boundingBox = measurements.BoundingBox;
croppedImage = imcrop(BW2, boundingBox);
% Get rid of tool bar and pulldown menus that are along top of figure.
%set(gcf, 'Toolbar', 'none', 'Menu', 'none');
subplot(3,3,7)
imshow(croppedImage, []);
title('Cropped Image', 'FontSize', 12, 'Interpreter', 'None');

% Again trying to plot the convex hull
CH_objects = bwconvhull(BW);
subplot(3,3,8)
imshow(CH_objects);
title('Objects Convex Hull');

[r,c]=find(CH_objects);
CH=convhull(r,c);
subplot(3,3,9)
imshow(CH_objects)
hold on;
plot(r(CH),c(CH),'*-');

Вот результат кода, который я получаю: https://ibb.co/gLZ555 Но это не так. желаемый результат. Выпуклая оболочка не подходит, она должна включать только ладонь, а не свободное пространство. Кроме того, я получаю два центроида вместо одного. Почему это так? Входное изображение, которое я использовал: https://ibb.co/hk28Q5

Я хочу рассчитать выпуклый корпус ладони, содержащий только ладонь, а затем хочу вычислить центр тяжести ладони. Это будет полезно для определения формы ладони.

Пожалуйста, ответьте с решением для желаемого результата.


person Prachi    schedule 29.06.2017    source источник


Ответы (2)


Вы имеете в виду, что изображение должно содержать только ладонь с белыми пикселями, а не с черными пикселями. Если это так, вам нужно обрезать изображение, учитывая наибольшую область блоба, извлеченную с помощью «regionprops». Затем примените выпуклую оболочку только к этому.

person abhi    schedule 29.06.2017

Я только что добавил этот фрагмент кода перед применением convhull(), и это решило мою проблему.

roi = regionprops(BW2, 'Area');
BW2 = bwareafilt(BW2,1);
subplot(3,3,5)
imshow(BW2)
person Prachi    schedule 29.06.2017