二维测量--无结矩形裁剪木片(最大内接矩形)

对应示例程序:
inner_rectangle1.hdev

目标: 利用内部矩形裁剪一块木片,裁剪出的木片不包含斑点部分

思路为:
      1. 读取原始图像,进行Blob分析,得到三个斑点图像区域
      2. 将三个斑点区域与原始图像的域求差,得到待裁剪的区域部分(此区域不包含三个斑点)
      3. 如果待裁剪区域的面积满足要求,则计算最小内接矩形
      4. 将最小内接矩形与步骤3中的裁剪区域进行求差,得到剩余的裁剪部分,继续步骤3,直至面积不满足要求(就是不断求裁剪区域的内接矩形,得到一个内接矩形后,再求剩下区域的内接矩形)
      5. 进行显示

图像:
在这里插入图片描述在这里插入图片描述
代码:

*此示例程序演示如何使用内部矩形在一块木头中查找无结矩形。沿着生成的无结矩形切割木片可以获得无结木片
dev_update_window ('off')
dev_update_var ('off')
dev_update_pc ('off')
read_image (Image, 'wood_knots')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
* Set the thresholds on the size of the rectangular parts of the piece of wood.
*设置一块木片的面积阈值

MinAreaSize := 10000
MinWidth := 50
MinHeight := 50
dev_display (Image)
* Segment the knots.
mean_image (Image, ThresholdImage, 31, 31)  //均值滤波
dyn_threshold (Image, ThresholdImage, RegionDynThresh, 20, 'dark')  //局部阈值分割
erosion_circle (RegionDynThresh, RegionErosion, 1.5)  //圆形腐蚀
connection (RegionErosion, ConnectedRegions)  //连通域断开
select_shape (ConnectedRegions, KnobRegions, 'area', 'and', 20, 200)  //筛选 区域
dilation_circle (KnobRegions, KnobRegionsDilated, 5.5) //圆形膨胀
union1 (KnobRegionsDilated, KnobRegionsUnion)  //区域 集合  
//到此得到木片上的三个木斑 
* Compute the knot-free region.
*计算无结区域
get_domain (Image, Domain)  //获取图像的域

difference (Domain, KnobRegionsUnion, KnobFreeRegion)  //计算两个区域的差异  
//到此得到除木片上的三个 木斑(不知道官方词语)  以外的区域

* Find inner rectangles as long as they fullfil the size restrictions and add them
* to the tuple of knot-free rectangles.
*找到内部矩形,只要它们满足大小限制,并将它们添加到无结矩形的元组中

area_center (KnobFreeRegion, Area, Row, Column)  //计算区域的面积和中心坐标

gen_empty_obj (KnobFreeRectangles)  //生成一个空的Obj对象  用于存放无结矩形

//根据面积进行木片的划分
 //第一步是取最大的内接矩形  然后求差异 将内接矩形包括的区域去掉,再进行内接矩形的计算
        
while (Area > MinAreaSize)   
    inner_rectangle1 (KnobFreeRegion, Row1, Column1, Row2, Column2)  //计算区域的最大内接矩形
    RectangleHeight := Row2 - Row1                                   //矩形的高
    RectangleWidth := Column2 - Column1                               //矩形的宽
    if (RectangleHeight > MinHeight and RectangleWidth > MinWidth)    //判断内接矩形的宽和高 是否大于设定的阈值参数
        
        gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)  //将之前计算出的内接矩形生成
        concat_obj (KnobFreeRectangles, Rectangle, KnobFreeRectangles)  //将上面的内接矩形加入到之前定义的矩形组中
        
        difference (KnobFreeRegion, Rectangle, KnobFreeRegion) //计算去掉内接矩形后  的无结区域  控制循环过程
      
        area_center (KnobFreeRegion, Area, Row, Column)   //计算面积和中心点
    else
        break
    endif
endwhile
dev_set_draw ('margin')
dev_set_line_width (2)
dev_display (Image)
dev_set_colored (12)
dev_display (KnobFreeRectangles)  //显示

用到的几个算子:
      dyn_threshold --局部阈值分割
      difference --计算两个区域的差异
      inner_rectangle1-- 计算一个区域的最大内接矩形

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值