├── 10-1.hdev
├── 10-10.hdev
├── 10-3.hdev
├── 10-4.hdev
├── 10-5.hdev
├── 10-6.hdev
├── 10-7.hdev
├── 10-8.hdev
├── 10-9.hdev
├── 11-1.hdev
├── 11-12.hdev
├── 11-2.hdev
├── 11-3.hdev
├── 11-4.hdev
├── 11-5.hdev
├── 11-6.hdev
├── 12-4.hdev
├── 12-5.hdev
├── 12-mlp-test.hdev
├── 12-mlp-test2.hdev
├── 13-4.hdev
├── 15-1.hdev
├── 16-1.hdev
├── 16-2.hdev
├── 16-3.hdev
├── 16-4.hdev
├── 17-2.hdev
├── 18-4.hdev
├── 5-1.hdev
├── 5-10.hdev
├── 5-11.hdev
├── 5-2.hdev
├── 5-3.hdev
├── 5-5.hdev
├── 5-6.hdev
├── 5-7.hdev
├── 5-8.hdev
├── 5-9.hdev
├── 6-1.hdev
├── 6-10.hdev
├── 6-11.hdev
├── 6-2.hdev
├── 6-4.hdev
├── 6-5.hdev
├── 6-6.hdev
├── 6-7.hdev
├── 6-8.hdev
├── 6-9.hdev
├── 7-3.hdev
├── 7-4.hdev
├── 7-5.hdev
├── 8-10.hdev
├── 8-12.hdev
├── 8-2.hdev
├── 8-4.hdev
├── 8-5.hdev
├── 8-6.hdev
├── 8-7.hdev
├── 8-8.hdev
├── 8-9.hdev
├── 9-1.hdev
├── 9-11.hdev
├── 9-2.hdev
├── 9-3.hdev
├── 9-4.hdev
├── 9-5.hdev
├── 9-9.hdev
└── data
├── arrow1.jpg
├── arrow2.jpg
├── beads.jpg
├── board.jpg
├── boardEqu.jpg
├── bolts-0.jpg
├── bolts-1.jpg
├── carmex-0.jpg
├── carmex-1.jpg
├── char.jpg
├── chess.jpg
├── cloth.jpg
├── cloth1.jpg
├── cloth2.jpg
├── cloth3.jpg
├── cloth4.jpg
├── codes.jpg
├── cream.jpg
├── creamlabel.jpg
├── crossShape.jpg
├── defocusComponnet.jpg
├── disparity.jpg
├── display.jpg
├── flower.jpg
├── garlic.jpg
├── garlic2.jpg
├── holes.jpg
├── holes2.jpg
├── holesBoard.jpg
├── holesBoardNoise.jpg
├── label.jpg
├── labelShape-0.jpg
├── labelShape-1.jpg
├── logs.jpg
├── m1.jpg
├── m105.jpg
├── m2.jpg
├── m3.jpg
├── m4.jpg
├── m5.jpg
├── marker.jpg
├── meter1.jpg
├── meter2.jpg
├── modelWords.jpg
├── pen01.jpg
├── pen02.jpg
├── pen1.jpg
├── pen2.jpg
├── pen3.jpg
├── shapes.jpg
├── stereo-left.jpg
├── stereo-right.jpg
├── testWords.jpg
├── text.jpg
├── village.jpg
├── woodboard.jpg
├── yszx.omc
└── yszx.trf
/10-1.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | read_image(Image,'data/flower')
7 | rgb1_to_gray (Image, GrayImage)
8 | sobel_amp(GrayImage,Amp,'sum_abs',3)
9 | threshold(Amp,Edg,100,255)
10 | skeleton (Edg, Skeleton)
11 | dev_clear_window ()
12 | dev_display (Skeleton)
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/10-10.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | dev_close_window ()
7 | *读取了图像并创建显示窗口
8 | read_image (Image, 'data/flower')
9 | rgb1_to_gray (Image, GrayImage)
10 | get_image_size (Image, Width, Height)
11 | dev_open_window (0, 0, Width , Height, 'black', WindowHandle)
12 | dev_set_color ('white')
13 | *对图像进行阈值处理
14 | threshold (GrayImage, Region, 130, 255)
15 | *使用闭运算进行填充
16 | closing_circle (Region, Region, 20.5)
17 | *获取前景目标的初始轮廓
18 | gen_contour_region_xld (Region, Contour, 'border')
19 | *拟合圆形轮廓
20 | fit_circle_contour_xld (Contour, 'atukey', -1, 2, 0, 10, 1, Row, Column, Radius, StartPhi, EndPhi, PointOrder)
21 | *生成该拟合的圆形轮廓
22 | gen_circle_contour_xld (ContCircle, Row, Column, Radius, 0, 4 * acos(0), 'positive', 1)
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/10-3.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | dev_close_window ()
7 | read_image(Image,'data/flower')
8 | rgb1_to_gray (Image, GrayImage)
9 | gen_image_proto (Image, ImageCleared, 1)
10 | dev_open_window (0, 0, 256, 256, 'black', WindowHandle1)
11 | dev_open_window (0, 256, 256, 256, 'black', WindowHandle2)
12 | dev_open_window (0, 512, 256, 256, 'black', WindowHandle3)
13 | edges_image (GrayImage, ImaAmpGray, ImaDirGray, 'canny', 1, 'none', -1, -1)
14 | edges_image (GrayImage, ImaAmpGrayNMS, ImaDirGrayHyst, 'canny', 1, 'nms',20, 40)
15 | *对非极大值抑制后的边缘梯度图像进行了阈值处理
16 | threshold (ImaAmpGrayNMS, RegionGray, 1, 255)
17 | *提取边缘轮廓
18 | skeleton (RegionGray, EdgesGray)
19 | *用于结果显示和对比
20 | dev_set_window (WindowHandle1)
21 | dev_display (ImageCleared)
22 | dev_display (ImaAmpGray)
23 | dev_set_window (WindowHandle2)
24 | dev_display (ImageCleared)
25 | dev_display (ImaAmpGrayNMS)
26 | dev_set_window (WindowHandle3)
27 | dev_display (ImageCleared)
28 | dev_display (EdgesGray)
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
--------------------------------------------------------------------------------
/10-4.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | read_image (Image, 'data/flower')
7 | laplace (Image, ImageLaplace, 'signed', 11, 'n_8_isotropic')
8 | zero_crossing (ImageLaplace, RegionCrossing)
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/10-5.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | read_image (Image, 'data/flower')
7 | laplace_of_gauss(Image,Laplace,2.0)
8 | zero_crossing(Laplace,ZeroCrossings)
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/10-6.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | read_image (Image, 'data/flower')
7 | *转换为单通道灰色图像
8 | rgb1_to_gray (Image, GrayImage)
9 | *进行亚像素边缘提取。分别使用了不同的滞后阈值以便进行对比
10 | edges_sub_pix (GrayImage, Edges1, 'lanser2', 0.5, 5, 50)
11 | edges_sub_pix (GrayImage, Edges2, 'lanser2', 0.5, 25, 50)
12 | edges_sub_pix (GrayImage, Edges3, 'lanser2', 0.5, 5, 25)
13 | *将提取结果显示在窗口中
14 | dev_display (Edges1)
15 | stop()
16 | dev_display (Edges2)
17 | stop()
18 | dev_display (Edges3)
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/10-7.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | read_image (Image, 'data/flower')
7 | *使用canny算子进行亚像素边缘提取
8 | edges_color_sub_pix (Image, Edges1, 'canny', 0.5, 5, 50)
9 | *使用canny算子进行亚像素边缘提取
10 | edges_color_sub_pix (Image, Edges2, 'sobel_fast', 0.5, 40, 70)
11 | dev_clear_window ()
12 | dev_display (Edges1)
13 | dev_display (Edges2)
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/10-8.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | read_image (Image, 'data/flower')
7 | rgb1_to_gray (Image, GrayImage)
8 | dev_open_window (0, 512, 512, 512, 'black', WindowHandle1)
9 | *进行边缘检测
10 | lines_gauss(GrayImage,Lines,1.5,1,8,'light','true','bar-shaped','true')
11 | *在窗口将轮廓线条绘制出来
12 | dev_set_color ('red')
13 | dev_clear_window()
14 | dev_display (Lines)
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/10-9.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | dev_close_window ()
7 | read_image (Image, 'data/shapes')
8 | rgb1_to_gray (Image, GrayImage)
9 | get_image_size (Image, Width, Height)
10 | dev_open_window (0, 0, Width , Height, 'black', WindowHandle)
11 | *提取出的亚像素边缘edge的图像,得到了一个初始的轮廓
12 | edges_sub_pix (GrayImage, Edges, 'canny', 2.5, 15, 40)
13 | *对上一步的轮廓进行分割
14 | segment_contours_xld (Edges, ContoursSplit, 'lines_circles', 5, 4, 2)
15 | *提取出轮廓中较长的部分线段
16 | select_contours_xld (ContoursSplit, SelectedContours, 'contour_length', 20, Width / 2, -0.5, 0.5)
17 | *对相邻的轮廓段进行连接
18 | union_adjacent_contours_xld (SelectedContours, UnionContours, 20, 1, 'attr_keep')
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/11-1.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | dev_close_window ()
7 | dev_open_window (0, 0, 599, 464, 'black', WindowID)
8 | *读取了一幅彩色图像
9 | read_image (Imagecolor, 'data/holesBoard')
10 | *将其转化为灰度图像
11 | rgb1_to_gray (Imagecolor, Image)
12 | dev_set_draw ('margin')
13 | dev_set_line_width(3)
14 | Row1 :=700
15 | Column1 := 950
16 | Row2 := 906
17 | Column2 := 1155
18 | *选择了一块矩形的ROI区域
19 | gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
20 | dev_display (Rectangle)
21 | *将ROI区域进行裁剪,变成模板图像
22 | reduce_domain (Image, Rectangle, ImageReduced)
23 | *创建模板,因为光照比较稳定,GrayValues选择‘original’
24 | create_template (ImageReduced, 5, 4, 'sort', 'original', TemplateID)
25 | *读取测试图像
26 | read_image (ImageNoise, 'data/holesBoardNoise')
27 | *应用灰度模板并进行匹配
28 | adapt_template (ImageNoise, TemplateID)
29 | best_match_mg (ImageNoise, TemplateID, 35, 'false', 4, 'all', Row_, Column_, Error_)
30 | dev_clear_window ()
31 | dev_display (ImageNoise)
32 | *根据匹配返回的坐标中心,绘制矩形标识框,将匹配到的目标框选出来
33 | disp_rectangle2 (WindowID, Row_, Column_, 0, 95, 95)
34 | *匹配结束,释放模板资源
35 | clear_template (TemplateID)
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
--------------------------------------------------------------------------------
/11-12.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | * 这个例子用来介绍 HALCON中的形状模板匹配
7 | dev_close_window()
8 | *读取图像并获取其宽高
9 | read_image(ModelImage, 'data/arrow1')
10 | median_image (ModelImage, ImageMedian, 'circle', 6, 'mirrored')
11 | get_image_size(ModelImage, Width,Height)
12 | dev_open_window (0, 0, Width/2, Height/2, 'white', WindowHandle)
13 | *显示模板图像
14 | dev_display (ModelImage)
15 | * 设置画笔颜色和线条
16 | dev_set_color ('yellow')
17 | dev_set_line_width (3)
18 | * ------------------- 形状模板匹配程序 ----------------
19 | *第1步:选择模板中的目标
20 | Row1 := 281
21 | Column1 := 160
22 | Row2 := 440
23 | Column2 := 312
24 | *用矩形框选定一个目标区域
25 | gen_rectangle1 (ROI, Row1, Column1, Row2, Column2)
26 | *显示ROI区域
27 | dev_display (ROI)
28 | *剪裁出这个区域
29 | reduce_domain (ModelImage, ROI, ImageROI)
30 | *第2步,创建模板
31 | *检查模板参数
32 | inspect_shape_model (ImageROI, ShapeModelImages, ShapeModelRegions, 4, 50)
33 | *显示金字塔各层级的图像,以检查层数的合理性
34 | dev_display (ShapeModelRegions)
35 | area_center (ShapeModelRegions, AreaModelRegions, RowModelRegions,ColumnModelRegions)
36 | count_obj (ShapeModelRegions, HeightPyramid)
37 | *确定金字塔的层级
38 | for i := 1 to HeightPyramid by 1
39 | if (AreaModelRegions[i - 1] >= 15)
40 | NumLevels := i
41 | endif
42 | endfor
43 | *使用ROI图像创建模板
44 | create_shape_model (ImageROI, NumLevels, 0, rad(360), 'auto', 'none', 'ignore_global_polarity', 50, 10, ModelID)
45 | *获取轮廓信息,用于结果显示
46 | get_shape_model_contours (ShapeModel, ModelID, 1)
47 | * step 3: 在检测图像中搜索模板
48 | *读取检测图像
49 | read_image(SearchImage, 'data/arrow2')
50 | *寻找最佳模板匹配
51 | find_shape_model (SearchImage, ModelID, 0, rad(360), 0.3, 1, 0.5, 'least_squares', 0, 0.7, RowCheck, ColumnCheck, AngleCheck, Score)
52 | *如果找到了目标,则将它标示出来
53 | if (|Score| > 0.9)
54 | *计算刚性变换矩阵
55 | vector_angle_to_rigid (0, 0, 0, RowCheck, ColumnCheck, AngleCheck, MovementOfObject)
56 | *应用二维仿射变换XLD轮廓,以便在图像中显示检测到的轮廓
57 | affine_trans_contour_xld (ShapeModel, ModelAtNewPosition, MovementOfObject)
58 | *显示检测图像
59 | gen_rectangle2 (recResult, RowCheck, ColumnCheck, AngleCheck, 80, 80)
60 | dev_set_draw ('margin')
61 | dev_display (SearchImage)
62 | *标示出检测到的模板
63 | dev_display (ModelAtNewPosition)
64 | dev_set_color ('blue')
65 | dev_display (recResult)
66 | endif
67 | * ------------------- 程序结束 -----------------
68 | * 清除模板
69 | clear_shape_model (ModelID)
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
--------------------------------------------------------------------------------
/11-2.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | *读取参考的原始图像。如果是彩色的,需要先转化为单通道灰度图像
7 | read_image (Image, 'data/carmex-0')
8 | get_image_size (Image, Width, Height)
9 | dev_close_window ()
10 | dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
11 | *设置窗口绘制参数,线宽设为3
12 | dev_set_line_width(3)
13 | dev_set_draw ('margin')
14 | *创建圆形,因为目标区域是圆形,因为用圆形将ROI区域选择出来
15 | gen_circle (Circle, 161, 208, 80)
16 | *获取圆形的中心点,为匹配后的可视化显示结果做准备
17 | area_center (Circle, Area, RowRef, ColumnRef)
18 | *裁剪ROI区域,得到模板图像
19 | reduce_domain (Image, Circle, ImageReduced)
20 | *创建基于相关性的匹配模型,输入模板图像和模型参数
21 | create_ncc_model (ImageReduced, 'auto', 0, 0, 'auto', 'use_polarity', ModelID)
22 | *显示原始图像和圆形框
23 | dev_display (Image)
24 | dev_display (Circle)
25 | stop ()
26 | *读取测试图像。该测试图像和参考图像比起来有轻微的位移,旋转,缩放,以及失焦
27 | read_image (Image2, 'data/carmex-1')
28 | *进行行基于相关性的模板匹配
29 | find_ncc_model (Image2, ModelID, 0, 0, 0.5, 1, 0.5, 'true', 0, Row, Column, Angle, Score)
30 | vector_angle_to_rigid (RowRef, ColumnRef, 0, Row, Column, 0, HomMat2D)
31 | *对圆形进行仿射变换,使其将匹配的结果目标标识出来
32 | affine_trans_region (Circle, RegionAffineTrans, HomMat2D, 'nearest_neighbor')
33 | *显示测试画面和圆形标记圈
34 | dev_display (Image2)
35 | dev_display (RegionAffineTrans)
36 | *匹配结束,释放模板资源
37 | clear_ncc_model (ModelID)
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
--------------------------------------------------------------------------------
/11-3.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | *读取参考图像
7 | read_image(Image, 'data/labelShape-0')
8 | *根据要匹配的目标,围绕目标创建一个矩形,获取ROI区域
9 | gen_rectangle1 (Rectangle, 34, 290, 268, 460)
10 | *对ROI区域进行裁剪,得到模板图像
11 | reduce_domain (Image, Rectangle, ImageReduced)
12 | *测试金字塔的层级参数
13 | inspect_shape_model (ImageReduced, ModelImages, ModelRegions, 4, 30)
14 | *设置显示图像、绘制线条的线宽等窗口参数
15 | dev_set_draw ('margin')
16 | dev_set_line_width(3)
17 | dev_display(Image)
18 | dev_display(Rectangle)
19 | *根据剪裁的模板图像创建基于形状的模板,返回模板句柄ShapeModelID
20 | create_shape_model (ImageReduced, 5, rad(-10), rad(20), 'auto', 'none', 'use_polarity', 20, 10, ShapeModelID)
21 | stop()
22 | *读取用于测试的图像
23 | read_image(SearchImage, 'data/labelShape-1')
24 | *使用匹配算子进行形状模板匹配
25 | find_shape_model (SearchImage, ShapeModelID, 0, rad(360), 0.5, 3, 0, 'least_squares', 0, 0.5, RowCheck, ColumnCheck, AngleCheck, Score)
26 | *显示匹配结果,将匹配得到的实例以形状轮廓的形式绘制出来
27 | dev_display_shape_matching_results (ShapeModelID, 'red', RowCheck, ColumnCheck, AngleCheck, 1, 1, 0)
28 | *匹配结束,释放模板资源
29 | clear_shape_model (ShapeModelID)
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/11-4.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | dev_close_window ()
7 | *读取参考图像,这里读取的是单通道灰度图像
8 | read_image (ModelImage, 'data/bolts-0')
9 | *设置显示图像、绘制线条等窗口参数
10 | dev_open_window_fit_image (ModelImage, 0, 0, -1, -1, WindowHandle)
11 | dev_display (ModelImage)
12 | dev_set_draw ('margin')
13 | dev_set_line_width(3)
14 | stop ()
15 | *定义各个组件, 选取各个组件的ROI区域
16 | gen_rectangle1 (Rectangle1, 140, 71, 279, 168)
17 | gen_rectangle1 (Rectangle2, 181, 281,285, 430)
18 | gen_circle (Circle, 106, 256, 60)
19 | *将所有组件放进一个名为ComponentRegions的Tuple中
20 | concat_obj (Rectangle1, Rectangle2, ComponentRegions)
21 | concat_obj (ComponentRegions, Circle, ComponentRegions)
22 | *显示参考图像,以及选择的各个组件区域。核对区域选择是否理想
23 | dev_display (ModelImage)
24 | dev_display (ComponentRegions)
25 | stop ()
26 | *创建基于组件的模板,返回模板句柄ComponentModelID
27 | create_component_model (ModelImage, ComponentRegions, 20, 20, rad(25), 0, rad(360), 15, 40, 15, 10, 0.8, 3, 0, 'none', 'use_polarity', 'true', ComponentModelID, RootRanking)
28 | *读取测试图像,该测试图像相对于参考图像有一定的位移和旋转。
29 | read_image (SearchImage, 'data/bolts-1')
30 | *在参考图像模板的基础上,进行基于基于组件的匹配
31 | find_component_model (SearchImage, ComponentModelID, RootRanking, 0, rad(360), 0.5, 0, 0.5, 'stop_search', 'search_from_best', 'none', 0.8, 'interpolation', 0, 0.8, ModelStart, ModelEnd, Score, RowComp, ColumnComp, AngleComp, ScoreComp, ModelComp)
32 | *显示测试图像
33 | dev_display (SearchImage)
34 | *对每一个检测到的组件实例进行可视化的显示
35 | for Match := 0 to |ModelStart| - 1 by 1
36 | dev_set_line_width (4)
37 | *获得每个组件的实例和位移旋转等参数
38 | get_found_component_model (FoundComponents, ComponentModelID, ModelStart, ModelEnd, RowComp, ColumnComp, AngleComp, ScoreComp, ModelComp, Match, 'false', RowCompInst, ColumnCompInst, AngleCompInst, ScoreCompInst)
39 | dev_display (FoundComponents)
40 | endfor
41 | stop ()
42 | *匹配结束,释放模板资源
43 | clear_component_model (ComponentModelID)
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
--------------------------------------------------------------------------------
/11-5.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | dev_close_window ()
7 | *读取参考图像,这里读取的是单通道灰度图像
8 | *这里的参考图像是已经剪裁好的感兴趣区域图像,可以直接作为模板图像
9 | read_image (ModelImage, 'data/creamlabel')
10 | *设置显示窗口参数
11 | dev_open_window_fit_image (ModelImage, 0, 0, -1, -1, WindowHandle)
12 | *创建局部形变模板,返回局部形变模板句柄ModelID
13 | create_local_deformable_model (ModelImage, 'auto', rad(-15), rad(30), 'auto', 1, 1, 'auto', 1, 1, 'auto', 'none', 'use_polarity', [40,60], 'auto', [], [], ModelID)
14 | *获取局部形变模板的轮廓
15 | get_deformable_model_contours (ModelContours, ModelID, 1)
16 | *为了将模板轮廓可视化显示,需要将轮廓与图像实物对应起来
17 | *因此出于可视化显示的目的,先获取模板图像的几何中心
18 | area_center (ModelImage, Area, Row, Column)
19 | *进行仿射变换
20 | hom_mat2d_identity (HomMat2DIdentity)
21 | hom_mat2d_translate (HomMat2DIdentity, Row, Column, HomMat2DTranslate)
22 | affine_trans_contour_xld (ModelContours, ContoursAffinTrans, HomMat2DTranslate)
23 | *设置轮廓显示的线条参数,显示模板图像与轮廓
24 | dev_set_line_width (2)
25 | dev_display (ModelImage)
26 | dev_display (ContoursAffinTrans)
27 | stop ()
28 | *读取测试图像,这里的图像中更包含模板图像,并且有一定的形变
29 | read_image (DeformedImage, 'data/cream')
30 | *显示用于测试的局部形变图像
31 | dev_resize_window_fit_image (DeformedImage, 0, 0, -1, -1)
32 | dev_display (DeformedImage)
33 | *进行局部形变模板匹配
34 | find_local_deformable_model (DeformedImage, ImageRectified, VectorField, DeformedContours, ModelID, rad(-14), rad(28), 0.9, 1, 0.9, 1, 0.78, 0, 0, 0, 0.7, ['image_rectified','vector_field','deformed_contours'], ['deformation_smoothness','expand_border','subpixel'], [18,0,0], Score, Row, Column)
35 | *显示形变轮廓
36 | dev_display (DeformedImage)
37 | dev_set_line_width (2)
38 | dev_set_color ('red')
39 | dev_display (DeformedContours)
40 | stop()
41 | *匹配结束,释放模板资源
42 | clear_deformable_model (ModelID)
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/11-6.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | dev_close_window ()
7 | *读取参考图像,这里的参考图像应只包含识别的关键区域,用于创建模板
8 | read_image (ImageLabel, 'data/labelShape-0')
9 | *设置窗口参数用于显示图像
10 | get_image_size (ImageLabel, Width, Height)
11 | dev_open_window (0, 0, Width, Height, 'black', WindowHandle1)
12 | dev_set_draw ('margin')
13 | dev_display (ImageLabel)
14 | *设置用于存储特征点和感兴趣区域的变量
15 | NumPoints := []
16 | RowRoi := [10,10,Height - 10,Height - 10]
17 | ColRoi := [10,Width - 10,Width - 10,10]
18 | *将参考图像中的除边缘外的区域都设为感兴趣区域。因为参考图像已经近似于匹配的纹理样本
19 | gen_rectangle1 (Rectangle, 10, 10, Height - 10, Width - 10)
20 | *显示参考图像上选择的ROI区域
21 | dev_set_line_width (4)
22 | dev_display (Rectangle)
23 | stop ()
24 | *将感兴趣区域剪裁为模板图像
25 | reduce_domain (ImageLabel, Rectangle, ImageReduced)
26 | dev_clear_window ()
27 | dev_display (ImageLabel)
28 | *创建基于描述符的模板
29 | create_uncalib_descriptor_model (ImageReduced, 'harris_binomial', [], [], ['min_rot','max_rot','min_scale','max_scale'], [-90,90,0.2,1.1], 42, ModelID)
30 | *设置模型的原点,为了后面获取坐标作参照
31 | set_descriptor_model_origin (ModelID, -Height / 2, -Width / 2)
32 | *获取模型中特征点的位置
33 | get_descriptor_model_points (ModelID, 'model', 'all', Row_D, Col_D)
34 | *将模型中计算出的特征点存入NumPoints变量中
35 | NumPoints := [NumPoints,|Row_D|]
36 |
37 | *读取测试图像,这里读取的是单通道灰度图像,因此省略了通道转化的步骤
38 | read_image (ImageGray, 'data/labelShape-1')
39 | dev_resize_window_fit_image (ImageGray, 0, 0, -1, -1)
40 | dev_display (ImageGray)
41 | *对描述符特征点进行匹配
42 | find_uncalib_descriptor_model (ImageGray, ModelID, 'threshold', 800, ['min_score_descr','guided_matching'], [0.003,'on'], 0.25, 1, 'num_points', HomMat2D, Score)
43 | *显示匹配结果,将特征点用不同的颜色绘制出来
44 | if ((|HomMat2D| > 0) and (Score > NumPoints[0] / 4))
45 | get_descriptor_model_points (ModelID, 'search', 0, Row, Col)
46 | *创建十字标识符
47 | gen_cross_contour_xld (Cross, Row, Col, 6, 0.785398)
48 | projective_trans_region (Rectangle, TransRegion, HomMat2D, 'bilinear')
49 | projective_trans_pixel (HomMat2D, RowRoi, ColRoi, RowTrans, ColTrans)
50 | angle_ll (RowTrans[2], ColTrans[2], RowTrans[1], ColTrans[1], RowTrans[1], ColTrans[1], RowTrans[0], ColTrans[0], Angle)
51 | Angle := deg(Angle)
52 | if (Angle > 70 and Angle < 110)
53 | area_center (TransRegion, Area, Row, Column)
54 | dev_set_color ('green')
55 | dev_set_line_width (4)
56 | dev_display (TransRegion)
57 | dev_set_colored (6)
58 | dev_display (Cross)
59 | endif
60 | endif
61 | stop ()
62 | *匹配结束,释放模板资源
63 | clear_descriptor_model (ModelID)
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
--------------------------------------------------------------------------------
/12-4.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | *关闭当前窗口
7 | dev_close_window ()
8 | *创建新窗口
9 | dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
10 | *设置绘制形状的方式
11 | dev_set_draw ('margin')
12 | dev_set_line_width (3)
13 | *创建mlp分类器,特征数为1,输出类为2个,输出方法选择‘softmax’用于分类
14 | create_class_mlp (1, 1, 2, 'softmax', 'normalization', 3, 42, MLPHandle)
15 | *创建训练样本图像与其分类的对应关系
16 | *图像和分类名称一一对应
17 | FileNames := ['m1','m2','m3','m4']
18 | Classes := [0,0,1,1]
19 | for J := 0 to |FileNames| - 1 by 1
20 | *读取训练图像
21 | read_image (Image, 'data/' + FileNames[J])
22 | dev_display (Image)
23 | *对图像进行分割
24 | rgb1_to_gray (Image, GrayImage)
25 | threshold (GrayImage, darkRegion, 0, 105)
26 | connection (darkRegion, ConnectedRegions)
27 | select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 2000, 99999)
28 | fill_up (SelectedRegions, Objects)
29 | dev_display (Objects)
30 | disp_message (WindowHandle, 'Add Sample ' + J + ', Class Index ' + Classes[J], 'window', 10, 10, 'black', 'true')
31 | *将分割后的对象objects添加进分类器对应的分类Classes[J]中
32 | count_obj (Objects, Number)
33 | *提取特征(圆度)
34 | for N := 1 to Number by 1
35 | select_obj (Objects, Region, N)
36 | circularity (Region, Circularity)
37 | add_sample_class_mlp (MLPHandle, Circularity,Classes[J])
38 | endfor
39 | stop()
40 | disp_continue_message (WindowHandle, 'black', 'true')
41 | endfor
42 | dev_clear_window ()
43 | disp_message (WindowHandle, 'Training...', 'window', 10, 10, 'black', 'true')
44 | *训练mlp分类器
45 | train_class_mlp (MLPHandle, 200, 1, 0.01, Error, ErrorLog)
46 | clear_samples_class_mlp (MLPHandle)
47 |
48 | *读取输入的待检测图像
49 | read_image (testImage, 'data/m5')
50 | rgb1_to_gray (testImage, GrayTestImage)
51 | *将图像进行分割
52 | threshold (GrayTestImage, darkTestRegion, 0, 105)
53 | connection (darkTestRegion, ConnectedTestRegions)
54 | select_shape (ConnectedTestRegions, SelectedTestRegions, 'area', 'and', 1500, 99999)
55 | fill_up (SelectedTestRegions, testObjects)
56 | *将分割后的对象objects进行分类
57 | count_obj (testObjects, Number)
58 | Classes := []
59 | Colors := ['yellow','magenta']
60 | dev_set_colored (6)
61 | dev_display (testImage)
62 | *提取特征(圆度)
63 | for J := 1 to Number by 1
64 | select_obj (testObjects, singleRegion, J)
65 | circularity (singleRegion, Circularity)
66 | classify_class_mlp (MLPHandle, Circularity, 1, Class, Confidence)
67 | Classes := [Classes,Class]
68 | dev_set_color (Colors[Classes[J-1]])
69 | dev_display (singleRegion)
70 | endfor
71 |
72 | *清除MLP分类器,释放内存
73 | clear_class_mlp (MLPHandle)
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
--------------------------------------------------------------------------------
/12-5.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | dev_close_window()
7 | read_image (Image, 'data/modelWords')
8 | get_image_size(Image,width,height)
9 | dev_open_window (0, 0, width, height, 'black', WindowHandle)
10 | rgb1_to_gray (Image, GrayImage)
11 | gen_empty_obj (EmptyObject)
12 | for Index := 1 to 4 by 1
13 | disp_message (WindowHandle, '请框选单个汉字区域,右键确认:','window', 12, 12, 'yellow', 'false')
14 | draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)
15 | **根据画的矩形生成对应的矩形
16 | gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
17 | reduce_domain (GrayImage, Rectangle, ImageReduced1)
18 | *阈值处理
19 | threshold (ImageReduced1, Region1, 128, 255)
20 | *准备接收所有提取的字符区域
21 | concat_obj (EmptyObject, Region1, EmptyObject)
22 | endfor
23 | words:=['艺','术','中','心']
24 | *排序
25 | sort_region (EmptyObject, SortedRegions1, 'character', 'true', 'row')
26 | for Index1:=1 to 4 by 1
27 | select_obj (SortedRegions1, ObjectSelected1, Index1)
28 | append_ocr_trainf (ObjectSelected1, Image, words[Index1-1], 'data/yszx.trf')
29 | endfor
30 | read_ocr_trainf_names ('data/yszx.trf', CharacterNames, CharacterCount)
31 | create_ocr_class_mlp (50, 60, 'constant', 'default', CharacterNames, 80, 'none', 10, 42, OCRHandle)
32 | trainf_ocr_class_mlp (OCRHandle, 'data/yszx.trf', 200, 1, 0.01, Error, ErrorLog)
33 | write_ocr_class_mlp (OCRHandle, 'data/yszx.omc')
34 | *导入另一张做测试的图
35 | read_image (ImageTest, 'data/testWords.jpg')
36 | rgb1_to_gray (ImageTest, Image1)
37 | threshold (Image1, testwordregion, 125, 255)
38 | *对符合条件的字符区域进行分割
39 | connection (testwordregion, ConnectedwordRegions)
40 | *筛选符合条件的字符形状区域
41 | select_shape (ConnectedwordRegions, SelectedwordRegions, 'area', 'and', 700, 2500)
42 | *从左到右,排序
43 | sort_region (SelectedwordRegions, SortedRegions2, 'upper_left', 'true', 'column')
44 | count_obj(SortedRegions2, Number)
45 | *开始字符识别
46 | read_ocr_class_mlp ('data/yszx.omc', OCRHandle1)
47 | do_ocr_multi_class_mlp (SortedRegions2, Image1, OCRHandle1, Class, Confidence)
48 | *显示结果
49 | disp_message(WindowHandle, '识别结果:', 'image', 10, 10, 'white', 'false')
50 | for i:=1 to 4 by 1
51 | disp_message(WindowHandle, Class[i-1], 'image', 90, 60*i, 'yellow', 'false')
52 | endfor
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
--------------------------------------------------------------------------------
/12-mlp-test.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | *关闭当前窗口
7 | dev_close_window ()
8 | *创建新窗口
9 | dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
10 | *设置显示颜色
11 | dev_set_colored (6)
12 | *设置绘制形状的方式
13 | dev_set_draw ('margin')
14 | dev_set_line_width (3)
15 | *创建mlp分类器,输出方法选择‘softmax’用于分类
16 | create_class_mlp (6, 5, 3, 'softmax', 'normalization', 3, 42, MLPHandle)
17 | *创建训练样本图像与其分类的对应关系
18 | *图像和分类名称一一对应
19 | FileNames := ['m1','m2','m3','m4']
20 | Classes := [0,0,1,1]
21 | for J := 0 to |FileNames| - 1 by 1
22 | *读取训练图像
23 | read_image (Image, 'data/' + FileNames[J]+'.jpg')
24 | dev_display (Image)
25 | dev_set_colored (6)
26 | *对图像进行自动分割
27 | rgb1_to_gray (Image, GrayImage)
28 | threshold (GrayImage, darkRegion, 0, 105)
29 | connection (darkRegion, ConnectedRegions)
30 | select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 2000, 99999)
31 | fill_up (SelectedRegions, Objects)
32 | dev_display (Objects)
33 | disp_message (WindowHandle, 'Add Sample ' + J + ', Class Index ' + Classes[J], 'window', 10, 10, 'black', 'true')
34 | *将分割后的对象objects添加进分类器对应的分类Classes[J]中
35 | count_obj (Objects, Number)
36 | for N := 1 to Number by 1
37 | select_obj (Objects, Region, N)
38 | circularity (Region, Circularity)
39 | roundness (Region, Distance, Sigma, Roundness, Sides)
40 | moments_region_central_invar (Region, PSI1, PSI2, PSI3, PSI4)
41 | Features := [Circularity,Roundness,PSI1,PSI2,PSI3,PSI4]
42 | add_sample_class_mlp (MLPHandle, Features,Classes[J])
43 | endfor
44 | stop()
45 | disp_continue_message (WindowHandle, 'black', 'true')
46 | endfor
47 | dev_clear_window ()
48 | disp_message (WindowHandle, 'Training...', 'window', 10, 10, 'black', 'true')
49 | *训练mlp分类器
50 | train_class_mlp (MLPHandle, 200, 1, 0.01, Error, ErrorLog)
51 | clear_samples_class_mlp (MLPHandle)
52 | disp_message (WindowHandle, 'Training... completed', 'window', 10, 10, 'black', 'true')
53 | *读取输入的待检测图像
54 | read_image (testImage, 'E:/Doc/MV/pics/12-m5.jpg')
55 | rgb1_to_gray (testImage, GrayTestImage)
56 | dev_display (testImage)
57 | *将图像进行分割
58 | threshold (GrayTestImage, darkTestRegion, 0, 105)
59 | connection (darkTestRegion, ConnectedTestRegions)
60 | select_shape (ConnectedTestRegions, SelectedTestRegions, 'area', 'and', 1500, 99999)
61 | fill_up (SelectedTestRegions, testObjects)
62 | *将分割后的对象objects进行分类
63 | count_obj (testObjects, Number)
64 | Classes := []
65 | for J := 1 to Number by 1
66 | select_obj (testObjects, singleRegion, J)
67 | circularity (singleRegion, Circularity)
68 | roundness (singleRegion, Distance, Sigma, Roundness, Sides)
69 | moments_region_central_invar (singleRegion, PSI1, PSI2, PSI3, PSI4)
70 | Features := [Circularity,Roundness,PSI1,PSI2,PSI3,PSI4]
71 | classify_class_mlp (MLPHandle, Features, 1, Class, Confidence)
72 | Classes := [Classes,Class]
73 | endfor
74 | *用不同颜色显示同类的对象
75 | count_obj (Objects, Number)
76 | Colors := ['yellow','magenta','green']
77 | for J := 1 to Number by 1
78 | select_obj (Objects, Region, J)
79 | dev_set_color (Colors[Classes[J - 1]])
80 | dev_display (Region)
81 | endfor
82 | *清除MLP分类器,释放内存
83 | clear_class_mlp (MLPHandle)
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
--------------------------------------------------------------------------------
/12-mlp-test2.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | *关闭当前窗口
7 | dev_close_window ()
8 | *创建新窗口
9 | dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
10 | *设置显示颜色
11 | dev_set_colored (6)
12 | *设置绘制形状的方式
13 | dev_set_draw ('margin')
14 | dev_set_line_width (3)
15 | *创建mlp分类器,输出方法选择‘softmax’用于分类
16 | create_class_mlp (6, 5, 3, 'softmax', 'normalization', 3, 42, MLPHandle)
17 | *创建训练样本图像与其分类的对应关系
18 | *图像和分类名称一一对应
19 | FileNames := ['m1','m2','m3','m4']
20 | Classes := [0,0,1,1]
21 | for J := 0 to |FileNames| - 1 by 1
22 | *读取训练图像
23 | read_image (Image, 'data/' + FileNames[J])
24 | dev_display (Image)
25 | *对图像进行自动分割
26 | rgb1_to_gray (Image, GrayImage)
27 | threshold (GrayImage, darkRegion, 0, 105)
28 | connection (darkRegion, ConnectedRegions)
29 | select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 2000, 99999)
30 | fill_up (SelectedRegions, Objects)
31 | dev_display (Objects)
32 | disp_message (WindowHandle, 'Add Sample ' + J + ', Class Index ' + Classes[J], 'window', 10, 10, 'black', 'true')
33 | *将分割后的对象objects添加进分类器对应的分类Classes[J]中
34 | count_obj (Objects, Number)
35 | for N := 1 to Number by 1
36 | select_obj (Objects, Region, N)
37 | circularity (Region, Circularity)
38 | add_sample_class_mlp (MLPHandle, Circularity,Classes[J])
39 | endfor
40 | stop()
41 | disp_continue_message (WindowHandle, 'black', 'true')
42 | endfor
43 | dev_clear_window ()
44 | disp_message (WindowHandle, 'Training...', 'window', 10, 10, 'black', 'true')
45 | *训练mlp分类器
46 | train_class_mlp (MLPHandle, 200, 1, 0.01, Error, ErrorLog)
47 | clear_samples_class_mlp (MLPHandle)
48 | disp_message (WindowHandle, 'Training... completed', 'window', 10, 10, 'black', 'true')
49 | *读取输入的待检测图像
50 | read_image (testImage, 'E:/Doc/MV/pics/12-m5.jpg')
51 | rgb1_to_gray (testImage, GrayTestImage)
52 |
53 | *将图像进行分割
54 | threshold (GrayTestImage, darkTestRegion, 0, 105)
55 | connection (darkTestRegion, ConnectedTestRegions)
56 | select_shape (ConnectedTestRegions, SelectedTestRegions, 'area', 'and', 1500, 99999)
57 | fill_up (SelectedTestRegions, testObjects)
58 | *将分割后的对象objects进行分类
59 | count_obj (testObjects, Number)
60 | Classes := []
61 | Colors := ['yellow','magenta']
62 | dev_display (testImage)
63 | for J := 1 to Number by 1
64 | select_obj (testObjects, singleRegion, J)
65 | circularity (singleRegion, Circularity)
66 | classify_class_mlp (MLPHandle, Circularity, 1, Class, Confidence)
67 | Classes := [Classes,Class]
68 |
69 | dev_set_color (Colors[Classes[J-1]])
70 | dev_display (singleRegion)
71 | endfor
72 |
73 | *清除MLP分类器,释放内存
74 | clear_class_mlp (MLPHandle)
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
--------------------------------------------------------------------------------
/13-4.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | *使用相机参数校正畸变
7 | * CameraParameters为相机的内部参数
8 | CameraParameters := [0.0271606, -518.0, 1.48e-005, 1.48e-005, 271.343, 260.681, 640, 480]
9 | * CameraPose为相机的外部参数,即位姿
10 | CameraPose := [0.258487, -0.018, 4.954, 2.0, 14.0, 2.4, 0]
11 | scaleParam := 1920/1080.0
12 | *读取待校正的图像
13 | read_image (Image, 'data/chess')
14 | *调整原点的位姿
15 | set_origin_pose (CameraPose, -1,-0.7, 0, rectificationPose)
16 | *生成用于校正的映射图,用来描述图像坐标系与世界坐标系之间的映射
17 | gen_image_to_world_plane_map(rectificationMap,CameraParameters, rectificationPose, 640, 480, 640, 480, scaleParam/ 640, 'bilinear')
18 | *利用映射图rectificationMap进行图像的校正
19 | map_image (Image, rectificationMap, rectifiedImage)
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/15-1.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | *清空显示窗口。
7 | dev_close_window ()
8 | *读取参考图像。这里读取图像是为了创建模板。
9 | read_image (Image, 'data/pen01')
10 | *因为参考图像因为拍摄的原因会有一些噪声,因此使用均值滤波对图像进行平滑。
11 |
12 | mean_image (Image, ImageMean, 3, 3)
13 | *获取图像的宽和高用于窗口显示
14 | get_image_size (Image, Width, Height)
15 | *设置窗口显示参数,包括设置绘制线条的颜色和线宽等
16 | dev_close_window ()
17 | dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
18 | dev_set_color ('red')
19 | dev_display (Image)
20 | dev_set_draw ('margin')
21 | dev_set_line_width(3)
22 |
23 | *对原图进行阈值分割,粗略的提取出印刷图案的区域
24 | threshold (ImageMean, Region, 0, 42)
25 | *对印刷图案区域做一定的膨胀,使选区完全包围印刷图案部分
26 | dilation_circle (Region, RegionDilation, 8.5)
27 | *将选择转化为包围的形状
28 | shape_trans (RegionDilation, RegionTrans, 'convex')
29 | *将形状区域作为感兴趣区域从原图中分割出来
30 | reduce_domain (ImageMean, RegionTrans, ImageReduced)
31 |
32 | *检查形状模板参数,为后续的形状模板匹配检查合适的层级参数。
33 | *这里只用了1层的金字塔图像,因为该形状已经可以满足检测的需求了
34 | inspect_shape_model (ImageReduced, ModelImages, ModelRegions, 1, 20)
35 | *创建形状的轮廓,为了显示形状便于检查形状选择的是否完整
36 | gen_contours_skeleton_xld (ModelRegions, Model, 1, 'filter')
37 | *获取图像的面积和几何中心点坐标
38 | area_center (RegionTrans, Area, RowRef, ColumnRef)
39 | *创建形状模板。
40 | *金字塔层级为。因为测试图像与参考图像在光照,坐标方面的变化比较小,因此按默认值设置即可
41 | create_shape_model (ImageReduced, 1, rad(-10), rad(10), 'auto', 'none', 'use_polarity', 20, 10, ShapeModelID)
42 | *创建一个用于对比的差异模型,返回模型句柄VariationModelID
43 | create_variation_model (Width, Height, 'byte', 'standard', VariationModelID)
44 |
45 | *使用良品的训练图像对检查模板进行训练。
46 | *其中为了将各个图像进行对齐,避免可能的位移和旋转,先对图像做个仿射变换。
47 | *然后使用对变换后的良品图像进行训练,得到良品的检查模板。
48 | for Num := 1 to 2 by 1
49 | read_image (Image, 'data/pen0' + Num)
50 | find_shape_model (Image, ShapeModelID, rad(-10), rad(20), 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Score)
51 | if (|Score| == 1)
52 | vector_angle_to_rigid (Row, Column, Angle, RowRef, ColumnRef, 0, HomMat2D)
53 | affine_trans_image (Image, ImageTrans, HomMat2D, 'constant', 'false')
54 | train_variation_model (ImageTrans, VariationModelID)
55 | dev_display (Model)
56 | endif
57 | endfor
58 |
59 | *准备检查模板。设置两个阈值AbsThreshold, VarThreshold。
60 | *前者定义了检测图像与检查模板的灰度差的绝对值的允许阈值。
61 | *后者定义了与理想图像的差异程度
62 | prepare_variation_model (VariationModelID, 20, 2)
63 | *读取待检测的图像,这里开始正式检测。
64 | *也可以连接相机进行拍摄,图像如果是彩色的,需要转换为单通道图像。
65 | stop()
66 | for Num := 1 to 3 by 1
67 | read_image (Image2, 'data/pen'+Num)
68 | *进行模板匹配。寻找图中的形状
69 | find_shape_model (Image2, ShapeModelID, rad(-10), rad(20), 0.5, 1, 0.5, 'least_squares', 4, 0.9, Row, Column, Angle, Score)
70 | if (|Score| == 1)
71 | *如果匹配成功,现将图像进行仿射变换用于和模板对齐。 vector_angle_to_rigid (Row, Column, Angle, RowRef, ColumnRef, 0, HomMat2D)
72 | vector_angle_to_rigid (Row, Column, Angle, RowRef, ColumnRef, 0, HomMat2D)
73 | affine_trans_image (Image2, ImageTrans2, HomMat2D, 'constant', 'false')
74 | *然后裁剪出感兴趣区域。对后面的比对做准备
75 | reduce_domain (ImageTrans2, RegionTrans, ImageReduced2)
76 | *将裁剪后的感兴趣区域图像与检查模板图像进行比对。提取出有差异的部分
77 | compare_variation_model (ImageReduced2, RegionDiff, VariationModelID)
78 | *将差异部分的区域分割开来
79 | connection (RegionDiff, ConnectedRegions)
80 | *对差异图像区域进行筛选,根据差异的面积排除掉极微小的无意义的差别部分。
81 | select_shape (ConnectedRegions, RegionsError, 'area', 'and', 20, 1000000)
82 | *计算提取出的差异的个数,作为缺陷数量。这是为了判别最终结果
83 | count_obj (RegionsError, NumError)
84 | *将缺陷部位标记出来。如果是良品,则显示的是没有标记的测试图像
85 | dev_clear_window ()
86 | dev_display (ImageTrans2)
87 | dev_display (RegionsError)
88 | *打印结果。
89 | *如果结果为0,可以认为是良品,没有发生缺陷
90 | *如果缺陷个数不为0,则认为是次品
91 | set_tposition (WindowHandle, 20, 20)
92 | if (NumError == 0)
93 | write_string (WindowHandle, 'OK')
94 | else
95 | write_string (WindowHandle, 'Not OK')
96 | endif
97 | endif
98 | stop()
99 | endfor
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
--------------------------------------------------------------------------------
/16-1.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | *清空当前窗口
7 | dev_close_window ()
8 | *读取测试图像
9 | read_image (Image, 'data/cloth1')
10 | *获取图像的宽
11 | get_image_size (Image, Width, Height)
12 | *创建显示窗口,并设置窗口及绘制参数
13 | dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
14 | dev_set_draw ('margin')
15 | dev_set_line_width (3)
16 | dev_set_color ('red')
17 | *创建一个高斯滤波器,用于将傅里叶转换后的图像进行滤波
18 | gen_gauss_filter (GaussFilter, 3.0, 3.0, 0.0, 'none', 'rft', Width, Height)
19 | *开始检测
20 | *将测试图像转化为单通道的灰度图像
21 | rgb1_to_gray (Image, ImageGray)
22 | *对灰度图像进行颜色反转
23 | invert_image (ImageGray, ImageInvert)
24 | *对反转后的图像进行傅里叶变换
25 | rft_generic (ImageInvert, ImageFFT, 'to_freq', 'none', 'complex', Width)
26 | *对傅里叶图像做卷积,使用之前创建的高斯滤波器作为卷积核
27 | convol_fft (ImageFFT, GaussFilter, ImageConvol)
28 | *将卷积后的傅里叶图像还原为空间域图像。可见图像的突变部分得到了增强
29 | rft_generic (ImageConvol, ImageFiltered, 'from_freq', 'n', 'real', Width)
30 | *设置提取线条的参数
31 | calculate_lines_gauss_parameters (17, [25,3], Sigma, Low, High)
32 | *将图像中的有灰度差异的线条提取出来
33 | lines_gauss (ImageFiltered, Lines, Sigma, Low, High, 'dark', 'true', 'gaussian', 'true')
34 | *将提取出的结果显示出来
35 | dev_display (Image)
36 | dev_display (Lines)
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/16-2.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | *清空当前窗口
7 | dev_close_window ()
8 | read_image (Image, 'data/cloth2')
9 | get_image_size (Image, Width, Height)
10 | *创建窗口并设置窗口绘制参数
11 | dev_open_window (0, 0, Width/2, Height/2, 'black', WindowHandle)
12 | dev_set_draw ('margin')
13 | dev_set_line_width (4)
14 | dev_set_color ('red')
15 | *创建一个高斯滤波器,用于将傅里叶转换后的图像进行滤波
16 | gen_gauss_filter (GaussFilter, 3.0, 3.0, 0.0, 'none', 'rft', Width, Height)
17 | *开始检测,读取图像
18 | rgb1_to_gray (Image, ImageGray)
19 | *对图像进行傅里叶变换,平滑以及还原
20 | rft_generic (ImageGray, ImageFFT, 'to_freq', 'none', 'complex', Width)
21 | convol_fft (ImageFFT, GaussFilter, ImageConvol)
22 | rft_generic (ImageConvol, ImageFiltered, 'from_freq', 'n', 'real', Width)
23 | *对还原后的图像进行阈值处理,提取出图中明显偏暗的部分,即瑕疵的位置
24 | threshold (ImageFiltered, ImageDark, 0, 85)
25 | *由于瑕疵部位可能不止一个,将其分离成独立的区域
26 | connection (ImageDark, ConnectedRegions)
27 | *获取瑕疵的数量。
28 | *如果对瑕疵的形状面积尺寸等有筛选要求的,
29 | *也可以在这一步之前加入selecct_shape算子进行判断
30 | count_obj (ConnectedRegions, Number)
31 | *逐个显示瑕疵的位置并以圆圈标记出来。
32 | for index := 1 to Number by 1
33 | select_obj (ConnectedRegions, shape, index)
34 | area_center (shape, Area, Row, Column)
35 | gen_circle (Circle, Row, Column, 30)
36 | dev_display (Circle)
37 | endfor
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
--------------------------------------------------------------------------------
/16-3.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | *关闭当前屏幕的窗口
7 | dev_close_window ()
8 | *读取图像,创建新窗口
9 | read_image (Image, 'data/cloth3')
10 | get_image_size (Image, Width, Height)
11 | dev_open_window (0, 0, Width/2, Height/2, 'black', WindowHandle)
12 | dev_set_draw ('margin')
13 | dev_set_line_width (3)
14 | dev_set_color ('red')
15 | *读取检测图像
16 | rgb1_to_gray (Image, ImageGray)
17 | *使用muti_image算子对灰度图像做了乘法运算
18 | *增强了图像的对比度
19 | mult_image(ImageGray, ImageGray, ImageResult,0.01, 0)
20 | *创建一个正弦形状的带通滤波器,用于消除背景的纹理图像。
21 | *其第二个参数决定了正弦的最大值,需要能在平滑背景的同时较好的提取出缺陷点
22 | gen_sin_bandpass (ImageBandpass, 0.2, 'none', 'rft', Width, Height)
23 | *对图像进行傅里叶变换,平滑以及还原
24 | rft_generic (ImageResult, ImageFFT, 'to_freq', 'none', 'complex', Width)
25 | convol_fft (ImageFFT, ImageBandpass, ImageConvol)
26 | rft_generic (ImageConvol, ImageFiltered, 'from_freq', 'n','byte', Width)
27 | *使用纹理滤波器提取缺陷部位
28 | texture_laws (ImageFiltered, ImageTexture, 'el',3, 5)
29 | *使用阈值处理等方式,根据灰度差异将缺陷部位选择出来
30 | threshold (ImageTexture, Imagelight, 150, 255)
31 | connection (Imagelight, ConnectedRegions)
32 | *根据形状的面积选择最大的区域
33 | select_shape_std (ConnectedRegions, SelectedRegion, 'max_area', 70)
34 | area_center (SelectedRegion, Area, Row, Column)
35 | gen_circle (Circle, Row, Column, 30)
36 | *显示缺陷检测结果
37 | dev_clear_window()
38 | dev_display(ImageGray)
39 | dev_display (Circle)
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
--------------------------------------------------------------------------------
/16-4.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | *关闭当前窗口
7 | dev_close_window ()
8 | read_image (Image, 'data/cloth4')
9 | get_image_size (Image, Width, Height)
10 | dev_open_window (0, 0, Width/2, Height/2, 'black', WindowHandle)
11 | dev_set_line_width (4)
12 | *创建两个高斯滤波器
13 | gen_gauss_filter (GaussFilter1, 30.0, 30.0, 0.0, 'none', 'rft', Width, Height)
14 | gen_gauss_filter (GaussFilter2,3.0, 3.0, 0.0, 'none', 'rft', Width, Height)
15 | sub_image (GaussFilter1, GaussFilter2, Filter, 1, 0)
16 | rgb1_to_gray (Image, ImageGray)
17 | *对图像进行傅里叶变换,滤波以及还原
18 | rft_generic (ImageGray, ImageFFT, 'to_freq', 'none', 'complex', Width)
19 | convol_fft (ImageFFT, Filter, ImageConvol)
20 | rft_generic (ImageConvol, ImageFiltered, 'from_freq', 'n', 'real', Width)
21 | scale_image_range (ImageFiltered, ImageScaled, 0, 255)
22 | *使用形态学方法提取污染区域
23 | threshold (ImageScaled, Region, 0, 1)
24 | erosion_circle (Region, RegionErosion, 11.5)
25 | connection (RegionErosion, ConnectedRegions)
26 | select_shape_std (ConnectedRegions, SelectedRegions, 'max_area', 70)
27 | dilation_circle (SelectedRegions, RegionDirty, 9.5)
28 | *显示提取结果
29 | dev_display (Image)
30 | dev_set_draw ('margin')
31 | dev_display (RegionDirty)
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
--------------------------------------------------------------------------------
/17-2.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | *清空显示窗口
7 | dev_close_window()
8 | *读取模板图像。这里的模板图像是单通道灰度图像,如果是彩色的,还需要做一步转换
9 | read_image(ModelImage, 'data/meter1')
10 | *获取图像的尺寸,便于创建合适的窗口进行显示
11 | get_image_size(ModelImage, Width, Height)
12 | *创建窗口并设置显示参数
13 | dev_open_window (0, 0, Width, Height, 'white', WindowHandle)
14 | dev_display (ModelImage)
15 | dev_set_color ('yellow')
16 | dev_set_line_width (5)
17 |
18 | *设置指针区域的多边形形状坐标
19 | Rows := [410,308,312,327,428,410]
20 | Cols := [135,267,283,283,143,135 ]
21 | *创建形状多边形,该多边形区域应完全的覆盖指针所在的区域。该区域即为感兴趣区域
22 | gen_region_polygon_filled (ROI, Rows, Cols)
23 | *创建参考图像,从原模板图像中裁剪出多边形形状区域
24 | reduce_domain (ModelImage, ROI, ImageROI)
25 |
26 | *检查形状模板参数,查看金字塔层级的图像
27 | inspect_shape_model (ImageROI, ShapeModelImages, ShapeModelRegions, 2, 50)
28 | *显示形状模板图像。以此检查形状模板区域是否理想
29 | dev_display (ShapeModelRegions)
30 | *创建形状模板
31 | create_shape_model (ImageROI, 2, 0, rad(360270), 'auto', 'none', 'ignore_global_polarity', 20, 10,ModelID)
32 | *获取形状模板的轮廓。用于匹配成功后的显示
33 | get_shape_model_contours (ShapeModel, ModelID, 1)
34 |
35 | *读取要检测的图像。这里的检测图像也是单通道灰度图像,如果是彩色的,还需要做一步转换
36 | read_image(SearchImage, 'data/meter2')
37 | *进行基于形状模板的匹配,在图中寻找到指针的位置。
38 | *返回指针的坐标,旋转角度,以及匹配分数
39 | find_shape_model (SearchImage, ModelID, -rad(360900), rad(360270), 0.7, 1, 0.5, 'least_squares', 0, 0.7, RowCheck, ColumnCheck, AngleCheck, Score)
40 |
41 | *如果匹配分数达到要求,则匹配成功
42 | if (|Score| > 0.9)
43 | *用于从匹配结果数据中创建一个刚体的仿射变换矩阵
44 | vector_angle_to_rigid (0, 0, 0, RowCheck, ColumnCheck, AngleCheck,MovementOfObject)
45 | *将形状模板进行仿射变换,使之显示在指针的新位置上
46 | affine_trans_contour_xld (ShapeModel, ModelAtNewPosition, MovementOfObject)
47 | *将匹配结果显示出来
48 | dev_display (SearchImage)
49 | dev_display (ModelAtNewPosition)
50 | endif
51 | *匹配结束,释放模板资源
52 | clear_shape_model (ModelID)
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
--------------------------------------------------------------------------------
/18-4.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | read_image(ImageRec1,'data/stereo-left')
7 | read_image(ImageRec2,'data/stereo-right')
8 | binocular_disparity (ImageRec1, ImageRec2, Disparity, Score, 'ncc', 11, 11, 0, -150, 30, 4, 0.6, 'none', 'none')
9 | *将整幅视差图像转换为3d点图。
10 | *计算后输出的三张图,三张图的灰度分别表示视差图中的对应位置的点在X, Y, Z轴的坐标
11 | CamParamRect1 := [0.0121606, 0.0, 1.48e-005, 1.48e-005, -101.343, 120.681, 337, 242]
12 | CamParamRect2:=[0.0121606, 0.0, 1.48e-005, 1.48e-005, 546.365, 120.681, 364, 242]
13 | Cam1PoseRect1:=[0.158487, 0.0, 0.0, 0.0, 0.0, 0.0, 0]
14 | disparity_image_to_xyz(Disparity, ImgX, ImgY, ImgZ,CamParamRect1, CamParamRect2, Cam1PoseRect1)
15 | *释放相机资源
16 | *close_framegrabber(AcqHandle1)
17 | *close_framegrabber(AcqHandle2)
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/5-1.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | *关闭当前显示窗口,清空屏幕
7 | dev_close_window ()
8 | *读取测试图像
9 | read_image (Image_display, 'data/display.jpg')
10 | *将图像转化为灰度图像
11 | rgb1_to_gray (Image_display, GrayImage)
12 | *获取图像的尺寸
13 | get_image_size(Image_display,imageWidth, imageHeight)
14 | *新建显示窗口,适应图像尺寸
15 | dev_open_window (0, 0, imageWidth, imageHeight, 'black', WindowHandle1)
16 | dev_display (GrayImage)
17 | *初始化角点坐标
18 | XCoordCorners := []
19 | YCoordCorners := []
20 | *阈值处理,提取较暗的区域
21 | threshold(GrayImage,DarkRegion,0, 80)
22 | *分离不相连的区域
23 | connection (DarkRegion, ConnectedRegions)
24 | *选择面积最大的暗色区域,即屏幕区域
25 | select_shape_std (ConnectedRegions, displayRegion, 'max_area', 70)
26 | *裁剪屏幕区域
27 | reduce_domain (GrayImage, displayRegion, displayImage)
28 | *创建边缘轮廓
29 | gen_contour_region_xld (displayRegion, Contours, 'border')
30 | *将轮廓分割为边
31 | segment_contours_xld (Contours, ContoursSplit, 'lines', 5, 4, 2)
32 | *获取边的数量
33 | count_obj (ContoursSplit, Number)
34 | *存储每条边的起点位置
35 | for index:=1 to Number by 1
36 | select_obj(ContoursSplit, ObjectCurrent, index)
37 | *拟合每条边
38 | fit_line_contour_xld (ObjectCurrent, 'tukey', -1, 0, 5, 2, RowBegin, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist)
39 | *存储每条边的顶点x坐标
40 | tuple_concat (XCoordCorners, RowBegin, XCoordCorners)
41 | *存储每条边的顶点y坐标
42 | tuple_concat (YCoordCorners, ColBegin, YCoordCorners)
43 | endfor
44 |
45 | * 投影变换给四个特征点与校正后的坐标建立关联
46 | XOff:= 100
47 | YOff:= 100*imageHeight/imageWidth
48 | hom_vector_to_proj_hom_mat2d (XCoordCorners, YCoordCorners, [1,1,1,1], [YOff,YOff,imageHeight-YOff,imageHeight-YOff], [XOff,imageWidth-XOff,imageWidth-XOff,XOff], [1,1,1,1], 'normalized_dlt', HomMat2D)
49 | *投影变换
50 | projective_trans_image (Image_display, Image_rectified, HomMat2D, 'bilinear', 'false', 'false')
51 | * 显示校正结果
52 | dev_display (Image_rectified)
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
--------------------------------------------------------------------------------
/5-10.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | read_image (ImageNoise, 'data/marker.jpg')
7 | gauss_filter(ImageNoise, ImageGauss, 5)
8 | dev_display(ImageGauss)
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/5-11.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | read_image (test, 'data/label')
7 | *通道分离
8 | decompose3(test, image1, image2, image3)
9 | mean_image (image1, Mean1, 9, 9)
10 | emphasize (Mean1, em1, 5, 5, 1.5)
11 | illuminate (em1, ImageI1, 20, 20, 0.55)
12 | equ_histo_image (image2, ImageEquHisto2)
13 | equ_histo_image (image3, ImageEquHisto3)
14 | compose3 (ImageI1, ImageEquHisto2, ImageEquHisto3, MultiChannelImage)
15 | dev_display(MultiChannelImage)
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/5-2.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | *关闭当前显示窗口,清空屏幕
7 | dev_close_window ()
8 | *读取测试图像
9 | read_image (Image_display, 'data/display.jpg')
10 | *获取图像的尺寸
11 | get_image_size(Image_display,imageWidth, imageHeight)
12 | *新建显示窗口,适应图像尺寸
13 | dev_open_window (0, 0, imageWidth, imageHeight, 'black', WindowHandle)
14 | dev_display (Image_display)
15 | gen_rectangle1 (ROI_0, 52, 46, 456, 574)
16 | *裁剪屏幕区域
17 | reduce_domain (Image_display, ROI_0, reducedImage)
18 | dev_open_window (0, 400, imageWidth, imageHeight, 'black', WindowHandle1)
19 | * 显示校正结果
20 | dev_display (reducedImage)
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/5-3.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | read_image (board, 'data/boardEqu')
7 | rgb1_to_gray (board, GrayImage)
8 | equ_histo_image (GrayImage, ImageEquHisto)
9 | *显示直方图
10 | gray_histo (board, board, AbsoluteHisto1, RelativeHisto1)
11 | gray_histo (ImageEquHisto, ImageEquHisto, AbsoluteHisto2, RelativeHisto2)
12 | dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
13 | dev_set_color ('red')
14 | gen_region_histo (Histo1, AbsoluteHisto1, 255, 5, 1)
15 | dev_set_color ('green')
16 | gen_region_histo (Histo2, AbsoluteHisto2, 255, 450, 1)
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/5-5.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | read_image (boardtext, 'calinderdata/text.jpg')
7 | emphasize (boardtext, ImageEmphasize, 10, 10, 1.5)
8 | dev_display(ImageEmphasize)
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/5-6.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | read_image (text, 'data/text.jpg')
7 | scale_image_max (text, ImageScaleMax)
8 | dev_display(ImageScaleMax)
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/5-7.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | read_image (test, 'data/defocusComponnet.jpg')
7 | shock_filter (test, SharpenedImage, 0.5, 20, 'canny', 12.5)
8 | dev_display(SharpenedImage)
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/5-8.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | read_image (ImageNoise, 'data/marker.jpg')
7 | mean_image (ImageNoise, ImageMean, 9,9)
8 | dev_display(ImageMean)
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/5-9.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | read_image (ImageNoise, 'data/marker.jpg')
7 | median_image (ImageNoise, ImageMedian, 'circle', 3, 'continued')
8 | dev_display(ImageMedian)
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/6-1.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | read_image (Image,'data/codes.jpg')
7 | rgb1_to_gray (Image, GrayImage)
8 | threshold (GrayImage, DarkArea, 0, 128)
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/6-10.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | read_image (Image, 'data/village')
7 | *对原图进行了均值处理,选用了“circle”类型的中值滤波器
8 | median_image (Image, ImageMedian, 'circle', 2, 'mirrored')
9 | *使用了区域生长算子寻找颜色相似的邻域
10 | regiongrowing (ImageMedian, Regions, 1, 1, 3, 500)
11 | *对图像进行粗略的区域分割,提取满足条件的各个独立区域
12 | shape_trans (Regions, Centers, 'inner_center')
13 | connection (Centers, SingleCenters)
14 | *对初步提取的区域计算出了中心点坐标
15 | area_center (SingleCenters, Area, Row, Column)
16 | *以均值灰度图像为输入,进行区域生长计算,计算的起始坐标为上一步的各区域中心
17 | regiongrowing_mean (ImageMedian, RegionsMean, Row, Column, 25, 100)
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/6-11.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | *输入待检测的木材图像
7 | read_image (Image, 'data/woodboard')
8 | *将原始图转化为灰度图。便与后续的平滑处理
9 | rgb1_to_gray (Image, GrayImage)
10 | *对单通道图像进行高斯平滑处理,以去除噪声
11 | gauss_filter (GrayImage, ImageGauss, 11)
12 | *对高斯平滑后的图像进行分水岭处理,阈值分割,提取出盆地区域
13 | watersheds (ImageGauss, Basins1, Watersheds)
14 | watersheds_threshold(ImageGauss, Basins, 50)
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/6-2.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | read_image (Image,'data/shapes')
7 | rgb1_to_gray (Image, GrayImage)
8 | auto_threshold(GrayImage,Regions,8.0)
9 | **下面是直方图波形对比
10 | *gray_histo (GrayImage, GrayImage, AbsoluteHisto1, RelativeHisto1)
11 | *gen_region_histo (Histo1, AbsoluteHisto1, 255, 5, 1)
12 | *dev_clear_window ()
13 | *create_funct_1d_array (AbsoluteHisto1, Function)
14 | *smooth_funct_1d_gauss (Function, 8.0, SmoothedFunction)
15 | *dev_set_color ('red')
16 | *funct_1d_to_pairs (SmoothedFunction, XValues, YValues)
17 | *gen_region_histo (Histo2, YValues, 255, 255, 1)
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/6-4.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | read_image (Image, 'data/codes.jpg')
7 | rgb1_to_gray (Image, GrayImage)
8 | binary_threshold (GrayImage, RegionMaxSeparabilityLight, 'max_separability', 'dark', UsedThreshold)
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/6-5.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | read_image (Image, 'data/text.jpg')
7 | *将图像转换为灰度
8 | rgb1_to_gray (Image, GrayImage)
9 | *由于图像对比度比较低,对图像进行相乘,增强对比度
10 | mult_image (GrayImage, GrayImage, ImageResult, 0.005, 0)
11 | *使用平滑滤波器对原始图像进行适当平滑
12 | mean_image (ImageResult, ImageMean, 50,50)
13 | *动态阈值分割,提取字符区域
14 | dyn_threshold (ImageResult, ImageMean, RegionDynThresh, 4, 'not_equal')
15 | *开运算,去除无意义的小的杂点
16 | opening_circle (RegionDynThresh, RegionOpening, 1.5)
17 | dev_clear_window()
18 | dev_display (RegionOpening)
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/6-6.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | read_image (Image, 'data/garlic')
7 | *将图像转换为灰度
8 | rgb1_to_gray (Image, GrayImage)
9 | *使用平滑滤波器对原始图像进行适当平滑
10 | mean_image (GrayImage, ImageMean, 30,30)
11 | *动态阈值分割,提取字符区域
12 | dyn_threshold (GrayImage, ImageMean, RegionDynThresh, 30, 'not_equal')
13 | *腐蚀操作,去除杂点
14 | erosion_circle (RegionDynThresh, RegionClosing, 1.5)
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/6-7.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | read_image (Image,'data/holes.jpg')
7 | rgb1_to_gray (Image, GrayImage)
8 | *设置矩形,选择感兴趣区域
9 | gen_rectangle1 (Rectangle, 170, 80, 370, 510)
10 | reduce_domain (GrayImage, Rectangle, ImageReduced)
11 | var_threshold (ImageReduced, Region, 15, 15, 0.2, 35, 'dark')
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/6-8.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | read_image (Char, 'data/char')
7 | rgb1_to_gray (Char, GrayImage)
8 | char_threshold (GrayImage, GrayImage, Characters, 6, 95, Threshold)
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/6-9.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | read_image(Image,'data/village')
7 | *对原图进行了均值处理,选用了5*5的滤波器
8 | mean_image(Image,Mean,5,5)
9 | *使用了区域生长算子寻找颜色相似的邻域
10 | regiongrowing(Mean,Regions,1,1,3.0,100)
11 | *对提取区域做了形态学处理,使区域更加平滑和完整
12 | closing_circle (Regions, RegionClosing, 3.5)
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/7-3.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | read_image (Image, 'data/beads.jpg')
7 | decompose3 (Image, Red, Green, Blue)
8 | sub_image (Blue, Red, BlueSubRed, 1, 128)
9 | sub_image (BlueSubRed, Green, BlueSubRedGreen, 1, 128)
10 | threshold (BlueSubRedGreen, BlueRegion, 230, 255)
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/7-4.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | read_image (Image, 'data/m105')
7 | *将原始图像进行通道分离,得到红绿蓝三个分量的图像
8 | decompose3 (Image, Red, Green, Blue)
9 | *将RGB三个分量的图像转化为H(色调)、S(饱和度)、V(明度)的图像
10 | trans_from_rgb (Red, Green, Blue, ImageResultH, ImageResultS, ImageResultI, 'hsv')
11 | *对饱和度图像阈值处理,分割出高饱和度区域,即字符区域的大致范围
12 | threshold (ImageResultS, High, 192,255)
13 | *区域分割,
14 | reduce_domain (ImageResultH, High, ImageReduced)
15 | *并进行膨胀操作
16 | dilation_circle (ImageReduced, RegionDilation, 3.5)
17 | *开运算,使边缘更清晰
18 | opening_circle (RegionDilation, RegionChars, 5.5)
19 | dev_clear_window ()
20 | dev_display (RegionChars)
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/7-5.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | read_image(Image, 'data/cloth')
7 | *将图像分解成RGB三个通道
8 | decompose3 (Image, Image1, Image2, Image3)
9 | *将RGB三个通道的图像,转化为HSV图像空间
10 | trans_from_rgb (Image1, Image2, Image3, ImageResult1, ImageResult2, ImageResult3, 'hsv')
11 | *进行纹理检测。
12 | *其中选择的滤波器类型是‘ls’,即行方向用‘level’,列方向用‘spot’进行检测。
13 | *这种滤波器类型适合检测垂直方向上的缺陷。
14 | texture_laws (ImageResult2, ImageTextureLS, 'ls', 2, 7)
15 | *对滤波器处理后的图像进行均值化,使图像更平滑,缺陷区域明显
16 | mean_image (ImageTextureLS, ImageMean, 11, 11)
17 | *对检测出的缺陷区域进行形态学处理并显示出来
18 | threshold (ImageMean, Regions, 60, 255)
19 | *将符合条件的区域分隔成独立区域
20 | connection(Regions, ConnectedRegions)
21 | *计算各区域的面积,提取出面积最大的区域
22 | area_center (ConnectedRegions, Area, Row, Column)
23 | select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', max(Area), 99999)
24 | *做闭运算,提取出缺陷区域
25 | closing_circle(SelectedRegions, RegionClosing, 11.5)
26 | dev_clear_window ()
27 | dev_display (RegionClosing)
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
--------------------------------------------------------------------------------
/8-10.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | read_image (ImageColor, 'data/village.jpg')
7 | *将原始图像转换为灰度图像作为形态学处理的输入
8 | rgb1_to_gray (ImageColor, Image)
9 | *进行灰度图像腐蚀操作
10 | gray_erosion_shape (Image, ImageMin, 11, 11, 'octagon')
11 | *进行灰度图像膨胀操作
12 | gray_dilation_shape (Image, ImageMax, 11, 11, 'octagon')
13 | *进行灰度图像开运算操作
14 | gray_opening_shape (Image, ImageOpening, 7, 7, 'octagon')
15 | *进行灰度图像闭运算操作
16 | gray_closing_shape (Image, ImageClosing, 7, 7, 'octagon')
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/8-12.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | dev_close_window ()
7 | *读取图像,将其转化为灰度图像并显示出来
8 | read_image (Image, 'data/logs')
9 | get_image_size (Image, Width, Height)
10 | rgb1_to_gray(Image,grayImage)
11 | *进行全局阈值分割,将亮色区域提取出来
12 | threshold (grayImage, Bright, 60, 255)
13 | *开运算去除边缘毛刺
14 | opening_rectangle1 (Bright, Cut, 1, 7)
15 | *将非连通区域分割成独立区域
16 | connection (Cut, ConnectedRegions)
17 | *根据面积选择表示截面比较小的木材的区域
18 | select_shape (ConnectedRegions, smallRegions, 'area', 'and', 500, 20000)
19 | *对粘连区域做腐蚀操作,根据腐蚀的情况和面积,选出截面区域
20 | *count_obj(SelectedRegions2,number1)
21 | *根据面积选择表示截面比较大的木材的区域,可能有粘连和区域重叠的情况
22 | select_shape (ConnectedRegions, largeRegions, 'area', 'and', 20000, 1000000)
23 | erosion_circle(largeRegions,erisionedLargeRegions,8.5)
24 | *将非连通区域分割成独立区域
25 | connection (erisionedLargeRegions, ConnectedRegions2)
26 | *再次选择符合面积条件的区域,排除杂点
27 | select_shape (ConnectedRegions2, SelectedRegions3, 'area', 'and', 150, 200000)
28 | *区域合并
29 | concat_obj(smallRegions, SelectedRegions3, ObjectsConcat)
30 | *区域计数
31 | count_obj(ObjectsConcat,number3)
32 | *创建窗口用于显示结果
33 | dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
34 | dev_display(ObjectsConcat)
35 | set_display_font (WindowHandle,18, 'mono', 'true', 'true')
36 | *显示计数的结果,程序结束
37 | disp_message(WindowHandle, 'Number of logs : '+number3, 'image', 30, 50, 'blue', 'true')
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
--------------------------------------------------------------------------------
/8-2.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | read_image (Image, 'data/board')
7 | rgb1_to_gray (Image, GrayImage)
8 | threshold (GrayImage, Region, 100, 255)
9 | gen_image_proto (GrayImage, ImageCleared, 0)
10 | erosion_circle (Region, RegionErosion, 7.5)
11 | erosion_circle (RegionErosion, RegionErosion2, 6.5)
12 | dev_clear_window ()
13 | dev_display (RegionErosion2)
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/8-4.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | read_image (Image, 'data/board')
7 | rgb1_to_gray (Image, GrayImage)
8 | threshold (GrayImage, Region, 100, 255)
9 | erosion_circle (Region, RegionErosion, 7.5)
10 | erosion_circle (RegionErosion, RegionErosion2, 6.5)
11 | erosion_circle (RegionErosion2, RegionErosion3, 5.5)
12 | *膨胀操作
13 | dilation_circle (RegionErosion3, RegionDilation, 23.5)
14 | dev_clear_window ()
15 | dev_display (RegionDilation)
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/8-5.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | *读取待检测的图像
7 | read_image (Image,'data/board')
8 | *将图像转换为单通道的灰度图像
9 | rgb1_to_gray(Image, GrayImage)
10 | *创建矩形区域
11 | gen_rectangle1 (Rectangle, 259, 87, 957, 909)
12 | *进行裁剪,将感兴趣区域单独提取出来
13 | reduce_domain (GrayImage, Rectangle, ImageReduced)
14 | *使用阈值处理将灰度值于设定的像素选取出来
15 | threshold(ImageReduced,Light,85,255)
16 | *创建圆形结构元素,用于开运算
17 | gen_circle(StructElement,6,6,7)
18 | *进行开运算去除背景中的杂点
19 | opening(Light,StructElement,Large)
20 | dev_clear_window ()
21 | dev_display (Large)
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/8-6.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | read_image (Image,'data/shapes')
7 | *将图像进行通道分解,分别转换为三个通道的RGB图像
8 | decompose3 (Image, Red, Green, Blue)
9 | *使用颜色转换将RGB三个通道图像转化为HSV通道的图像
10 | trans_from_rgb (Red, Green, Blue, Hue, Saturation, Intensity, 'hsv')
11 | *对饱和度通道的图像进行阈值处理
12 | threshold (Saturation, Regions, 180, 255)
13 | *创建圆形结构元素用于闭运算
14 | gen_circle(StructElement,10,10,10)
15 | *对图像中较亮的区域进行闭运算处理,填补了各自轮廓中的小空隙
16 | closing(Regions,StructElement,Large)
17 |
18 | dev_clear_window ()
19 | dev_display (Large)
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/8-7.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | read_image (Image,'data/board')
7 | rgb1_to_gray(Image, GrayImage)
8 | gen_rectangle1 (Rectangle, 259, 87, 957, 909)
9 | reduce_domain (GrayImage, Rectangle, ImageReduced)
10 | threshold(ImageReduced,Light,85,255)
11 | gen_circle(StructElement,6,6,7)
12 | *清理显示窗口,以便显示结果
13 | dev_clear_window ()
14 | *进行顶帽运算,得到了开运算中移除的局部像素并高亮显示
15 | top_hat (Light, StructElement, RegionTopHat)
16 |
17 | dev_clear_window ()
18 | dev_display (RegionTopHat)
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/8-8.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | read_image (Image,'data/shapes')
7 | decompose3 (Image, Red, Green, Blue)
8 | trans_from_rgb (Red, Green, Blue, Hue, Saturation, Intensity, 'hsv')
9 | threshold (Saturation, Regions, 180, 255)
10 | gen_circle(StructElement,10,10,10)
11 | *清理显示窗口,以便显示结果
12 | dev_clear_window ()
13 | *清理显示窗口,以便显示结果
14 | bottom_hat (Regions, StructElement, RegionBottomHat)
15 | dev_clear_window ()
16 | dev_display (RegionBottomHat)
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/8-9.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | *读取一幅光照不均匀的亮背景图像,这里选取的是一幅彩色图像
7 | read_image (Image,'data/shapes')
8 | *变换之前转为灰度图像
9 | rgb1_to_gray (Image, GrayImage)
10 | *将图像通过阈值处理转化为二值化图像。
11 | threshold (GrayImage, Regions, 145, 255)
12 | *创建一个结构元素,这里创建的是一个圆形
13 | gen_circle(StructElement,10,10,100)
14 | *清空窗口便于显示结果
15 | dev_clear_window ()
16 | *进行底帽操作,提取出较暗区域
17 | bottom_hat (Regions, StructElement, RegionBottomHat)
18 | *将较暗区域从原图中提取出来
19 | reduce_domain (Image, RegionBottomHat, ImageReduced)
20 |
21 | dev_clear_window ()
22 | dev_display (ImageReduced)
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/9-1.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | dev_close_window ()
7 | *读取图片
8 | read_image(Image, 'data/holes')
9 | *设置窗口属性,为了获取窗口句柄,供后面显示文字用
10 | get_image_size (Image, Width, Height)
11 | *创建新窗口
12 | dev_open_window (0, 0, Width, Height, 'black', WindowID)
13 | *将图像转化为单通道灰度图
14 | rgb1_to_gray (Image, GrayImage)
15 | *创建矩形选区,选择感兴趣部分
16 | gen_rectangle1 (Rectangle, 180, 83, 371, 522)
17 | reduce_domain (GrayImage, Rectangle, ROI)
18 | *阈值处理,提取图中深色部分,也就是文字部分,这里阈值设置为50,基本可以取出所有黑色文字
19 | threshold ( ROI, Region, 0, 80)
20 | *gen_image_proto (ImageReduced, ImageCleared, 0)
21 | *dev_display (Region)
22 | *提取中的整个区域中将不相连的部分分割成独立的区域
23 | connection (Region, ConnectedRegions)
24 | *获取不相连的区域的数量
25 | count_obj (ConnectedRegions, Num)
26 | *计算所有不相连区域的面积和中心点坐标。Area表示面积, Row和 Column分别表示中心点坐标
27 | area_center (ConnectedRegions, Area, Row, Column)
28 | *打印各区域的面积
29 | for i := 1 to Num by 1
30 | dev_set_color ('red')
31 | select_obj (ConnectedRegions, ObjectSelected, i)
32 | *设定了输出文字的起始坐标点
33 | set_tposition (WindowID, Row[i - 1]+40, Column[i - 1])
34 | *设置打印文字的颜色
35 | dev_set_color ('blue')
36 | *设置字体
37 | set_font (WindowID, '-System-32-*-*-0-0-0-1-GB2312_CHARSET-')
38 | *输出文字内容,即该区域的面积
39 | write_string (WindowID, Area[i-1])
40 | endfor
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/9-11.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | dev_close_window ()
7 | *读取输入的图片
8 | read_image (Image, 'data/board')
9 | *将输入的彩色图像转为黑白图像
10 | rgb1_to_gray (Image, GrayImage)
11 | get_image_size (GrayImage, Width, Height)
12 | *创建一个与输入图像同样大小的窗口
13 | dev_open_window (0, 0, Width/4, Height/4, 'black', WindowID)
14 | *设定画笔宽度
15 | dev_set_line_width (5)
16 | *创建两个窗口用于显示参数计算的结果
17 | dev_open_window (0, 512, 320, 320, 'black', WindowID1)
18 | dev_open_window (512, 512, 320, 320, 'black', WindowID2)
19 | *分别设置两个矩阵,选择不同的两部分区域
20 | gen_rectangle1 (Rectangle1, 200,10, 380, 190)
21 | gen_rectangle1 (Rectangle2, 580, 650, 730, 800)
22 | *分别对两个矩形求取灰度共生矩阵Matrix1和Matrix2
23 | gen_cooc_matrix (Rectangle1, GrayImage, Matrix1, 6, 0)
24 | gen_cooc_matrix (Rectangle2, GrayImage, Matrix2, 6, 0)
25 | *分别对Matrix1和Matrix2提取灰度特征参数
26 | cooc_feature_matrix (Matrix1, Energy1, Correlation1, Homogeneity1, Contrast1)
27 | cooc_feature_matrix (Matrix2, Energy2, Correlation2, Homogeneity2, Contrast2)
28 | *采取另一种方式,直接对矩阵2的图像求灰度特征参数,结果与上面两步计算出的参数是一致的
29 | cooc_feature_image (Rectangle2, GrayImage, 6, 0, Energy3, Correlation3, Homogeneity3, Contrast3)
30 | *显示图像窗口和两个矩形的灰度共生矩阵
31 | dev_set_window (WindowID)
32 | dev_set_draw ('margin')
33 | dev_display (GrayImage)
34 | dev_display (Rectangle1)
35 | dev_set_color('yellow')
36 | dev_display (Rectangle2)
37 | dev_set_window (WindowID1)
38 | dev_display (Matrix1)
39 | *以字符串的形式,分别在两个矩阵的对应窗口上显示灰度特征值的计算结果
40 | String := ['Energy: ','Correlation: ','Homogeneity: ','Contrast: ']
41 | dev_set_color('red')
42 | disp_message (WindowID1, String$'-14s' + [Energy1,Correlation1,Homogeneity1,Contrast1]$'6.3f', 'window', 12, 12, 'white', 'false')
43 | dev_set_window (WindowID2)
44 | dev_display (Matrix2)
45 | dev_set_color('yellow')
46 | String := ['Energy: ','Correlation: ','Homogeneity: ','Contrast: ']
47 | disp_message (WindowID2, String$'-14s' + [Energy2,Correlation2,Homogeneity2,Contrast2]$'6.3f', 'window', 12, 12, 'white', 'false')
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
--------------------------------------------------------------------------------
/9-2.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | *清空显示窗口
7 | dev_close_window ()
8 | *读取包含孔洞的图片
9 | read_image (Image, 'data/holes2')
10 | *打开新的显示窗口
11 | dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
12 | *将彩色图像转化为灰度图像,这是为了后面的图像二值化
13 | rgb1_to_gray (Image, GrayImage)
14 | *进行阈值处理,提取出图中较亮的有封闭区域的(孔洞以外)背景区域
15 | threshold (GrayImage, Region, 50,255)
16 | *将背景区域作为area_holes算子的输入,计算所有孔洞的面积
17 | area_holes (Region, Area)
18 | *将面积计算结果以字符串形式显示在窗口中
19 | disp_message (WindowHandle, 'Size of holes: ' + Area + ' pixel', 'window', 10, 10, 'black', 'true')
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/9-3.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | *清空显示窗口
7 | dev_close_window ()
8 | *读取待检测的图像
9 | read_image (Image, 'data/crossShape')
10 | dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
11 | *设置系统绘制的颜色
12 | dev_set_color ('white')
13 | *将彩色图像转化为灰度图像,这是为了后面的图像二值化
14 | rgb1_to_gray (Image, GrayImage)
15 | *创建矩形选区,选择感兴趣部分
16 | gen_rectangle1 (Rectangle, 100, 127, 325, 490)
17 | reduce_domain (GrayImage, Rectangle, ROI)
18 | gen_image_proto (ROI, ImageCleared, 0)
19 | *进行阈值处理,提取出图中较暗的包含了孔洞的区域
20 | threshold (ROI, Regions, 50, 255)
21 | *将其不连通的部分独立分割出来,成为一组区域
22 | connection (Regions, ConnectedRegions)
23 | *设置系统绘制的颜色。为了标记选择的区域
24 | dev_set_color ('yellow')
25 | *方法一
26 | *将阈值处理的结果区域作为select_shape算子的输入,根据区域的宽度,选择出目标
27 | select_shape (ConnectedRegions, SelectedRegions1, 'area', 'and', 1000, 99999)
28 | *方法二
29 | *先计算面积,再选择出面积最大的目标
30 | area_center(ConnectedRegions, Area, Row, Column)
31 | select_shape (ConnectedRegions, SelectedRegions2, 'area', 'and', max(Area), 99999)
32 | *方法三
33 | select_shape_std (SelectedRegions1, SelectedRegion3, 'max_area', 70)
34 | dev_clear_window ()
35 | dev_display (SelectedRegion3)
36 |
37 |
38 |
39 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/9-4.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | dev_close_window ()
7 | *读取图像
8 | read_image (Image, 'data/crossShape')
9 | get_image_size (Image, Width, Height)
10 | dev_open_window (0, 0, Width, Height, 'black', WindowID)
11 | rgb1_to_gray (Image, GrayImage)
12 | *创建矩形选区,选择感兴趣部分
13 | gen_rectangle1 (Rectangle, 100, 127, 325, 490)
14 | reduce_domain (GrayImage, Rectangle, ROI)
15 | *进行阈值处理,提取出图中较暗的包含了孔洞的区域
16 | threshold (ROI, Regions, 50, 255)
17 | *将其不连通的部分独立分割出来,成为一组区域
18 | connection (Regions, ConnectedRegions)
19 | select_shape_std (ConnectedRegions, SelectedRegion3, 'max_area', 70)
20 | dev_set_draw ('fill')
21 | *求出了三个区域的最大内接圆的中心和半径
22 | inner_circle(SelectedRegion3,Row,Column,Radius)
23 | *绘制圆形
24 | gen_circle(Circles,Row,Column,Radius)
25 | dev_set_window (WindowID)
26 | *gen_image_proto (ROI, ImageCleared, 0)
27 | *dev_display (SelectedRegion3)
28 | *绘制形状的边缘
29 | dev_set_draw ('margin')
30 | dev_set_line_width (3)
31 | *显示内接圆形
32 | dev_display (Image)
33 | dev_display (Circles)
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
--------------------------------------------------------------------------------
/9-5.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | dev_close_window ()
7 | read_image (Image, 'data/garlic2')
8 | get_image_size (Image, Width, Height)
9 | dev_open_window (0, 0, Width/2, Height/2, 'black', WindowHandle)
10 | rgb1_to_gray (Image, GrayImage)
11 | *使阈值处理提取出了较暗的区域
12 | threshold (GrayImage, Region, 100, 255)
13 | *将非连通区域分割成一组区域的集合
14 | connection (Region, ConnectedRegions)
15 | *利用面积特征,将比较大快的区域分割出来
16 | select_shape(ConnectedRegions,selectRegion,'area','and',50000,200000)
17 | *求最小外接矩形
18 | smallest_rectangle2 (selectRegion, Row1, Column1, Phi, Length1, Length2)
19 | *根据矩形参数创建举行的轮廓
20 | gen_rectangle2_contour_xld (Rectangle1, Row1, Column1, Phi, Length1, Length2)
21 | *显示最小外接矩形
22 | dev_set_window (WindowHandle)
23 | dev_set_draw ('margin')
24 | dev_set_line_width (3)
25 | dev_display (Image)
26 | dev_display (Rectangle1)
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/9-9.hdev:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | *读取输入图像
7 | read_image (Image, 'data/village')
8 | *获取原始图像的宽和高
9 | get_image_size (Image, Width, Height)
10 | *创建同尺寸的显示图像的窗口
11 | dev_open_window (0, 0, Width, Height, 'white', WindowID)
12 | *将图像转化为灰度图像
13 | rgb1_to_gray (Image, GrayImage)
14 | *使用均值滤波对灰度图像进行平滑,以去除细节杂点
15 | median_image (GrayImage, ImageMedian, 'circle', 2, 'mirrored')
16 | *进行阈值处理,提取出较亮部分
17 | threshold (ImageMedian, BrightRegion, 180, 255)
18 | *使用开运算使各区域分离
19 | opening_circle (BrightRegion, RegionClosing, 6.5)
20 | *将不相连通的区域分割开来
21 | connection (RegionClosing, BrightRestConnection)
22 | *将面积较大的区域提取出来
23 | select_shape (BrightRestConnection, SelectedRegions1, 'area', 'and', 5000, 99999)
24 | *获取这些区域的均值和偏差。由于湖面区域灰度值比较平滑,灰度偏差会比较小
25 | intensity (SelectedRegions1, ImageMedian, Mean, Deviation)
26 | *以灰度偏差为条件,选出符合条件的区域
27 | select_gray (SelectedRegions1, ImageMedian, SelectedRegions, 'deviation', 'and', 4, 10)
28 | dev_clear_window ()
29 | dev_display (GrayImage)
30 | dev_display (SelectedRegions)
31 |
32 |
33 |
34 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/data/arrow1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/arrow1.jpg
--------------------------------------------------------------------------------
/data/arrow2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/arrow2.jpg
--------------------------------------------------------------------------------
/data/beads.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/beads.jpg
--------------------------------------------------------------------------------
/data/board.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/board.jpg
--------------------------------------------------------------------------------
/data/boardEqu.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/boardEqu.jpg
--------------------------------------------------------------------------------
/data/bolts-0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/bolts-0.jpg
--------------------------------------------------------------------------------
/data/bolts-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/bolts-1.jpg
--------------------------------------------------------------------------------
/data/carmex-0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/carmex-0.jpg
--------------------------------------------------------------------------------
/data/carmex-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/carmex-1.jpg
--------------------------------------------------------------------------------
/data/char.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/char.jpg
--------------------------------------------------------------------------------
/data/chess.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/chess.jpg
--------------------------------------------------------------------------------
/data/cloth.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/cloth.jpg
--------------------------------------------------------------------------------
/data/cloth1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/cloth1.jpg
--------------------------------------------------------------------------------
/data/cloth2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/cloth2.jpg
--------------------------------------------------------------------------------
/data/cloth3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/cloth3.jpg
--------------------------------------------------------------------------------
/data/cloth4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/cloth4.jpg
--------------------------------------------------------------------------------
/data/codes.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/codes.jpg
--------------------------------------------------------------------------------
/data/cream.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/cream.jpg
--------------------------------------------------------------------------------
/data/creamlabel.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/creamlabel.jpg
--------------------------------------------------------------------------------
/data/crossShape.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/crossShape.jpg
--------------------------------------------------------------------------------
/data/defocusComponnet.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/defocusComponnet.jpg
--------------------------------------------------------------------------------
/data/disparity.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/disparity.jpg
--------------------------------------------------------------------------------
/data/display.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/display.jpg
--------------------------------------------------------------------------------
/data/flower.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/flower.jpg
--------------------------------------------------------------------------------
/data/garlic.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/garlic.jpg
--------------------------------------------------------------------------------
/data/garlic2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/garlic2.jpg
--------------------------------------------------------------------------------
/data/holes.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/holes.jpg
--------------------------------------------------------------------------------
/data/holes2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/holes2.jpg
--------------------------------------------------------------------------------
/data/holesBoard.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/holesBoard.jpg
--------------------------------------------------------------------------------
/data/holesBoardNoise.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/holesBoardNoise.jpg
--------------------------------------------------------------------------------
/data/label.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/label.jpg
--------------------------------------------------------------------------------
/data/labelShape-0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/labelShape-0.jpg
--------------------------------------------------------------------------------
/data/labelShape-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/labelShape-1.jpg
--------------------------------------------------------------------------------
/data/logs.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/logs.jpg
--------------------------------------------------------------------------------
/data/m1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/m1.jpg
--------------------------------------------------------------------------------
/data/m105.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/m105.jpg
--------------------------------------------------------------------------------
/data/m2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/m2.jpg
--------------------------------------------------------------------------------
/data/m3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/m3.jpg
--------------------------------------------------------------------------------
/data/m4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/m4.jpg
--------------------------------------------------------------------------------
/data/m5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/m5.jpg
--------------------------------------------------------------------------------
/data/marker.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/marker.jpg
--------------------------------------------------------------------------------
/data/meter1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/meter1.jpg
--------------------------------------------------------------------------------
/data/meter2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/meter2.jpg
--------------------------------------------------------------------------------
/data/modelWords.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/modelWords.jpg
--------------------------------------------------------------------------------
/data/pen01.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/pen01.jpg
--------------------------------------------------------------------------------
/data/pen02.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/pen02.jpg
--------------------------------------------------------------------------------
/data/pen1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/pen1.jpg
--------------------------------------------------------------------------------
/data/pen2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/pen2.jpg
--------------------------------------------------------------------------------
/data/pen3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/pen3.jpg
--------------------------------------------------------------------------------
/data/shapes.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/shapes.jpg
--------------------------------------------------------------------------------
/data/stereo-left.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/stereo-left.jpg
--------------------------------------------------------------------------------
/data/stereo-right.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/stereo-right.jpg
--------------------------------------------------------------------------------
/data/testWords.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/testWords.jpg
--------------------------------------------------------------------------------
/data/text.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/text.jpg
--------------------------------------------------------------------------------
/data/village.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/village.jpg
--------------------------------------------------------------------------------
/data/woodboard.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/woodboard.jpg
--------------------------------------------------------------------------------
/data/yszx.omc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/yszx.omc
--------------------------------------------------------------------------------
/data/yszx.trf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ericting/halconCode/4ec333e25f3e654e03948baa1d4005d979902f7c/data/yszx.trf
--------------------------------------------------------------------------------