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);