泛洪填充运算
imfill
函数对二值图像和灰度图像执行泛洪填充运算。此运算对于从图像中删除不相关的伪影非常有用。
对于二值图像,
imfill
将连通的背景像素 (0
) 更改为前景像素 (1
),在到达对象边界时停止。对于灰度图像,
imfill
将较亮区域包围的较暗区域的强度值提高到与周围像素相同的强度级别。实际上,imfill
会删除未与图像边界连通的区域最小值。有关详细信息,请参阅Find Image Peaks and Valleys。
指定连通性
对于二值图像和灰度图像,填充运算的边界由您指定的像素连通性确定。
注意
与其他基于对象的运算不同,imfill
对背景像素进行运算。当您使用 imfill
指定连通性时,指定的是背景的连通性,而不是前景的连通性。
连通性的含义可以用以下矩阵来说明。
BW = logical([0 0 0 0 0 0 0 0; 0 1 1 1 1 1 0 0; 0 1 0 0 0 1 0 0; 0 1 0 0 0 1 0 0; 0 1 0 0 0 1 0 0; 0 1 1 1 1 0 0 0; 0 0 0 0 0 0 0 0; 0 0 0 0 0 0 0 0]);
如果背景是 4 连通的,此二值图像包含两个单独的背景元素(环内部分和环外部分)。如果背景是 8 连通的,则像素以对角方式连通,且只有一个背景元素。
指定起点
对于二值图像,您可以通过传入位置下标或在交互模式下使用 imfill
,用鼠标选择起始像素来指定填充运算的起点。
例如,如果您调用 imfill
,将像素 BW(4,3)
指定为起点,则 imfill
仅填充环内部分,因为默认情况下背景是 4 连通的。
imfill(BW,[4 3])
ans = 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
如果指定相同的起点但使用 8 连通的背景连通性,则 imfill
会填充整个图像。
imfill(BW,[4 3],8)
ans = 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
填充孔
泛洪填充运算的常见用途是填充图像中的孔。例如,假设您有一个二值图像或灰度图像,其中前景对象表示球体。在该图像中,这些对象应显示为圆盘,但由于原始照片中的反射,它们呈环形。在对该图像进行任何进一步处理之前,您可能希望首先使用 imfill
填充环形孔。
由于使用泛洪填充来填充孔非常常见,imfill
包括特殊语法来支持二值图像和灰度图像的泛洪填充孔操作。在此语法中,您只需指定参量 'holes'
;不必指定每个孔的起始位置。
为了演示,此示例填充脊柱灰度图像中的孔。
[X,map] = imread('spine.tif'); I = ind2gray(X,map); Ifill = imfill(I,'holes'); figure montage({I,Ifill})