Избавляемся от пятен вдоль хвоста сперматозоида - PullRequest
0 голосов
/ 04 октября 2018

figure.1

Я пытаюсь получить границу сперматозоида, край которого должен быть гладким.Тем не менее, есть небольшой пузырь вдоль хвоста.Интересно, есть ли способ, которым я могу удалить их и получить сперму с гладкой границей?Прикрепите фигуру и некоторый код (MATLAB), который я выполняю.

I = imread('asd3.png');
gray = rgb2gray(I);
I = adapthisteq(gray);
[counts,~] = imhist(I,6);
T = otsuthresh(counts);
BW = imbinarize(I,T);
BW2 = bwareaopen(~BW,300);
imshow(BW)
figure
subplot(221),imshow(original)
subplot(222),imshow(gray)
subplot(223),imshow(BW)
subplot(224),imshow(BW2)

Я получу фигуру в виде:

figure.2

Могу ли я улучшитьцифра к следующему?

figure.3

1 Ответ

0 голосов
/ 06 октября 2018

Основная проблема в том, что шум имеет довольно большую массу.Чтобы удалить эту массу, я использовал скелетное изображение:

BW = bwmorph(BW,'skel',inf);

, которое даст вам сперматозоид в виде древовидной структуры, позвоночник теперь является самым длинным связным путем в этом дереве.Чтобы найти это, я использую функцию Бретта Шоелсона, которую вы можете найти здесь (или вы можете сделать свою собственную).Я считаю, что для того, чтобы сделать определение самой длинной линии немного более надежным, хорошо сначала немного сгущать все.Таким образом, мы получаем

I = imread('sperm.png');
BW1 = ~imbinarize(rgb2gray(I)); %Make the spermcell "true"

%Find backbone
BW2 = bwmorph(BW1,'thicken',5);
[BW3,~] = longestConstrainedPath(BW2,'thinOpt','Skel');

Теперь нам просто нужно перестроить сперматозоид вокруг этого позвоночника, голову легко найти с помощью морфологического открытия

head = imopen(BW1,strel('disk',10,0));

и хвост найденпутем расширения позвоночника

%Thicken backbone
stats = regionprops(BW1-head,'Area');
area = stats.Area;
len = sum(BW3(:));
stem = imdilate(BW3,strel('disk',floor(0.5*area/(2*len)),0));

, где величина расширения представляет собой толщину исходного хвоста, которая может быть аппроксимирована площадью хвоста, деленной на длину.Хотя из-за артефактов это слишком густо, я посчитал, что половина области - это хвост, а другая половина - артефакты.

Поскольку у нас есть голова и хвост, общую ячейку можно найти, сложив их и инвертировав.

sperm = ~(stem+head);

, что дает

Cleaned sperm-cell

ПРИМЕЧАНИЯ: Если вы хотите повысить точность

1) Самый длинный путь не совсем правильный путь, так как он выбирает неправильный конец, это можетбыть улучшенным, удаляя шпоры.

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

...