极坐标变换原理和用法

本文介绍如何使用极坐标变换处理圆环状图像,包括HALCON中的关键算子polar_trans_image_ext和polar_trans_image_inv的使用方法及参数详解,并通过实例展示了条形码识别的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、高中数学知识,笛卡尔坐标系和极坐标系可以互相转换。引用到图像处理上面,当我们需要分析圆环上面的缺陷或者字符时,可以通过极坐标变换,把圆环区域转换成矩形区域,图像处理完成后,再通过反极坐标变换转换为原来的圆环中。
二、算子
在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)23.14
    HeightPolar := round(OuterRadius - InnerRadius - 10)
    *极坐标变换(中心Row, Column,用圆环的圆心坐标。起始角度是0到360度。起始半径分别是圆环内圆的半径和外圆的半径。
    *宽高分别是圆环外圆的周长和外圆半径减去内圆半径的值)
    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.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, 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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值