Удаление фоновых и измерительных функций изображения в MATLAB

Я пытаюсь измерить площади каждой частицы, показанной на этом изображении:

enter image description here

мне удалось получить общую форму каждой частицы с помощью MSER, показанного здесь:

enter image description here

но у меня возникли проблемы с удалением фона. Я попытался использовать imfill MATLAB, но он не заполняет все частицы, потому что некоторые из них отрезаны по краям. Любые советы о том, как избавиться от фона или найти области частиц некоторые другие способ? Овации.

Edit: это то, что imfill выглядит так:

enter image description here

Edit 2: Вот код, используемый для получения контура. Я использовал этой для MSER.

%Compute region seeds and elliptial frames.
%MinDiversity = how similar to its parent MSER the region is
%MaxVariation = stability of the region
%BrightOnDark is used as the  void is primarily dark. It also prevents dark
%patches in the void being detected.
[r,f] = vl_mser(I,'MinDiversity',0.7,...
                'MaxVariation',0.2,...
                'Delta',10,...
                'BrightOnDark',1,'DarkOnBright',0) ;

%Plot region frames, but not used right now
%f = vl_ertr(f) ;
%vl_plotframe(f) ;

%Plot MSERs
M = zeros(size(I)) ; %M = no of overlapping extremal regions

for x=r'
 s = vl_erfill(I,x) ;
 M(s) = M(s) + 1;
end

%Display region boundaries
figure(1) ;
clf ; imagesc(I) ; hold on ; axis equal off; colormap gray ;

%Create contour plot using the values
%0:max(M(:))+.5 is the no of contour levels. Only level 0 is needed so 
%[0 0] is used.

[c,h]=contour(M,[0 0]) ;;
set(h,'color','r','linewidth',1) ;

%Retrieve the image data from the contour image
f = getframe;
I2 = f.cdata;

%Convert the image into binary; the red outlines are while while the rest
%is black.
I2 = all(bsxfun(@eq,I2,reshape([255 0 0],[1 1 3])),3);
I2 = imcrop(I2,[20 1 395 343]);

imshow(~I2);

1 ответов


предлагаемое решение / трюк и код

кажется, вы можете работать с M здесь. Один трюк, который вы можете использовать здесь, будет заключаться в заполнении нулей по всем границам изображения M и затем заполнить свои отверстия. Это позаботится о заполнении шариков, которые раньше касались границ, так как теперь не будет никакого шарика, касающегося границ из-за заполнения нулей.

таким образом, после M, вы можете добавить этот код -

%// Get a binary version of M
M_bw = im2bw(M);

%// Pad zeros all across the grayscale image
padlen = 2; %// length of zeros padding
M_pad = padarray(M_bw,[padlen padlen],0);

%// Fill the holes
M_pad_filled = imfill(M_pad,'holes');

%// Get the background mask after the holes are gone
background_mask = ~M_pad_filled(padlen+1:end-padlen,padlen+1:end-padlen);

%// Overlay the background mask on the original image to show that you have
%// a working background mask for use
I(background_mask) = 0;
figure,imshow(I)

результаты

входное изображение -

enter image description here

маска переднего плана (это будет ~background_mask) -

enter image description here

выходное изображение -

enter image description here