Photoshop和Halcon中的极坐标变换

 

极坐标想必学过高中数学的人都听过,一般的坐标系中用(x, y)值来描述一个点的位置,而在极坐标系中,则使用到原点的距离ρ和夹角θ来描述该点的位置。

 

我很早就接触了Photoshop,知道Photoshop里面有个极坐标的扭曲滤镜,如下图:

 

明白了极坐标(正向、反向)的大致效果是:能将矩形图案变成圆形(环形)图案,或者反过来。

 

例如制作这种超现实的特效:

 

Photoshop中的“极坐标”滤镜的原理是:以右上角为圆心,旋转以后生成的是一个长宽都是画布两倍的图形,然后将此图形压缩至二分之一,最后将圆心移到画面中央。(注意下面三个图形之间的相对位置)

 

Halcon中极坐标的处理可能为了使用方便,将内部算法经过了优化,所以外在表现形式略有不同。

 

Halcon中与极坐标变换相关的算子共有7个,不过polar_trans_image已经过时,官方不建议使用,可以看到Halcon对Image、Region、XLD都可以运用极坐标变换和反变换

 

Halcon示例程序中关于极坐标的例子有: inspect_bottle_mouth.hdev。下面的代码亦是根据这个例子精简而来,完整代码如下(注意看注释):

 1 *说明:本例由Halcon示例程序 inspect_bottle_mouth.hdev 精简而成,可先参考示例程序再阅读本代码。
 2 
 3 dev_set_draw ('margin')
 4 dev_set_line_width (2)
 5 set_font (3600, '-Courier New-16-*-*-*-*-1-')
 6 
 7 list_files ('C:/Users/Administrator/Desktop/bottle', ['files','follow_links','recursive'], ImageFiles)
 8 tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
 9 
10 for Index := 1 to |ImageFiles| - 1 by 1
11     read_image (Image, ImageFiles[Index])
12     get_image_size (Image, Width, Height)
13     threshold (Image, Region, 0, 60)
14     fill_up (Region, RegionFillUp)
15     opening_circle (RegionFillUp, RegionOpening, 8.5)
16     smallest_circle (RegionOpening, Row0, Column0, Radius0)
17  
18     *下面这个函数是自己写的抓圆的函数,细节不表。你也可以用fit_circle_contour_xld  gen_circle_contour_xld实现类似功能
19     find_circle (Image, PartCircleXLD, Regions, Cross, Circle, Row0, Column0, Radius0 + 10, 0, 360, 30, 70, 20, 1, 50, 'negative', 'first', 'inner', 10, 'circle', RowCenter, ColCenter, Radius)
20     dev_display (Image)
21     dev_display (Circle)
22     
23     *该算子对一个图像的圆弧区域进行极坐标变换,圆弧外径是Radius,内径是Radius - 100,即圆弧厚度是100
24     *同理,圆弧展开成矩形后,矩形宽度应该是外弧圆圈的周长,即6.28319 * Radius(周长 = 2π × r) ;矩形高度应该是圆弧厚度,即100
25     polar_trans_image_ext (Image, PolarTransImage, RowCenter, ColCenter, 0, 6.28319, Radius - 100, Radius, 6.28319 * Radius, 100, 'nearest_neighbor')
26     
27     *下面这句仅用于观察image的反向极坐标变换,生成的图片的宽高还是设置为最原始图像的Width, Height
28     polar_trans_image_inv  (PolarTransImage, XYTransImage, RowCenter, ColCenter, 0, 6.28319, Radius - 100, Radius, Width, Height, 'nearest_neighbor')
29     
30     *mean_image选择主要沿水平方向进行模糊,动态阈值的'not_equal'参数同时筛选出了跟周围比过亮和过暗的区域(因为过暗和过亮都是缺陷)
31     mean_image (PolarTransImage, ImageMean, 500, 3)
32     dyn_threshold (PolarTransImage, ImageMean, Region1, 30, 'not_equal')
33     
34     fill_up_shape (Region1, RegionFillUp1, 'area', 1, 100)
35     *开运算去掉细小干扰
36     opening_circle (RegionFillUp1, RegionOpening1, 1.5)
37     connection (RegionOpening1, ConnectedRegions)
38     
39     *之所以要进行极坐标转换,就是为了这里用'height'来筛选,这是本例使用极坐标变换最关键的原因
40     select_shape (ConnectedRegions, SelectedRegions, 'height', 'and', 10, 99999)
41     polar_trans_region_inv (SelectedRegions, XYTransRegion, RowCenter, ColCenter, 0, 6.28319, Radius - 100, Radius, 6.28319 * Radius, 100, Width, Height, 'nearest_neighbor')
42     dev_display (Image)
43     dev_display (XYTransRegion)
44     
45     stop ()
46 endfor

 

虽然极坐标变换是本例中的核心思路,但是仍有三句非常巧妙的代码,仔细想想为什么这三句代码很巧妙:

31 mean_image (PolarTransImage, ImageMean, 500, 3) 32 dyn_threshold (PolarTransImage, ImageMean, Region1, 30, 'not_equal')
40     select_shape (ConnectedRegions, SelectedRegions, 'height', 'and', 10, 99999)
 
 

该图极坐标转换后的图像为:

 

 

部分处理效果图如下:

 

转载于:https://www.cnblogs.com/xh6300/p/10406753.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Halcon相机标定代码.hdev 1.初始化 for example: Full image (640*480) Subsampling (320*240) ImageWidth 640 320 ImageHeight 480 240 2.标定板初始化 CaltabName := 'caltab_30mm.descr'//标定板描述文件 set_calib_data_calib_object (CalibDataID, 0, CaltabName) 3.创建数据模型 create_calib_data ('calibration_object', 1, 1, CalibDataID) 4.获取标定图片 相机拍摄不同位姿下图片8-15张,拍摄图片时标定板尽量覆盖整个视场(标定板要根据工作距离、视场大小定制);拍摄图片上的圆直径不得小于10个像素 5.加载所有图像,寻找标定板区域,确定圆心,将结果加载到组元 for I := 1 to NumImages by 1 ... acquire image ... find_caltab (Image, Caltab, CaltabName, SizeGauss, MarkThresh, MinDiamMarks) find_marks_and_pose (Image, Caltab, CaltabName, StartCamPar, StartThresh, \ DeltaThresh, MinThresh, Alpha, MinContLength, MaxDiamMarks, RCoord, CCoord, StartPose) set_calib_data_observ_points (CalibDataID, 0, 0, I, RCoord, CCoord, 'all', StartPose) endfor 下面将Halcon提取目标点的大致原理说一下: 首先find_caltab 算子对图像高斯滤波(核大小为SizeGauss),接着阈值分割(与之大小为MarkThresh)将标定板的区域找出来, find_marks_and_pose 算子对区域的圆进行分割,找到圆的个数,周长,坐标位置等应该和标定板描述文件的一致,否则会自动调整StartThresh,使得StartThresh按照DeltaThresh步长减小到MinThresh,知道找到准确的圆心。 6.有了所有图像的圆心就可以标定了 calibrate_cameras (CalibDataID, Errors) 返回平均投影误差Errors

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值