红细胞边缘检测
要求提取下列图片的边缘:
step1灰度拉伸。
灰度拉伸属于线性点运算的一种。灰度拉伸也称对比度拉伸,是一种简单的线性点运算。我的理解是可以增加图片的对比度。暗的更暗,亮的更亮。这一步相当于预处理,有利于下一步二值化处理。
step2二值化处理
通过在箭头处的红细胞边界上选点,可以确定图像边缘部分的灰度大小范围。例如箭头处一点的灰度大小为 126。经过反复参数调整,确定选择[125,50]范围内的像素点置为白色 255,其余为黑色 0。初步得到边缘。这个参数范围能够使后期细胞膜不出现不连续。
step3进行形态学运算
此时边缘具有一定的厚度,并且有些地方的边缘断开了。
① 进行 Imclose 运算:
对灰度图像执行形态学闭运算,即使用同样的结构元素先对图像进行膨胀操
作后进行腐蚀操作。
② 进行 skel 运算:
移除目标边界像素,但是不允许目标分隔开,保留下来的像素组合成图像的骨架。
step4设定边界
后面的 imfill 运算如果不在图像周围加上白色边界,使拍摄不完整的红细胞图形闭合,则无法填充这些细胞。而这些细胞会在第六步时被当作杂质删除掉。
这种情况下只能提取出拍摄完整的红细胞的边界。
step5填充孔洞
进行 imfill 运算,该函数用于填充图像区域和空洞。注意到这时也填充了很多明显不是红细胞的小圆。
step6筛选红细胞
为了删除图像中明显不是红细胞的小圆以及很多噪点,设定一定阈值,图形的半径小于一定阈值,则灰度全部转化为 0(黑色)。利用闭操作对图像进行图形元素的筛选。经调参,可以删除规格小于 1515 的图形,保留大于 1616 的图形。这时删除非红细胞的小圆效果最好。
step7canny 边缘检测
边缘检测主要是通过一些手段检测数字图像中明暗变化剧烈(即梯度变化比较大)像素点,偏向于图像中像素点的变化。如 canny 边缘检测,结果通常保存在和源图片一样尺寸和类型的边缘图中。
step8删除边界
删除第四步添加的白色边界,可以得到最终的轮廓图 。此时,拍摄完全的细胞轮廓提取较好。但同时也注意到,未拍摄完全的红细胞的边界出现了一定程度的失真。考虑可以调整第六步的算法,删除小圆,噪点的同时,不对红细胞的轮廓造成影响。
这道纳新题目大致经过一天多完成。虽然是小白一个,对算法完全不懂,但也经历了自己设计的成就感,处理出图像时的兴奋和快乐。完成了第一篇参考文章提出的展望部分。根据作者提出的思路,解决了其图像处理的杂质和双边缘的问题。
参考文献:课后作业——红细胞边缘检测
闭操作筛选图像区域
最后贴上matlab代码:
I=imread('C:\Users\Desktop\实验中心\1.bmp');
sigma = 1.6;
N = 20;
N_row = 2*N+1;
gausFilter = fspecial('gaussian',[N_row N_row],sigma);
I=imfilter(I,gausFilter,'conv');
figure;imshow(I)
I=imadjust(I,[50/255,150/255],[30/255,250/255]);%step1 灰度拉伸
figure;imshow(I);
Size=size(I);
for i=1:Size(1) %step2 二值化处理
for j=1:Size(2)
if I(i,j)<=125&&I(i,j)>=50
I(i,j)=255;
else
I(i,j)=-2;
end
end
end
figure;imshow(I);
SE=strel('square',5);
I=imclose(I,SE);
I=bwmorph(I,'skel',Inf);%step3 对二值图像进行数字形态学运算
figure;imshow(I);
for i=1:Size(1)%step4 设定边界
I(i,1)=255;
end
for j=1:Size(2)
I(1,j)=255;
end
for i=1:(Size(1))
I(i,Size(2))=255;
end
for j=1:(Size(2)*0.30)
I(Size(1),j)=255;
end
figure;imshow(I);
I=imfill(I,'holes');%strp5 填充图像的孔洞
img=I; %step6 筛选红细胞
img=im2bw(img,10/255);
sc=ones(15,15);
%确定结构元素的半径,以便对原图像进行边界的扩展
Hsc=size(sc,1);
Wsc=size(sc,2);
Rh=ceil(size(sc,1)/2);
Rw=ceil(size(sc,2)/2);
Csc=sum(sc(:));
Height=size(img,1);
Width=size(img,2);
imgin=zeros(Height+Hsc-1,Width+Wsc-1);
imgin(Rh:Rh+Height-1,Rw:Rw+Width-1)=img;
imgout=imgin;
for i=Rh:Rh+Height-1
for j=Rw:Rw+Width-1
pitch=imgin(i-(Rh-1):i+Hsc-Rh,j-(Rw-1):j+Wsc-Rw);
convtmp= pitch.*sc;
if sum(convtmp(:))<Csc
imgout(i,j)=0;
else
imgout(i,j)=1;
end
end
end
imgout1=imgout;
for i=Rh:Rh+Height-1
for j=Rw:Rw+Width-1
pitch=imgout(i-(Rh-1):i+Hsc-Rh,j-(Rw-1):j+Wsc-Rw);
convtmp= pitch.*sc;
if sum(convtmp(:))>0
imgout1(i,j)=1;
else
imgout1(i,j)=0;
end
end
end
countours=edge(imgout1,'canny'); %step7 canny边缘检测
figure;imshow(contours);