关于Matlab中函数minboundrect的报错解决,以及画出最小外接矩形的方法

  • 目的:图像预处理之后,计算所有连通域的最小外接矩形的长和宽,根据长宽比以及面积作为阈值,筛选出符合条件的连通域,并画框。
  • 问题:用函数 minboundrect 找出所有连通域的外接最小外接矩形的时候,报错!
  • 报错内容:计算凸包时出错,这些点可能共线。
  • 解决方法:利用函数 bwareaopen 初步移除小噪声的影响,具体实现如下:

(1)经过灰度转化、边缘检测、腐蚀、膨胀、平滑轮廓一系列预处理,得到的图像如下图所示:

(2)移除小噪声时,报错如下:

(3)分析:凸包又称为凸多边形(至少有三个顶点),因为图像中有的连通域不是凸多边形,函数 minboundrect 是根据凸包来判断外接矩形,所以会报错!

利用函数 bwareaopen 初步移除小噪声的图像如下:

 (4)接下来再用函数 minboundrect 找到所有连通域的最小外接矩形的信息,并利用长宽比、面积阈值来框出目标区域。

注意:此处如果直接用函数 imwrite 保存的图像不会有框,需手动保存!

 (5)代码实现:

%% 去除小噪声,防止计算凸包时出错,因为这些点可能共线。
[m,n] = size(Im4);
mianji = m*n;
Im5 = bwareaopen(Im4,round(mianji/50));
figure(1);imshow(Im4);title('去除小噪声');

%% 利用长宽比,去除无关部位
[L1,N1] = bwlabel(Im5);  % 返回连通域的信息和连通域的个数
figure(2),imshow(Im5);title('目标区域');  % 此处显示的图像,用来画框
hold on
for i = 1:N1
    [r c]=find(L1==i);  % 返回连通域的边界信息
    % 'a'是按面积算的最小矩形,如果按边长用'p'。
    [rectx,recty,area,perimeter] = minboundrect(c,r,'a');
    w=abs(min(rectx))-round(max(rectx));
    h=abs(min(recty))-round(max(recty));
    if w/h > 2 && w*h > mianji/15
        line(rectx(:),recty(:),'color','r','LineWidth',3);
        rectx_copy = rectx;  % 位置信息存储到新的变量之中
        recty_copy = recty;  % 位置信息存储到新的变量之中
    end
end

  >>>一些变量的信息,仅供参考

   >>>如有疑问,欢迎评论区一起探讨

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

您先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值