图5.1: Michel图表的部分页.
如果直接使用属性清单而非编程,任务会变得很简单。可惜由于语言的含糊,这是不可能的。所以你需要建构具有精确的语法和语义的语言,尽可能接近非正式的描述。使用HDevelop语法,一个通常的程序看起来如下:
dev_close_window ()
read_image (Catalog, ’swiss1.tiff’)
get_image_pointer1 (Catalog, Pointer, Type, Width, Height) dev_open_window (0, 0, Width/2, Height/2, ’black’, WindowID) dev_set_part (0, 0, Height-1, Width-1) dev_set_draw (’fill’)
threshold (Catalog, Dark, 0, 110) dev_set_colored (6) connection (Dark, ConnectedRegions) fill_up (ConnectedRegions, RegionFillUp) select_shape (RegionFillUp, StampCandidates, ’area’,
’and’, 10000, 200000)
select_shape (StampCandidates, Stamps, ’compactness’, ’and’, 1, 1.5)
smallest_rectangle1 (Stamps, Row1, Column1, Row2, Column2) dev_display (Catalog) dev_set_draw (’margin’) dev_set_line_width (3)
disp_rectangle1 (WindowID, Row1, Column1, Row2, Column2)
由于一些为止的操作符合不熟悉的语法,这个程序咋看起来会很晦涩。但如果仔细看一下这个操作符,你就会注意以下说明的直接联系。
threshold 选择全部图像像素黑暗比值。 connection 合并所有选定像素触摸相互连通区。
selectshape 选择区域面积(属性:'面积')在指定区间内。
smallestrectangle1计算每个区域的坐标(连续/栏)的包围矩形。
一旦用户熟悉了承操作符和语法、转换就变得很容易。特别需要指出,对于程序来说,图像或者加工区是否被处理并不重要,你可以使用相同的方法处理他们。. 由于中间数据结构的内存管理对用户来说是透明的,你可以不必理会它,你可以集中解决图像分析任务。