Matlab:从二值图像裁剪对象

Posted

技术标签:

【中文标题】Matlab:从二值图像裁剪对象【英文标题】:Matlab: Crop objects from binary image 【发布时间】:2014-09-06 23:38:32 【问题描述】:

我是 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】:

您几乎可以正常工作。请记住,当您自己执行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;
    circlesidx = imcrop(bw2, rect);
end

circles 现在将是一个裁剪圆的元胞数组。要访问第 ith 圈,只需执行以下操作:

imCrop = circlesi;

编辑

您想从您的 cmets 中检测最大和最小的圆。这可以通过检查regionprops 中的Area 属性轻松完成。您会找到生成最小和最大区域的边界框。您需要修改您的 regionprops 调用以包含 Area 标志。因此:

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

circleSmall = circlesindMin;
circleLarge = circlesindMax;

上面的代码将找到具有最小和最大面积的圆圈,然后提取那些相应的圆圈,假设您已经运行代码提取了我之前编写的 for 循环中的所有这些圆圈。请记住,我必须将s.Area 括在方括号中。原因是当您这样做时,您将能够将所有区域提取为单个数组而不是具有单一维度的矩阵,并且min/max 无法处理类似的事情。

【讨论】:

裁剪后你能告诉我如何从3个圆圈中检测出最大和最小的圆圈吗? @James - 是的!我会编辑我的帖子。您只需要找到该区域。

以上是关于Matlab:从二值图像裁剪对象的主要内容,如果未能解决你的问题,请参考以下文章

使用python从二进制图像中裁剪感兴趣区域

matlab中如何将灰度图转化为二值黑白图像?敬请各位大侠指点!

从二值图像中提取白色区域

在matlab中如何将灰度图像转化成二值图像??如何再转化回去?

在matlab中如何将灰度图像转化成二值图像??如何再转化回去?

matlab怎么二值化