Halcon 学习笔记3 仿射变换
Posted mCat
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Halcon 学习笔记3 仿射变换相关的知识,希望对你有一定的参考价值。
像素的减少
开运算(较少)
腐蚀(去除更多)
对灰度图像的开运算或腐蚀 相当于将灰度图像变暗
像素增加
闭运算(较少)
膨胀(较多)
对灰度图像的闭运算或膨胀 相当于将灰度图像变亮
仿射变换
另外一种仿射变换
* This example demonstrates an application from the pharmaceutical * industry. The task is to check the content of automatically filled * blisters. The first image (reference) is used to locate the chambers * within a blister shape as a reference model, which is then used to * realign the subsequent images along to this reference shape. Using * blob analysis the content of each chamber is segmented and finally * classified by a few shape features. * dev_close_window () dev_update_off () read_image (ImageOrig, \'blister/blister_reference\') dev_open_window_fit_image (ImageOrig, 0, 0, -1, -1, WindowHandle) set_display_font (WindowHandle, 14, \'mono\', \'true\', \'false\') dev_set_draw (\'margin\') dev_set_line_width (3) * * In the first step, we create a pattern to cut out the chambers in the * subsequent blister images easily. access_channel (ImageOrig, Image1, 1) threshold (Image1, Region, 90, 255) shape_trans (Region, Blister, \'convex\') orientation_region (Blister, Phi)//计算角度Phi area_center (Blister, Area1, Row, Column)//获取面积和中心点坐标 *将原来的(Row, Column, Phi)表示为(Row, Column, 0),也就是将角度调正 *输出变换矩阵HomMat2D vector_angle_to_rigid (Row, Column, Phi, Row, Column, 0, HomMat2D) affine_trans_image (ImageOrig, Image2, HomMat2D, \'constant\', \'false\') gen_empty_obj (Chambers) for I := 0 to 4 by 1 Row := 88 + I * 70 for J := 0 to 2 by 1 Column := 163 + J * 150 gen_rectangle2 (Rectangle, Row, Column, 0, 64, 30) concat_obj (Chambers, Rectangle, Chambers) endfor endfor affine_trans_region (Blister, Blister, HomMat2D, \'nearest_neighbor\') difference (Blister, Chambers, Pattern) union1 (Chambers, ChambersUnion) orientation_region (Blister, PhiRef) PhiRef := rad(180) + PhiRef area_center (Blister, Area2, RowRef, ColumnRef) * * * Each image read will be aligned to this pattern and reduced to the area of interest, * which is the chambers of the blister Count := 6 for Index := 1 to Count by 1 read_image (Image, \'blister/blister_\' + Index$\'02\') threshold (Image, Region, 90, 255) connection (Region, ConnectedRegions) select_shape (ConnectedRegions, SelectedRegions, \'area\', \'and\', 5000, 9999999) shape_trans (SelectedRegions, RegionTrans, \'convex\') * * Align pattern along blister of image orientation_region (RegionTrans, Phi) area_center (RegionTrans, Area3, Row, Column) vector_angle_to_rigid (Row, Column, Phi, RowRef, ColumnRef, PhiRef, HomMat2D) affine_trans_image (Image, ImageAffineTrans, HomMat2D, \'constant\', \'false\') * * Segment pills reduce_domain (ImageAffineTrans, ChambersUnion, ImageReduced) decompose3 (ImageReduced, ImageR, ImageG, ImageB) var_threshold (ImageB, Region, 7, 7, 0.2, 2, \'dark\') connection (Region, ConnectedRegions0) closing_rectangle1 (ConnectedRegions0, ConnectedRegions, 3, 3) fill_up (ConnectedRegions, RegionFillUp) select_shape (RegionFillUp, SelectedRegions, \'area\', \'and\', 1000, 99999) opening_circle (SelectedRegions, RegionOpening, 4.5) connection (RegionOpening, ConnectedRegions) select_shape (ConnectedRegions, SelectedRegions, \'area\', \'and\', 1000, 99999) shape_trans (SelectedRegions, Pills, \'convex\') * * Classify segmentation results and display statistics count_obj (Chambers, Number) gen_empty_obj (WrongPill) gen_empty_obj (MissingPill) for I := 1 to Number by 1 select_obj (Chambers, Chamber, I) intersection (Chamber, Pills, Pill) area_center (Pill, Area, Row1, Column1) if (Area > 0) min_max_gray (Pill, ImageB, 0, Min, Max, Range) if (Area < 3800 or Min < 60) concat_obj (WrongPill, Pill, WrongPill) endif else concat_obj (MissingPill, Chamber, MissingPill) endif endfor * dev_clear_window () dev_display (ImageAffineTrans) dev_set_color (\'forest green\') count_obj (Pills, NumberP) count_obj (WrongPill, NumberWP) count_obj (MissingPill, NumberMP) dev_display (Pills) if (NumberMP > 0 or NumberWP > 0) disp_message (WindowHandle, \'Not OK\', \'window\', 12, 12 + 600, \'red\', \'true\') else disp_message (WindowHandle, \'OK\', \'window\', 12, 12 + 600, \'forest green\', \'true\') endif * Message := \'# Correct pills: \' + (NumberP - NumberWP) Message[1] := \'# Wrong pills : \' + NumberWP Message[2] := \'# Missing pills: \' + NumberMP * Colors := gen_tuple_const(3,\'black\') if (NumberWP > 0) Colors[1] := \'red\' endif if (NumberMP > 0) Colors[2] := \'red\' endif disp_message (WindowHandle, Message, \'window\', 12, 12, Colors, \'true\') dev_set_color (\'red\') dev_display (WrongPill) dev_display (MissingPill) if (Index < Count) disp_continue_message (WindowHandle, \'black\', \'true\') endif stop () endfor
仿射变换 理论
https://www.cnblogs.com/liekkas0626/p/5238564.html
以上是关于Halcon 学习笔记3 仿射变换的主要内容,如果未能解决你的问题,请参考以下文章