极坐标变换原理和用法

一、高中数学知识,笛卡尔坐标系和极坐标系可以互相转换。引用到图像处理上面,当我们需要分析圆环上面的缺陷或者字符时,可以通过极坐标变换,把圆环区域转换成矩形区域,图像处理完成后,再通过反极坐标变换转换为原来的圆环中。
二、算子
在halcon中极坐标变换算子:
polar_trans_image_ext(针对图像);polar_trans_region(针对区域);polar_trans_contour_xld(针对XLD轮廓)。
在halcon中反极坐标变换算子:
polar_trans_image_inv(针对图像); polar_trans_region_inv(针对区域);polar_trans_contour_xld_inv(针对XLD轮廓)。

1、POLAR_TRANS_IMAGE_EXT算子用法与参数剖析
算子原型:
polar_trans_image_ext(Image : PolarTransImage : Row, Column, AngleStart, AngleEnd, RadiusStart, RadiusEnd, Width, Height, Interpolation : )
参数说明:
Image (input_object)(多通道)图像(-array)→对象(byte * / int2 * / uint2 * / real *)*允许计算设备
输入图像。
PolarTransImage(output_object)(多通道)图像(-array)→对象(字节/ int2 / uint2 /实数)
输出图像。
Row(input_control)编号→(实数/整数)
圆弧中心的行坐标。
默认值:256
建议值:0、16、32、64、128、240、256、480、512
Column(input_control)号→(实数/整数)
圆弧中心的列坐标。
默认值:256
建议值:0、16、32、64、128、256、320、512、640
AngleStart(input_control)数字→(实数)
要映射到输出图像第一列的射线角度。
默认值:0.0
建议值:0.0,0.78539816,1.57079632,3.141592654,6.2831853,12.566370616
AngleEnd(input_control)数字→(实数)
要映射到输出图像最后一列的射线角度。
默认值:6.2831853
建议值:0.0,0.78539816,1.57079632,3.141592654,6.2831853,12.566370616
RadiusStart(input_control)数字→(实数/整数)
要映射到输出图像第一行的圆的半径。
默认值:0
建议值:0、16、32、64、100、128、256、512
典型值范围:0≤RadiusStart
RadiusEnd(input_control)数字→(实数/整数)
要映射到输出图像最后一行的圆的半径。
默认值:100
建议值:0、16、32、64、100、128、256、512
典型值范围:0≤RadiusEnd
Width(input_control)数→(整数)
输出图像的宽度。
默认值:512
建议值:256、320、512、640、800、1024
典型值范围:0≤宽度≤32767
Height(input_control)数→(整数)
输出图像的高度。
默认值:512
建议值:240、256、480、512、600、1024
典型值范围:0≤高度≤32767
Interpolation (input_control)字符串→(string)
内插法进行变换。
默认值:“ nearest_neighbor”
值列表:‘bilinear’,‘nearest_neighbor’

2、POLAR_TRANS_REGION_INV算子用法与参数剖析
算子原型:
polar_trans_image_inv(PolarImage : XYTransImage : Row, Column, AngleStart, AngleEnd, RadiusStart, RadiusEnd, Width, Height, Interpolation : )
参数说明:
PolarImage(input_object)(multichannel-)image(-array)→object(byte * / int2 * / uint2 * / real *)*允许用于计算设备
输入图像。
XYTransImage(output_object)(多通道)图像(-array)→对象(字节/ int2 / uint2 /实数)
输出图像。
Row(input_control)编号→(实数/整数)
圆弧中心的行坐标。
默认值:256
建议值:0、16、32、64、128、240、256、480、512
典型值范围:0≤行≤32767
Column(input_control)号→(实数/整数)
圆弧中心的列坐标。
默认值:256
建议值:0、16、32、64、128、256、320、512、640
典型值范围:0≤列≤32767
AngleStart(input_control)数字→(实数)
将输入图像的第一列映射到的射线角度。
默认值:0.0
建议值:0.0,0.78539816,1.57079632,3.141592654,6.2831853
AngleEnd(input_control)数字→(实数)
将输入图像的最后一列映射到的射线角度。
默认值:6.2831853
建议值:0.0,0.78539816,1.57079632,3.141592654,6.2831853
RadiusStart(input_control)数字→(实数/整数)
要将输入图像的第一行映射到的圆的半径。
默认值:0
建议值:0、16、32、64、100、128、256、512
典型值范围:0≤RadiusStart
RadiusEnd(input_control)数字→(实数/整数)
要将输入图像的最后一行映射到的圆的半径。
默认值:100
建议值:0、16、32、64、100、128、256、512
典型值范围:0≤RadiusEnd
Width(input_control)数→(整数)
输出图像的宽度。
默认值:512
建议值:256、320、512、640、800、1024
典型值范围:0≤宽度≤32767
Height(input_control)数→(整数)
输出图像的高度。
默认值:512
建议值:240、256、480、512、600、1024
典型值范围:0≤高度≤32767
Interpolation (input_control)字符串→(string)
内插法进行变换。
默认值:“ nearest_neighbor”
值列表:‘bilinear’,‘nearest_neighbor’
三、源码演示

dev_update_off ()
get_system ('clip_region', Information)
set_system ('clip_region', 'true')
* read_image (Image, 'circular_barcode')
read_image (Image, 'C:/Users/Dell/Desktop/极坐标变换/circular_barcode.png')
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
WidthPolar := (OuterRadius - 5)*2*3.14
HeightPolar := round(OuterRadius - InnerRadius - 10)
*极坐标变换(中心Row, Column,用圆环的圆心坐标。起始角度是0360度。起始半径分别是圆环内圆的半径和外圆的半径。
*宽高分别是圆环外圆的周长和外圆半径减去内圆半径的值)
polar_trans_image_ext (Image, PolarTransImage, Row, Column,0, rad(360), InnerRadius + 5, OuterRadius - 5, WidthPolar, HeightPolar, 'bilinear')
*逆向转换回圆环图像,以查看此函数效果
polar_trans_image_inv (PolarTransImage, XYTransImage, Row, Column, 0, rad(360), InnerRadius + 5, OuterRadius - 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.1set_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, 0, rad(360), InnerRadius + 5, OuterRadius - 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')

原图

极坐标变换后图
在这里插入图片描述
反极坐标变换后的图
极坐标变换原理和用法_第1张图片
极坐标变换后条码识别图
在这里插入图片描述
条码识别区域,反极坐标变换到原图
极坐标变换原理和用法_第2张图片

你可能感兴趣的:(图像处理,计算机视觉,人工智能)