球体从图像中分离出来

时间:2017-02-04 07:47:58

标签: matlab image-processing opencv3.0

我需要从下面的图片中找到blob。Spheroids 主要问题是背景。背景没有均匀的强度。我在MATLAB中尝试了一些像阈值和边缘检测这样的东西,但无法找到更好的方法来分割出所有的球体。我需要提取blob,我需要找到每个blob的区域。有谁知道如何解决这种背景?

编辑(07/02/17): 正如Spektre所建议的那样,我在MATLAB中尝试了以下内容。

方法1:

img_original = imread('~/my_image.jpg'); %Read image
img_ch = single(img_original(:,:,2));    %Pick one channel( here its green)

g = fspecial('gaussian',200,100);        %Kernel matrix to make the img blurr
con_img = conv2(img_ch,g,'same');        %2D convolution, this wil make the img blurr

sub_img = (con_img - img_ch);            %Simple matrix subtraction

sub_img(sub_img <= 10) = 0;              %Thresholding
sub_img(sub_img ~= 0) = 1;

fil_sub = imfill(sub_img,'holes');       %Fill the regions
imgfilt = imfilter(fil_sub, ones(3));    %run filter using 3by3 matrx
imgfilt(imgfilt < 8) = 0;                %Reduce noisy pixels by thresholding
mfilt_img = (medfilt2(imgfilt));         %reduce unwanted pixels

img = img_ch;
img(mfilt_img ~= 0) = 255;
img2 = img_ch;
img2(img2 < 70) = 0;                     %Threshold for darker pixels which are left out from above methode.
img(img2 ==0) = 255;
disp_img = img_original(:,:,1);
disp_img(img ==255) = 255;
img_original(:,:,1) = disp_img;
figure, imshow(img_original)

我得到了细分,但我认为还不够好。这种方法在高强度背景下提供了良好的片段,即使我减小阈值,在较暗的背景中片段也不清楚,并且斑点中最亮的像素被排除。

方法2:

img_original = imread('~/cancer_cells/Snap-10234.jpg'); %Read image
img_ch = single(img_original(:,:,2));    %Pick one channel( here its green)
clear new_matcel cur_img matcel avg_matrx

s=3;                % Set size of the square window               
mat_img = img_ch;   % Working image channel
% resize the working matrix so that the dimensions matches
resize_img = resizem(mat_img,round(size(mat_img)/s)*s);

% convert matrix into small s x s matrix and save each in cells
window_c = ones(1,size(resize_img,1)/s) * s;
window_r = ones(1,size(resize_img,2)/s) * s;
mat_cel = mat2cell(resize_img,window_c,window_r);
new_matcel = cell(size(mat_cel));   % initialize new variable

% get the average value for each window and replace the actual by avg value
for i = 1:size(mat_cel,1)
    for j = 1:size(mat_cel,2)
        cur_img = mat_cel{i,j};
        avg_value = mean(mean(cur_img));
        new_matcel{i,j} = ones(s) * avg_value;
    end
end

avg_matrx = cell2mat(new_matcel);       % convert cells to matrix 

image_sub = (abs(resize_img - avg_matrx)); % take the absolute difference
image_sub(image_sub < 7) = 0;           % thresholding
image_sub(image_sub~=0) = 1;

image_sub = bwmorph(image_sub,'bridge');% fill gaps
image_sub = imfill(image_sub,'holes'); % fill the bounded regioons
% image_sub(image_sub == 1) = 255;
image_sub = resizem(image_sub,size(img_ch)); % resize to original size

disp_img = img_original(:,:,1);
disp_img(image_sub == 1) = 255;
img_original(:,:,1) = disp_img;
figure, imshow(img_original)

更好的分割图像:

img

细分中包含更亮的像素。感谢Spektre。

有没有办法改进上面的代码?或任何其他想法,以获得更精确的细分?

感谢。

0 个答案:

没有答案