Halcon 极坐标变换
(1)极坐标的展开:polar_trans_image_ext(Image : PolarTransImage : Row, Column, AngleStart, AngleEnd, RadiusStart, RadiusEnd, Width, Height, Interpolation : )
(2)极坐标的逆变换:polar_trans_image_inv(PolarImage : XYTransImage : Row, Column, AngleStart, AngleEnd, RadiusStart, RadiusEnd, Width, Height, Interpolation : )
其中:Row, Column分别为圆环的中心行列坐标, AngleStart, AngleEnd为起始和终止的角度值,RadiusStart, RadiusEnd为起始和终止的半径角度值, Width, Height为输出图片的宽和高。
极坐标的基本概念
简单地说,极坐标就是:用角度和长度描述位置的坐标系。结合上图明确这三点:
- 以原点 O 为起点的射线作为参考系, 称O 为极点,这条射线为极轴
- 点 P 到原点的距离记为 OP¯=r(≥0),称为极径
- 从参考系射线出发逆时针旋转到OP 所经过的角度记为 θ∈[0,2π),称为极角
从计算的角度上讲θ 的取值范围也可以根据实际问题灵活处理。比如可以写为 θ∈[−π,π) 等。下文会有相应例子。
有了上述三个要素,空间中任意一点都可以用序对 (r,θ) 表示
极坐标和直角坐标的相互转换。
(O-1){x=rcosθy=rsinθ⇔{r=x2+y2θ=arcsinyr=arcsinyx2+y2
但是要特别注意:上式中 θ 的值仅对(P在第I象限)成立(此时θ∈[0,π2],同时该点不能为原点)。对于其它象限则需要根据具体情况进行处理
案例:
read_image (Image33, 'E:/Halcon数据/资源图片/11.jpg')
get_image_size (Image33, Width, Height)
R:=Height/2
C:=Width/2
dev_close_window ()
dev_open_window (0, 0, 2*Width, 2*Height, 'black', WindowHandle)
dev_display (Image33)
dev_set_draw ('margin')
gen_rectangle1 (ROI_0, 17.25, 7.75, 222.75, 221.75)
reduce_domain (Image33, ROI_0, ImageReduced)
rgb1_to_gray (ImageReduced, GrayImage)
threshold (GrayImage, Region, 0, 80)
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 15000, 29999)
smallest_circle (SelectedRegions, OuterRow, OuterColumn, OuterRadius)
gen_circle_contour_xld (OuterCircle, OuterRow, OuterColumn, OuterRadius, 0, 6.28318, 'positive', 1)
dev_display (Image33)
dev_display (OuterCircle)
InnerRow:=OuterRow
InnerColumn:=OuterColumn
InnerRadius:=OuterRadius-45
gen_circle_contour_xld (InnerCircle, InnerRow, InnerColumn, InnerRadius, 0, 6.28318, 'positive', 1)
dev_set_color ('green')
dev_set_draw ('margin')
dev_set_line_width (3)
dev_display (Image33)
dev_display (OuterCircle)
dev_display (InnerCircle)
WidthPolar := OuterRadius*6.28318
HeightPolar := round(OuterRadius - InnerRadius )
polar_trans_image_ext (Image33, PolarTransImage, InnerRow, InnerColumn, rad(240), -rad(120), OuterRadius , InnerRadius , WidthPolar, HeightPolar, 'bilinear')
dev_close_window ()
dev_open_window (0, 0, 3*WidthPolar, 3*HeightPolar, 'black', WindowHandle)
dev_display (PolarTransImage)
invert_image (PolarTransImage, ImageInvert)
gen_rectangle1 (ROI_0, 7, 13.6749, 42.6667, 467.273)
polar_trans_region_inv (ROI_0, CodeRegionCircular, InnerRow, InnerColumn, rad(240), -rad(120), OuterRadius, InnerRadius, WidthPolar, HeightPolar, Width, Height, 'nearest_neighbor')
dev_close_window ()
dev_open_window (0, 0, 2*Width, 2*Height, 'black', WindowHandle)
dev_display (Image33)
dev_display (CodeRegionCircular)