polar_trans_image_ext(Image : PolarTransImage : Row, Column, AngleStart, AngleEnd, RadiusStart, RadiusEnd, Width, Height, Interpolation : )
polar_trans_image_ext将图像Image 中
以中点(Row, Column)、
半径RadiusStart和RadiusEnd以及
角度AngleStart和AngleStart指定的环形弧
转换为尺寸为Width*Height的极坐标版本图像,保存于PolarTransImage 。
输出图像的左上角像素总是对应于输入图像中RadiusStart和AngleStart指定的点。
类似地,输出图像中的右下角像素总是对应于输入图像中由RadiusEnd和AngleEnd指定的点。
在通常模式下(AngleStart < AngleEnd和RadiusStart < RadiusEnd),极坐标变换按数学上的正方向(逆时针方向)进行。
此外,半径较小的点位于输出图像的上部。
通过适当地交换这些参数的值(例如,AngleStart > AngleEnd或RadiusStart > RadiusEnd),
可以实现输出图像的任意期望方向。
参数Interpolation 用于选择插值方法'bilinear'或'nearest_neighbor'。
在“nearest_neighbor”中,输出图像中像素的灰度值由输入图像中最近像素的灰度值决定。
在bilinear的情况下,输出图像中一个像素的灰度值是由输入图像中最近的四个像素的灰度值的双线性插值来确定的。
模式“bilinear”的图像质量更好,但比模式“nearest_neighbor”慢。
角度可以为任意实数。中心点和半径也可以是实数。
但是,如果它们都是整数,且RadiusEnd和RadiusStart的差值等于目标图像的高度高度,则将通过优化方式加速计算。
计算使用到了半径和角度,即目标图像的第一行包含半径为RadiusStart的圆,最后一行包含半径为RadiusEnd的圆。对于完整的圆, AngleStart和 AngleEnd 的差值等于360度,这也意味着目标图像的第一列将与最后一列相同。
为避免这种情况,可以使用360*(1-1/Width)
polar_trans_image(Image, PolarTransImage, Row, Column, Width, Height)
和
polar_trans_image_ext(Image, PolarTransImage, Row-0.5, Column-0.5,
6.2831853, 6.2831853/Width, 0, Height-1,
Width, Height, 'nearest_neighbor')
结果相同。
由于polar_trans_image不做精确的最近邻插值,且polar_trans_image不含参数,
可以利用上述信息计算半径和角度,因此需要0.5的偏移量。
要使polar_trans_image_ext顺时针旋转,起始角大于结束角,就像polar_trans_image所做的那样。
如果输入的图像不超过所选设备的图像对象的最大大小,
则可以在OpenCL设备上执行polar_trans_image_ext。
由于数值原因,与CPU上的执行相比,输出可能略有不同。
参数:
Image,PolarTransImage分别为输入图像与输出图像。
Row,Column,圆环中心坐标。
AngleStart,AngleEnd 圆环起始与终止角度
RadiusStart,RadiusEnd 圆环的两大小半径
Width,Height输出图像的长宽
Interpolation 转换的插值方法,值有 'bilinear', 'nearest_neighbor'
1.polar_trans_image_inv(PolarImage : XYTransImage : Row, Column, AngleStart, AngleEnd, RadiusStart, RadiusEnd, Width, Height, Interpolation : )
polar_trans_image_inv将存储在PolarImage中的图像的极坐标表示形式转换回笛卡尔坐标系中的环形,
该环形由半径RadiusStart和RadiusEnd以及圆心点位于(Row, Column)、AngleStart和AngleEnd描述。
所有这些值都可以选择为实数。目标图像的总体大小将是Width,*Height。
参数Interpolation 用于选择插值方法'bilinear'或'nearest_neighbor'。
在“nearest_neighbor”中,输出图像中像素的灰度值由输入图像中最近像素的灰度值决定。
在bilinear的情况下,输出图像中一个像素的灰度值是由输入图像中最近的四个像素的灰度值的双线性插值来确定的。
模式“bilinear”的图像质量更好,但比模式“nearest_neighbor”慢。
polar_trans_image_inv是polar_trans_image_ext的逆函数。
例如下面的调用
polar_trans_image_ext(Image, PolarImage, Row, Column, rad(360), 0, 0,
Radius, Width, Height, Interpolation)
polar_trans_image_inv(PolarImage, XYTransImage, Row, Column, rad(360), 0, 0,
Radius, Width, Height, Interpolation)
例程:
dev_update_off ()
get_system ('clip_region', Information)
set_system ('clip_region', 'true')
read_image (Image, 'circular_barcode')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width / 2, Height / 2, 'black', WindowHandle)
dev_set_colored (12)
dev_display (Image)
stop ()
* 分割包含条形码的CD上的环。
threshold (Image, Region, 0, 100)
closing_circle (Region, Region, 3.5)
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, Ring, ['width','height'], 'and', [550,550], [750,750])
shape_trans (Ring, OuterCircle, 'outer_circle')
complement (Ring, RegionComplement)
connection (RegionComplement, ConnectedRegions)
select_shape (ConnectedRegions, InnerCircle, ['width','height'], 'and', [450,450], [650,650])
* 确定包含条形码的环的参数。
smallest_circle (Ring, Row, Column, OuterRadius)
smallest_circle (InnerCircle, InnerRow, InnerColumn, InnerRadius)
dev_set_color ('green')
dev_set_draw ('margin')
dev_set_line_width (3)
dev_display (Image)
dev_display (OuterCircle)
dev_display (InnerCircle)
stop ()
* 现在读条形码。这是通过计算包含条形码的图像中圆环的极坐标变换来实现的。
WidthPolar := 1440
HeightPolar := round(OuterRadius - InnerRadius - 10)
polar_trans_image_ext (Image, PolarTransImage, Row, Column, rad(360), 0, OuterRadius - 5, InnerRadius + 5, WidthPolar, HeightPolar, 'bilinear')
*逆向转换回圆环图像,以查看此函数效果
polar_trans_image_inv (PolarTransImage, XYTransImage, Row, Column, rad(360), 0, OuterRadius - 5, InnerRadius + 5, Width, Height, 'nearest_neighbor')
invert_image (PolarTransImage, ImageInvert)
* 由于条形码区域相当平坦,因此图像的高度增加了一倍。
zoom_image_factor (ImageInvert, ImageZoomed, 1, 2, 'weighted')
get_image_size (ImageZoomed, Width1, Height1)
dev_resize_window_fit_size (0, 0, Width1, Height1, -1, -1)
dev_display (ImageZoomed)
stop()
create_bar_code_model ([], [], BarCodeHandle)
* 条形比较小,对比度也低;因此,阈值从0.05提高到0.1。
set_bar_code_param (BarCodeHandle, 'element_size_min', 1.5)
set_bar_code_param (BarCodeHandle, 'meas_thresh', 0.3)
find_bar_code (ImageZoomed, SymbolRegions, BarCodeHandle, 'Code 128', DecodedDataStrings)
clear_bar_code_model (BarCodeHandle)
dev_set_window_extents (-1, -1, WidthPolar / 2, HeightPolar)
dev_display (ImageZoomed)
dev_display (SymbolRegions)
set_system ('clip_region', Information)
disp_message (WindowHandle, DecodedDataStrings, 'image', 10, 180, 'black', 'true')
stop ()
* 将条码区域转换回原始图像并显示。
zoom_region (SymbolRegions, SymbolRegions, 1, 0.5)
polar_trans_region_inv (SymbolRegions, CodeRegionCircular, Row, Column, rad(360), 0, OuterRadius - 5, InnerRadius + 5, WidthPolar, HeightPolar, Width, Height, 'nearest_neighbor')
dev_set_window_extents (-1, -1, Width / 2, Height / 2)
dev_display (Image)
dev_display (CodeRegionCircular)
disp_message (WindowHandle, DecodedDataStrings, 'window', 12, 12, 'black', 'true')
例程实现从圆形CD上读取条码。
*按F6单步执行可查看每个函数执行效果
执行结果如图
工业视觉polar_trans_image_ext 函数介绍 halcon
|