Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab用白色填充形状_Matlab_Fill - Fatal编程技术网

Matlab用白色填充形状

Matlab用白色填充形状,matlab,fill,Matlab,Fill,如你所见,我有形状和它们的白色边界。我想用白色填充这些形状 输入为: 我希望获得以下输出: 有人能帮我处理这个密码吗?它不会将黑色椭圆更改为白色。 非常感谢:] I = imread('untitled4.bmp'); Ibw = im2bw(I); CC = bwconncomp(Ibw); %Ibw is my binary image stats = regionprops(CC,'pixellist'); % pass all over the stats for i=1:leng

如你所见,我有形状和它们的白色边界。我想用白色填充这些形状

输入为:

我希望获得以下输出:

有人能帮我处理这个密码吗?它不会将黑色椭圆更改为白色。 非常感谢:]

I = imread('untitled4.bmp');
Ibw = im2bw(I);
CC = bwconncomp(Ibw); %Ibw is my binary image
stats = regionprops(CC,'pixellist');

% pass all over the stats
for i=1:length(stats),
size = length(stats(i).PixelList);
% check only the relevant stats (the black ellipses)
if size >150 && size < 600 
    % fill the black pixel by white    
    x = round(mean(stats(i).PixelList(:,2)));
    y = round(mean(stats(i).PixelList(:,1)));
    Ibw = imfill(Ibw, [x, y]);
end;
end;

imshow(Ibw);
I=imread('untitled4.bmp');
Ibw=im2bw(I);
CC=BWConComp(Ibw);%Ibw是我的二进制图像
stats=regionprops(CC,“像素列表”);
%通过所有的统计数据
对于i=1:长度(统计数据),
大小=长度(统计信息(i).像素列表);
%仅检查相关统计信息(黑色椭圆)
如果尺寸>150和尺寸<600(&S)
%用白色填充黑色像素
x=轮数(平均值(统计(i).像素列表(:,2));
y=四舍五入(平均值(统计(i).像素列表(:,1));
Ibw=imfill(Ibw[x,y]);
结束;
结束;
imshow(Ibw);

如果您的图像都是黑白的,并且您有图像处理工具包,那么这看起来就像您需要的:

比如:

imfill(image, [startX, startY])

其中startX,startY是要填充的区域中的一个像素。

您的代码可以改进和简化如下。首先,对Ibw求反并使用查找4个连通组件将为每个黑色区域提供索引。其次,按像素数对连接区域进行排序,并选择除最大的两个以外的所有区域,将为所有较小的圆形区域提供索引。最后,可以收集这些较小区域的线性索引,并将其用于用白色填充区域。下面是代码(相当短,不需要任何循环):

这是最终的图像:


您可以使用bwconncomp()。如果执行类似于
c=bwconncomp(image)
的操作,则可以使用
c.PixelIdxList
查看组件。这些是图像的线性索引,告诉您哪些像素位于哪个组件中。您希望忽略一个组件(背景),您可以假定它是PixelIdxList中最大的列表,或者您可以查找包含边缘像素的列表。从c中的其余组件中,您需要检查它们是否为黑色。如果是,用imfill。哦,我注意到你的图像也有一个巨大的白色边框。您也想忽略该组件(因此可以忽略
PixelIdxList
中最大的两个组件)。非常感谢!我觉得我很亲近。我更新了我的代码并粘贴在上面。。不幸的是,这张照片是同一张照片:/Yes,看起来很接近。将j上的循环替换为:
x=round(平均值(统计(i).像素列表(:,2));y=四舍五入(平均值(统计(i).像素列表(:,1))(请注意,x和y是相反的方向)。同时替换
bw5=imfill(Ibw[x,y])带有
Ibw=imfill(Ibw[x,y])然后在结尾显示Ibw。与hi-gnovice相关,感谢您的帮助,它不起作用,但Richante帮助了我。。谢谢:]
I = imread('untitled4.bmp');
Ibw = im2bw(I);

CC = bwconncomp(~Ibw, 4);
[~, sortIndex] = sort(cellfun('prodofsize', CC.PixelIdxList));

Ifilled = Ibw;
Ifilled(vertcat(CC.PixelIdxList{sortIndex(1:end-2)})) = true;
imshow(Ifilled);