Мне нужно сегментировать некоторые ячейки изображений культур клеток, и у меня есть некоторые проблемы с некоторыми фоновыми областями, ошибочно классифицированными как передний план.
У меня есть некоторые хорошие результаты, используя функцию imbothat
matlab для вычитания фона (таммного равномерного освещения), а затем gmm
для классификации в 2 областях (фон против ячеек).
Однако imbothat
делает некоторые фоновые пиксели очень похожими на области ячеек, а затем gmm
(бинаризацияпорог может сильно отличаться для разных изображений, и я не хочу субъективно выбирать его) выполняет неверную классификацию.
У кого-нибудь есть идеи, как решить эту проблему?
Я пробовалдобавление некоторых дополнительных данных к gmm
(кроме Igraywobvd
), таких как stdfilts
или entropyfilts
, без улучшения результатов.
Если я уменьшу strel
до 20 (илименьше) эти "проблемные" фоновые области не очень выделены, но я теряю много областей ячеек ...
Это оригинальное изображение:
Это последовательность, которую я получаю (указывая неправильные классифицированные регионы):
https://ibb.co/X8KY98V
Мой код Matlab ниже:
for jpg_file=1:length(jpgsinfolder)
I=original_images{jpg_file}; %figure; imshow(original)
Igray=rgb2gray(I); %figure; imshow(Igray)
%Substract background
Igraywob=imbothat(imadjust(Igray), strel('disk',50)); %figure;
imshow(Igraywob)
%GMM
%Convert input images to double vectors and generate the dataset
Igraywobvd=double(Igraywob(:));
%Add data to the final dataset
gmm_dataset=horzcat(Igraywobvd);
%GMM
opt = statset('MaxIter',15000,'TolFun',1e-6);
gmm =fitgmdist(gmm_dataset,2,'Options',opt,'CovType','diagonal','RegularizationValue',0.01);
%----Probability of our pixels to belong to the fitted distributions
prob = gmm.posterior(gmm_dataset);
%------save labels of the major probability
[val, labels_gmm] = max(prob,[],2);
%Reshape vector with the original image size
labels_gmm=reshape(labels_gmm,size(Igray,1),size(Igray,2)); %figure;
imagesc(labels_gmm2)
%Chose the labels with highest intensity (corresponding to the cells)
med1=mean2(Igray(labels_gmm==1));
med2=mean2(Igray(labels_gmm==2));
if med1>med2
labels_gmm(labels_gmm==1)=0;
labels_gmm(labels_gmm==2)=1;
else
labels_gmm(labels_gmm==1)=1;
labels_gmm(labels_gmm==2)=0;
end
%Binarization
labels_gmm_bin=labels_gmm>0; %figure; imshow(labels_gmm)
%Delete small objects (artifacts)
labels_gmm_op=bwareaopen(labels_gmm_bin, 500); %figure; imshow(labels_gmm_op)
%Close small holes inside the cells
cellmask=imclose(labels_gmm_op, strel('disk',1));
%Can see the final result:
cellmask_results = labeloverlay(Igray,cellmask,'Transparency',0.7);
figure(jpg_file); imshow(cellmask_results)
end