Matlab图像处理--细胞目标计数

处理步骤

  • 一、图片预处理
    • 1.1 读取图片并二值化
    • 1.2 参数初始化
    • 1.3 去噪
    • 1.4 腐蚀
    • 1.5 联通区标号
  • 二、计数
  • 三、结果
  • 四、讨论

一、图片预处理

因为图片中有小的噪声,且存在目标重叠,故需对图片进行一些预处理。

1.1 读取图片并二值化

img = imread('4.png');
img = im2bw(img);

1.2 参数初始化

cell_min_size = 400;
noise_max_size = 200;
total_num = 0;

1.3 去噪

% 这里同时把噪声和边缘小于细胞大小60%过滤掉了
img = bwareaopen(img, 0.6 * img_max_size);

1.4 腐蚀

函数strel用法详见strel

% strel('disk', 3)用来生成卷积核
img_erode = imerode(img, strel('disk', 3));

1.5 联通区标号

img_label = bwlabel(img);
img_erode_label = bwlabel(img_erode);

二、计数

for i = 1:max(max(img_label))
    % 定位img_label(i),返回目标点按在矩阵中按列排序的位置
    current_cell_ind = find(img_label == i);
    % 原来在img_label(i)位置的元素在erode后的独立的label
    after_erode = unique(img_erode_label(current_cell_ind));
    % 消失的细胞,原来有label的地方现在变成了0
    if length(after_erode) == 1 && after_erode(1) == 0
        total_num = total_num + 1;
    % 细胞变小,但没有分裂
    elseif length(after_erode) == 2
        total_num = total_num + 1;
    % 大细胞发生分裂成length(after_erode)-1个小细胞
    elseif length(after_erode) > 2
        for label = 2:length(after_erode)
            label_ind = find(img_erode_label == after_erode(label));
            if length(label_ind) > 0.4 * cell_min_size
                total_num = total_num + 1;
            end
        end
    end
end
sprintf('the number of cells:%d', total_num)

三、结果

Matlab图像处理--细胞目标计数_第1张图片

四、讨论

这里只是以细胞计数为例,大家完全可以做适当修改将其应用到其他目标计数的问题中。

你可能感兴趣的:(Matlab图像处理)