How to properly tesselate a image of cells using matlab?

喜夏-厌秋 提交于 2019-12-06 09:43:24

I don't know anything about cells or tessellation or whatever. But if you want to detect those blobs in a non uniform background, then I might help. You need to analyse the blobs individually because of the non uniform background. You can't just set a fixed threshold to detect all blobs at once. First, you will detect each blob individually and then use individual threshold. Here is the example

The original image

im=imread('gxGkH.jpg');
figure,imagesc(im);axis image;

I am choosing only the blue colour to analyse

imb=im(:,:,3);
figure,imagesc(imb);axis image;

1) Blur the image, since after blurring the blobs will have local maxima/minima at their centres

sigma=7;
kernel = fspecial('gaussian',4*sigma+1,sigma);
im2=imfilter(imb,kernel,'symmetric');

figure,imagesc(im2);axis image;

2) Use watershed transform to separate each blob region

% L = watershed(im2);
L = watershed(max(im2(:))-im2);
[x,y]=find(L==0);

Draw the boundaries

figure,imagesc(im2),axis image
hold on, plot(y,x,'r.')

3) Here I analyse each blob individually and find an otsu threshold for each blob, then I detect the blobs and combine all detections

tmp=zeros(size(imb));

for i=1:max(L(:))
  ind=find(L==i);
  mask=L==i;
  [thr,metric] =multithresh(imb(ind),1);
  if metric>0.7
    tmp(ind)=imb(ind)>thr;
  end
end

Remove some noise

tmp=imopen(tmp,strel('disk',1));
figure,imagesc(tmp),axis image

If the background has higher contrast then the blobs, then you won't need to invert the image in watershed transform.

I am not sure if this may get you closer to the solution of your problem, but what I would do would be something like this. Mind you, it's a really simple and naive approach:

image = imread('picture.tiff'); % load image
image = rgb2hsv(image); % convert to hsv colorspace
image = image(:,:,1); % take the hue channel

binary_im = imbinarize(image); % make binary image

The binary image should look like this:

Now you can use Mathematical Morphology to eliminate the noise. You first create a structuring element and then you convolve it with the binary image:

str_el = strel('disk', 5, 0); % create a round, 5px radius, str_el
closed_im = imclose(binary_im, str_el); % close image with str_el

Now your new image should look like this:

At this point you can use another morphological operation that finds the skeleton:

skeleton = bwmorph(closed_im, 'skel', Inf); % Find skeleton image

The skeleton image would look like this:

Of course this method is far from being precise, but may give you an overall information on the length of the filament, especially if you could get rid of the final noise (those appendices of the skeleton).

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!