此示例显示了如何使用边缘检测和基本形态检测单元格。如果对象与背景上具有足够的对比度,则可以在图像中轻松检测到对象。
阅读Cell.tif.
图像是前列腺癌细胞的图像。在该图像中存在两个细胞,但是整体上只能看到一个单元。目标是检测或分段,该细胞完全可见。
我= imread(“cell.tif”);imshow (I)标题('原始图像');文字(大小(i,2),大小(i,1)+15,......'图片由Alan Partin'提供那......'字体大小'7,7,'水平对齐'那“对”);文本(大小(我,2),大小(我,1)+ 25,......。约翰霍普金斯大学的那......'字体大小'7,7,'水平对齐'那“对”);
与背景图像相比,待分割的对象不同。可以由计算图像梯度的运算符来检测对比度的变化。要创建包含分段单元的二进制掩码,请计算梯度图像并应用阈值。
使用边缘
和Sobel操作员计算阈值。调整阈值和使用边缘
再次获取包含分段单元的二进制掩码。
[~,阈值]=边缘(我“索贝尔”);Fuddfactor = 0.5;bws =边缘(我,“索贝尔”阈值* fudgeFactor);
显示产生的二元梯度掩模。
imshow(bws)标题(“二元梯度面具”的)
二进制梯度掩模显示图像中的高对比度线。这些行并不完全描绘感兴趣对象的轮廓。与原始图像相比,梯度掩模中的物体围绕物体存在间隙。如果使用线性结构元件扩展Sobel图像,则这些线性间隙将消失。通过使用创建两个垂直线性结构元素str
函数。
se90 = strel('线', 90);se0 = strel ('线',3,0);
使用垂直结构化元件随后将二进制梯度掩模扩张,然后是水平结构化元件。这im
功能是放大图像。
Bwsdil = Imdilate(BWS,[SE90 SE0]);imshow(bwsdil)标题('扩张渐变面膜'的)
放大的梯度遮罩很好地显示了细胞的轮廓,但在细胞内部仍然有洞。要填补这些洞,用imfill
函数。
BWdfill = imfill (BWsdil,“黑洞”);imshow (BWdfill)标题('与填充孔的二进制图像'的)
感兴趣的单元已成功分段,但这不是已发现的唯一对象。可以使用连接到图像边框的任何对象inclearborder.
函数。若要拆除对角线连接,请在inclearborder.
功能4.
。
bwnobord = incleclecorder(bwdfill,4);imshow(bwnobord)标题(“清除边界图像”的)
最后,为了使分割后的物体看起来更自然,使用菱形结构元素对图像进行两次侵蚀,使物体平滑。控件创建菱形结构元素str
函数。
seD = strel ('钻石'1);BWfinal = imerode (BWnobord, seD);BWfinal = imerode (BWfinal, seD);imshow (BWfinal)标题(“分割图像”);
你可以使用Labeloverlay.
在原始图像上显示掩码的功能。
imshow (labeloverlay(我BWfinal)标题('覆盖原始图像'的)
显示分段对象的另一种方法是围绕分段单元格绘制轮廓。用Bwperim
函数。
BWoutline = bwperim (BWfinal);Segout =我;Segout (BWoutline) = 255;imshow (Segout)标题('概述了原始图像'的)
imfill
|inclearborder.
|边缘
|im
|imerode.
|Bwperim
|str