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:从二值图像裁剪对象的主要内容,如果未能解决你的问题,请参考以下文章
matlab中如何将灰度图转化为二值黑白图像?敬请各位大侠指点!
在matlab中如何将灰度图像转化成二值图像??如何再转化回去?