我是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);
关于它的任何想法?
答案 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在这样的事情上工作。