MATLAB中无imfill函数的二值图像填充

MATLAB中无imfill函数的二值图像填充,matlab,image-processing,Matlab,Image Processing,对于这样的图像 有没有办法用白色填充这颗星的内部区域而不使用imfill功能?我想你想要的是。但是你必须对点和边进行排序,然后填充所有的东西 另一个更简单的解决方案是标记所有黑色组件(联合查找算法),并为不接触边界的组件上色。我想你想要的是。但是你必须对点和边进行排序,然后填充所有的东西 另一个更简单的解决方案是标记所有黑色组件(联合查找算法),并为不接触边界的组件上色。以下解决方案基于您知道作为星形的多边形的角点。如果是这种情况,您可以使用生成一个矩阵,其中星形边框内(和边框处)有相应的填充像

对于这样的图像

有没有办法用白色填充这颗星的内部区域而不使用
imfill
功能?

我想你想要的是。但是你必须对点和边进行排序,然后填充所有的东西

另一个更简单的解决方案是标记所有黑色组件(联合查找算法),并为不接触边界的组件上色。

我想你想要的是。但是你必须对点和边进行排序,然后填充所有的东西


另一个更简单的解决方案是标记所有黑色组件(联合查找算法),并为不接触边界的组件上色。

以下解决方案基于您知道作为星形的多边形的角点。如果是这种情况,您可以使用生成一个矩阵,其中星形边框内(和边框处)有相应的填充像素(值
1
),星形边框外有空像素(值
0

例如

例如用作

boxSize = 500; %// 500x500 pixels
filledStar = createFilledStar(boxSize);

imagesc(filledStar), colormap gray, axis equal

以下解决方案是基于您知道作为恒星的多边形的角点。如果是这种情况,您可以使用生成一个矩阵,其中星形边框内(和边框处)有相应的填充像素(值
1
),星形边框外有空像素(值
0

例如

例如用作

boxSize = 500; %// 500x500 pixels
filledStar = createFilledStar(boxSize);

imagesc(filledStar), colormap gray, axis equal

如果您不想使用预先构建的matlab函数,可以使用以下代码。基本上,代码检查边界在哪里,水平填充星形,然后垂直取消填充“水平看不到”的部分

水平填充

垂直卸料

如果您不想使用预先构建的matlab函数,可以使用以下代码。基本上,代码检查边界在哪里,水平填充星形,然后垂直取消填充“水平看不到”的部分

水平填充

垂直卸料

您可以自己实现该算法。。这就是
imfill
函数所做的。谢谢,我还考虑了2个for循环,它将像素序列从第一个白色一直绘制到第一个黑色。还有其他方法吗?引用文档:
BW2=imfill(BW,'holes')填充二进制图像BW中的孔。在这种语法中,孔是一组背景像素,不能通过从图像边缘填充背景来达到。
。例如:@Vlad:为什么不想使用
imfill
。你的想法也应该行得通,你试过实现它吗?我有一个任务要实现它,而不使用
imfill
和2或3种不同的算法。你可以自己实现算法。。这就是
imfill
函数所做的。谢谢,我还考虑了2个for循环,它将像素序列从第一个白色一直绘制到第一个黑色。还有其他方法吗?引用文档:
BW2=imfill(BW,'holes')填充二进制图像BW中的孔。在这种语法中,孔是一组背景像素,不能通过从图像边缘填充背景来达到。
。例如:@Vlad:为什么不想使用
imfill
。你的想法也应该行得通,你试过实现它吗?我有一个任务要实现它,而不使用
imfill
和2或3种不同的算法。@FiReRiRi,谢谢@菲瑞丽,谢谢你!
I = im2bw(imread('image.png'));

hliml = zeros(1,size(I,1));
hlimr = zeros(1,size(I,1));
vliml = zeros(1,size(I,2));
vlimr = zeros(1,size(I,2));

for i = 1:size(I,1)
    if ~isempty(find([diff(I(i,:)),0]==1,1,'first'))
hliml(i) = find([diff(I(i,:)),0]==1,1,'first');
    end
    if ~isempty(find([diff(I(i,:)),0]==-1,1,'last'))
hlimr(i) = find([diff(I(i,:)),0]==-1,1,'last');
    end
end

for i = 1:size(I,2)
     if ~isempty(find([diff(I(:,i));0]==1,1,'first'))
vliml(i) = find([diff(I(:,i));0]==1,1,'first');
     end
     if ~isempty(find([diff(I(:,i));0]==-1,1,'last'))
vlimr(i) = find([diff(I(:,i));0]==-1,1,'last');  
     end
end


for i = 1:size(I,1)
    if hliml(i)~=0
        I(i,hliml(i):hlimr(i)) = 1;
    end
end

for i = 1:size(I,2)
     if vliml(i)~=0
        I(1:vliml(i),i) = 0;
        I(vlimr(i):end,i) = 0;
     end
end

imshow(I);