Matlab 练习:细胞计数(imfill&open&erosion的综合应用)

Matlab 练习:细胞计数(imfill&open&erosion的综合应用)_第1张图片

最近做到导师发的一个题,要对这个图像作细胞计数。图片的下载链接放在下面了,不需要消耗积分的哦。

Matlab练习:细胞计数(imfill&open&erosion的综合应用)所需的素材图片-图像处理文档类资源-CSDN下载

开始想的是犯懒,就想直接用label出个结果交上去。

clear, clc, close all%清空已有窗口,变量等
I=rgb2gray(imread('CW1 Cells.jpg'));%读取并转换为灰度图像
BW=imbinarize(I,graythresh(I));%转换为二值图像
BW1=imcomplement(BW);%翻转黑白
[L,n]=bwlabel(BW1)%标签化并计算个数
figure, imagesc(L),title('Labeling');

Matlab 练习:细胞计数(imfill&open&erosion的综合应用)_第2张图片

其实结果看着还行,83与肉眼观察的差不多,不过老师认为有的细胞还连接着,还有一些噪点,让我做得再细一点。下面是全代码:

clear;clc;close all;%清空已有窗口,变量等
I=rgb2gray(imread('CW1 Cells.jpg'));%读取并转换为灰度图像
figure,imshow(I),title('Gray Level Image');
BW=imbinarize(I,graythresh(I));%转换为二值图像
figure,imshow(BW),title('Binary Image');
BW1=imcomplement(BW);%翻转黑白
figure,imshow(BW1),title('change the black and white');
BW2=imfill(BW1,'holes');%填补黑色洞
figure,imshow(BW2),title('Filling Image');
se1=strel('disk',14);
BW3=imopen(BW2,se1);%初步开运算减少白色区域
figure,imshow(BW3),title('Open Image');
BW4=BW2-BW3;%对比开运算前后图像,找出被删除的细胞
figure,imshow(BW4),title('Difference Image');
se2=strel('disk',6);
BW5=imopen(BW4,se2);%开运算对比后图像,消除因细胞大小改变产生的细胞轮廓
figure,imshow(BW5),title('Final Difference Image');
se2=strel('disk',10);
BW7=imerode(BW3,se2);%对图像进行彻底但不消失细胞的侵蚀,使细胞不再连接
figure,imshow(BW7),title('Erode Image');
BW8=BW5+BW7;%与此前消失的细胞的图像合并,恢复他们
figure,imshow(BW8),title('Combined Image');
[L,n]=bwlabel(BW8)%标签化并计算个数
figure,imagesc(L),title('Labeling');
clear;clc;close all;%清空已有窗口,变量等
I=rgb2gray(imread('CW1 Cells.jpg'));%读取并转换为灰度图像
figure,imshow(I),title('Gray Level Image');

首先,这个程序要产生不少图片,加个清空是有必要的。二三行是对这个细胞图像进行读取并转化为灰度图像。

Matlab 练习:细胞计数(imfill&open&erosion的综合应用)_第3张图片

BW=imbinarize(I,graythresh(I));%转换为二值图像
figure,imshow(BW),title('Binary Image');

现在我们将图像更改为二值图像并显示它。那是因为我们之后会进行侵蚀和膨胀。但是细胞里有太多的洞了。这些孔是细胞的透明部分。孔可能会影响我们对细胞的处理方法,所以我们应该填充它们。

Matlab 练习:细胞计数(imfill&open&erosion的综合应用)_第4张图片

BW1=imcomplement(BW);%翻转黑白
figure,imshow(BW1),title('change the black and white');

首先,我逆转了黑白。如果我们对原始的二值图像进行填充,我们将填充许多细胞。现在我们可以看到在这些细胞中有很多黑点。

Matlab 练习:细胞计数(imfill&open&erosion的综合应用)_第5张图片

BW2=imfill(BW1,'holes');%填补黑色洞
figure,imshow(BW2),title('Filling Image');

然后我使用“imfill”函数来填补这些洞。这个函数可以填充位于白色区域的黑洞。但是边缘上的一些点并没有被破坏。也许这些点并没有被白色的区域所包围。

Matlab 练习:细胞计数(imfill&open&erosion的综合应用)_第6张图片

se1=strel('disk',14);
BW3=imopen(BW2,se1);%初步开运算减少白色区域
figure,imshow(BW3),title('Open Image');

在这一步中,我做了开运算,以减少这些细胞的连接。开运算是指侵蚀后再膨胀的复合操作。这种方法可以分离出那些没有紧密连接的细胞。同时,噪点也被清理干净。我们可以发现仍有许多细胞在连接。但是我们不能使disk更大。如果我们这样做,一些细胞将会变形,其他细胞可能会消失。事实上,这个开放的操作已经摧毁了一些细胞,我们应该恢复它们。

Matlab 练习:细胞计数(imfill&open&erosion的综合应用)_第7张图片

BW4=BW2-BW3;%对比开运算前后图像,找出被删除的细胞
figure,imshow(BW4),title('Difference Image');

在“Open image”和“Filling image”之间进行减法。我们可以知道开运算减少了多少白色面积。白色的折线是被开运算切断的细胞的轮廓。角落和边缘的细胞也被开运算切断。

Matlab 练习:细胞计数(imfill&open&erosion的综合应用)_第8张图片

se2=strel('disk',6);
BW5=imopen(BW4,se2);%开运算对比后图像,消除因细胞大小改变产生的细胞轮廓
figure,imshow(BW5),title('Final Difference Image');

这一步的目标是消除这些细胞的轮廓,并保持通过减法恢复的细胞的完整。我设置了一个更小的disk,并对“Difference image”做了开运算。所以我得到了这个完美的图像。此图像在下面的步骤中将会很有用。

Matlab 练习:细胞计数(imfill&open&erosion的综合应用)_第9张图片

se2=strel('disk',10);
BW7=imerode(BW3,se2);%对图像进行彻底但不消失细胞的侵蚀,使细胞不再连接
figure,imshow(BW7),title('Erode Image');

这个步骤我设置一个比较大的disk,并对之前的那个“Open image”做侵蚀运算。我对这个步骤有两个要求。首先,彻底分离细胞。接下来,不要使任何细胞消失。所以经过多次尝试,我得到了disk是“10”。现在,“Erode image”中的细胞都是独立的。

BW8=BW5+BW7;%与此前消失的细胞的图像合并,恢复他们
figure,imshow(BW8),title('Combined Image');

 因为在最后一步中,我们没有让细胞消失,所以没有必要做减法。在这一步中,我们将对“Erode image”和“Final Difference image”进行加法运算。现在,由于开运算而丢失的细胞将返回到图像中。我们几乎可以看到所有的细胞,而且它们都是独立的。Matlab 练习:细胞计数(imfill&open&erosion的综合应用)_第10张图片

[L,n]=bwlabel(BW8)%标签化并计算个数
figure,imagesc(L),title('Labeling');

最后一步,我们将标记这些细胞。在第一行的末尾,我不添加分号从而得到得到细胞个数的和。

Matlab 练习:细胞计数(imfill&open&erosion的综合应用)_第11张图片

 最后,我们得到了答案“89”和一个“Labeling image”。

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