对应示例程序:
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-- 计算一个区域的最大内接矩形