Matlab:从二进制图像中裁剪对象

时间:2014-09-06 23:38:32

标签: matlab image-processing

enter image description here

我是matlab的新手,我有一个图像,我想裁剪所有三个圆圈并存储它们。我的代码适用于图像中的单个圆圈。但是当我在图像中有更多圆圈时无法工作。

我的代码:

im=imread('D:\capture.png');
im_gray = rgb2gray(im);
BW = im2bw(im_gray, graythresh(im));
se = strel('disk',3);
bw2=imopen(BW,se);
bw2=~bw2;
s = regionprops(bw2, 'BoundingBox');
rectangle('Position', s.BoundingBox);
imCrop = imcrop(bw2, s.BoundingBox);
figure, imshow(imCrop);

关于它的任何想法?

1 个答案:

答案 0 :(得分:1)

你差不多了。请记住,当您单独执行s.BoundingBox时,您只是提取第一个圆圈。因此,我建议您创建一个单元格数组,用于存储每个边界框的各个圆圈,然后在所有边界框中运行for循环。因此,单元格数组中的每个元素都是裁剪圆。因此,尝试这样做:

%// Your code
im=imread('D:\capture.png');
im_gray = rgb2gray(im);
BW = im2bw(im_gray, graythresh(im));
se = strel('disk',3);
bw2=imopen(BW,se);
bw2=~bw2;
s = regionprops(bw2, 'BoundingBox');

%// New code here
circles = cell(1,numel(s));
for idx = 1 : numel(s)
    rect = s(idx).BoundingBox;
    circles{idx} = imcrop(bw2, rect);
end

circles现在将是裁剪圆圈的单元格数组。要访问i th 圈,只需执行以下操作:

imCrop = circles{i};

修改

根据您的评论,您想要检测最大和最小的圆圈。通过查看Area中的regionprops属性可以轻松完成此操作。您会找到生成最小和最大区域的边界框。您需要修改regionprops调用以包含Area标记。就这样:

s = regionprops(bw2, 'BoundingBox', 'Area');
[~,indMin] = min([s.Area]);
[~,indMax] = max([s.Area]);

circleSmall = circles{indMin};
circleLarge = circles{indMax};

上面的代码会找到具有最小和最大区域的圆圈,然后提取相应的圆圈,假设您运行代码以提取我之前写的for循环中的所有圆圈。请记住,我必须将s.Area括在方括号中。原因在于,当您执行此操作时,您将能够将所有区域提取为单个数组而不是具有单个维度的矩阵,并且min / max可以&#39在这样的事情上工作。