create_rectification_grid( : : Width, NumSquares, GridFile : )
create_rectification_grid生成一个带有NumSquares*NumSquares交替的黑白方块的方格图案。
这种图案宽高为Width米。
在图案周围有一个0.3倍于一个正方形宽度的内框,它延续了方格图案。
图案由一个0.7倍于一个正方形宽度的纯白色外框完成。
在图案的中心有两个圆形标记,一个黑色的在白色的正方形上,一个白色的在黑色的正方形上。
两个标记的半径对应于各自封闭正方形边长的三分之一。
gen_grid_correction fication_map使用这些标记将检测到的网格点布局旋转到正确的方向。
假设正确定位时,黑色标记位于白色标记的左侧。
文件GridFile包含纠正网格的PostScript描述。
1.find_rectification_grid(Image : GridRegion : MinContrast, Radius : )
find_rectification_grid在图像Image 中搜索包含矫正网格的图像部分,并将它们返回到GridRegion区域。
为了做到这一点,本质上,提取对比度至少为MinContrast的图像区域,并填充这些区域中的孔。
然后,一个半径为Radius 的开口应用于这些区域,以消除较小的区域的高对比度。
在网格矫正时,小心减少输入的区域的图像部分实际上包含的矫正网格是用于两个目的:
首先,可以减少计算时间,其次,saddle_points_sub_pix和connect_grid_points可以阻止检测错误的网格点和连接线。
2.connect_grid_points(Image : ConnectingLines : Row, Column, Sigma, MaxDist : )
connect_grid_points搜索矫正网格的网格点(Row, Column, )之间的连接线。
连接线由边缘检测器、平滑滤波器和各尺寸的线检测器组合从输入图像图像中提取。
尺寸为a,a用于确定以下部分:
当Sigma传入一个值时,使用这个值。
当传递一个包含三个值('sigma_min'、'sigma_max'、'sigma_step')的元组时,
connect_grid_points测试从'sigma_min'到'sigma_max'范围内的每一个值a,
其步长为'sigma_step',并选择导致最多连接行的值a。
当只传递两个值'sigma_min'和'sigma_max'的元组时,
也会发生相同的情况。
然而,在这种情况下,使用固定的步长0.05。
然后,将提取的连接线在网格点上进行分割,
并选择在网格点上开始和结束的线段。
请注意,边缘检测器通常在边缘连接点附近不能非常准确地工作,
因此通常连接线不会击中网格点。
因此,实际上这些连接线是被分割和选择的,
它们从MaxDist的最大距离开始、结束或通过一个网格点。
修改连接线,以便在相应的网格点中精确地开始和结束,
并以XLD轮廓线的形式在ConnectingLines 中返回。
3.gen_grid_rectification_map(Image, ConnectingLines : Map, Meshes :
GridSpacing, Rotation, Row, Column, MapType : )
gen_grid_recfication_map计算在畸变图像Image(通常使用saddle_points_sub_pix)
中实际检测到的网格点(Row, Column)与理想规则点网格的对应网格点之间的映射。
首先,
所有从它们的起始点通过恰好4条不同的连接线回到起始点的路径
都是由网格点(Row, Column)
和连接线ConnectingLines (由connect_grid_points检测)组装而成的。
如果网格点(Row, Column)和连接线(ConnectingLines )的输入是有意义的,
则这样的一个“网格”恰好对应于矫正网格中的一个网格单元。
然后,网格被合并到点网格中。
根据Rotation,网格点被旋转0、90、180或270度。
注意,点网格不一定有正确的方向。
当在Rotation中传递“auto”时,
点网格会旋转,使矫正网格中的黑色圆形标记位于白色标记的左侧(create_rectification_grid)。
最后,通过网格点之间的插值,计算出畸变图像与校正图像之间的映射关系。
每个网格单元,其中所有四个角点的坐标(Row, Column)都是已知的,
被投影到GridSpacing*GridSpacing像素的正方形上。
MapType用于指定输出映射的类型。
如果选择“bilinear”插值,Map由一个包含五个通道的图像组成。
在结果图像中每个像素的第一通道中,存储输入图像中像素的线性化坐标,
该坐标相对于转换后的坐标位于左上角。
其他四个通道包含变换坐标的四个相邻像素的权值,
用于双线性插值,权值顺序如下:
2,3
4,5
例如,第二个通道包含相对于转换坐标位于左上角的像素的权重。
如果选择“coord_map_sub_pix”,
Map由一个向量字段图像组成,
其中为生成图像的每个像素存储输入图像中的亚像素精确坐标。
gen_grid_recfication_map将计算得到的网格以XLD轮廓形式在Meshes中返回。
与 gen_arbitrary_distortion_map相反,
当畸变图像中网格点的坐标(Row, Column)既不知道也不能从图像内容派生时,
使用gen_grid_precfication_map及其前身。
参数
Image输入的图像
ConnectingLines输入的轮廓
Map输出包含映射数据的图像
Meshes输出轮廓
GridSpacing已校正图像中网格点的距离
Rotation应用到网格点的旋转角度,值有 0, 90, 180, 270, 'auto'
Row,Column网格点的坐标
MapType映射类型 ,有'bilinear', 'coord_map_sub_pix'
4.gen_arbitrary_distortion_map( : Map : GridSpacing, Row, Column, GridWidth, ImageWidth, ImageHeight, MapType : )
gen_arbitrary_distortion_map计算任意失真图像和校正图像之间的映射Map 。
坐标Row和Column描述了一个扭曲的网格,它将被映射到校正后的图像中的一个规则网格上。
扭曲网格点的坐标必须逐行逐列地传递。
GridWidth是网格点中点网格的宽度。
GridSpacing是经过校正的图像中相邻两个网格点之间的距离。
由于网格点总是映射到其相应像素的中心,
因此网格单元需要(GridSpacing+1)x (GridSpacing+1)像素在经过校正的图像中显示。
但是,请注意,当然,相邻的网格单元重叠了一个像素。
此外,要计算映射Map ,还必须传递要纠正的图像的宽度ImageWidth和高度ImageHeight
MapType用于指定输出映射的类型。
如果选择“bilinear”插值,Map由一个包含五个通道的图像组成。
在结果图像中每个像素的第一通道中,
存储输入图像中像素的线性化坐标,
该坐标相对于转换后的坐标位于左上角。
其他四个通道包含变换坐标的四个相邻像素的权值,
用于双线性插值,权值顺序如下:
2,3
4,5
例如,第二个通道包含相对于转换坐标位于左上角的像素的权重。
如果选择“coord_map_sub_pix”,
Map由一个向量字段图像组成,
其中为生成图像的每个像素存储输入图像中的亚像素精确坐标。
如上所述,要插值映射图像中一个像素的灰度值,
需要在变形图像中相邻的4个像素。
如果这些像素中至少有一个位于畸变图像之外,
则无法计算灰度值。
结果Map区域相应地减少。
与gen_grid_erecfication_map相反,
当畸变图像中网格点的坐标(Row, Column)已知或图像的相关部分由规则网格结构组成时,
使用gen_arbitrary_distortion_map,坐标可以由规则网格结构派生。
如果您想在另一个程序中重用创建的映射,
可以使用操作符write_image将其保存为多通道图像,格式为tiff。
例程
*例程演示使用函数实现网格校正。
*下面的命令创建一个postscript文件,文件包含校正网格,此网格被打印在物体表面上。
*读取一物体图片,图片被网格包裹。
read_image (Image, 'can_with_grid')
get_image_size (Image, ImageWidth, ImageHeight)
dev_close_window ()
dev_open_window (0, 0, ImageWidth * 0.75, ImageHeight * 0.75, 'black', WindowID1)
WidthOfGrid := 0.17
NumSquares := 17
create_rectification_grid (WidthOfGrid, NumSquares, 'rectification_grid.ps')
*提取网格区域
MinContrast := 25
Radius := 10
find_rectification_grid (Image, GridRegion, MinContrast, Radius)
reduce_domain (Image, GridRegion, ImageReduced)
* 提取网格点
SigmaSaddlePoints := 1.5
Threshold := 5
saddle_points_sub_pix (ImageReduced, 'facet', SigmaSaddlePoints, Threshold, Row, Col)
gen_cross_contour_xld (SaddlePoints, Row, Col, 6, 0.785398)
*连接点组成网格
SigmaConnectGridPoints := 0.9
MaxDist := 5.0
GridSpacing := 20
dev_set_color ('red')
connect_grid_points (ImageReduced, ConnectingLines, Row, Col, SigmaConnectGridPoints, MaxDist)
* 确定图像映射
gen_grid_rectification_map (ImageReduced, ConnectingLines, Map, Meshes, GridSpacing, 0, Row, Col, 'bilinear')
map_image (ImageReduced, Map, ImageMapped)
* 使用图像映射
read_image (Image, 'can')
map_image (Image, Map, ImageMapped)
|