Photoshop和Halcon中的极坐标变换
极坐标想必学过高中数学的人都听过,一般的坐标系中用(x, y)值来描述一个点的位置,而在极坐标系中,则使用到原点的距离ρ和夹角θ来描述该点的位置。
我很早就接触了Photoshop,知道Photoshop里面有个极坐标的扭曲滤镜,如下图:
明白了极坐标(正向、反向)的大致效果是:能将矩形图案变成圆形(环形)图案,或者反过来。
例如制作这种超现实的特效:
Photoshop中的“极坐标”滤镜的原理是:以右上角为圆心,旋转以后生成的是一个长宽都是画布两倍的图形,然后将此图形压缩至二分之一,最后将圆心移到画面中央。(注意下面三个图形之间的相对位置)
Halcon中极坐标的处理可能为了使用方便,将内部算法经过了优化,所以外在表现形式略有不同。
Halcon中与极坐标变换相关的算子共有7个,不过polar_trans_image已经过时,官方不建议使用,可以看到Halcon对Image、Region、XLD都可以运用极坐标变换和反变换。
Halcon示例程序中关于极坐标的例子有: inspect_bottle_mouth.hdev。下面的代码亦是根据这个例子精简而来,完整代码如下(注意看注释):
*说明:本例由Halcon示例程序 inspect_bottle_mouth.hdev 精简而成,可先参考示例程序再阅读本代码。 dev_set_draw ('margin')
dev_set_line_width ()
set_font (, '-Courier New-16-*-*-*-*-1-') list_files ('C:/Users/Administrator/Desktop/bottle', ['files','follow_links','recursive'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles) for Index := to |ImageFiles| - by
read_image (Image, ImageFiles[Index])
get_image_size (Image, Width, Height)
threshold (Image, Region, , )
fill_up (Region, RegionFillUp)
opening_circle (RegionFillUp, RegionOpening, 8.5)
smallest_circle (RegionOpening, Row0, Column0, Radius0) *下面这个函数是自己写的抓圆的函数,细节不表。你也可以用fit_circle_contour_xld 和 gen_circle_contour_xld实现类似功能
find_circle (Image, PartCircleXLD, Regions, Cross, Circle, Row0, Column0, Radius0 + , , , , , , , , 'negative', 'first', 'inner', , 'circle', RowCenter, ColCenter, Radius)
dev_display (Image)
dev_display (Circle) *该算子对一个图像的圆弧区域进行极坐标变换,圆弧外径是Radius,内径是Radius - ,即圆弧厚度是100
*同理,圆弧展开成矩形后,矩形宽度应该是外弧圆圈的周长,即6.28319 * Radius(周长 = 2π × r) ;矩形高度应该是圆弧厚度,即100
polar_trans_image_ext (Image, PolarTransImage, RowCenter, ColCenter, , 6.28319, Radius - , Radius, 6.28319 * Radius, , 'nearest_neighbor') *下面这句仅用于观察image的反向极坐标变换,生成的图片的宽高还是设置为最原始图像的Width, Height
polar_trans_image_inv (PolarTransImage, XYTransImage, RowCenter, ColCenter, , 6.28319, Radius - , Radius, Width, Height, 'nearest_neighbor') *mean_image选择主要沿水平方向进行模糊,动态阈值的'not_equal'参数同时筛选出了跟周围比过亮和过暗的区域(因为过暗和过亮都是缺陷)
mean_image (PolarTransImage, ImageMean, , )
dyn_threshold (PolarTransImage, ImageMean, Region1, , 'not_equal') fill_up_shape (Region1, RegionFillUp1, 'area', , )
*开运算去掉细小干扰
opening_circle (RegionFillUp1, RegionOpening1, 1.5)
connection (RegionOpening1, ConnectedRegions) *之所以要进行极坐标转换,就是为了这里用'height'来筛选,这是本例使用极坐标变换最关键的原因
select_shape (ConnectedRegions, SelectedRegions, 'height', 'and', , )
polar_trans_region_inv (SelectedRegions, XYTransRegion, RowCenter, ColCenter, , 6.28319, Radius - , Radius, 6.28319 * Radius, , Width, Height, 'nearest_neighbor')
dev_display (Image)
dev_display (XYTransRegion) stop ()
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)
该图极坐标转换后的图像为:
部分处理效果图如下:
Photoshop和Halcon中的极坐标变换的更多相关文章
- HALCON中的算子大全(中英对照)
HALCON中的算子大全(中英对照) Chapter 1 :Classification1.1 Gaussian-Mixture-Models1.add_sample_class_gmm功能:把一个训 ...
- Halcon中的坐标系特点及XLD的镜像转换
我们知道,Halcon中的坐标系的原点在左上角,而一般二维平面坐标系的原点在左下角.那么Halcon中坐标系和一般的二维坐标系有什么区别呢?我通过下面这个例子来分析. gen_image_const ...
- Python: PS 滤镜-- 极坐标变换到平面坐标
本文用 Python 实现 PS 中的一种滤镜 极坐标变换到平面坐标,具体的算法原理和效果可以参考之前的博客: http://blog.csdn.net/matrix_space/article/de ...
- OpenCV图像变换二 投影变换与极坐标变换实现圆形图像修正
投影变换 在放射变换中,物体是在二维空间中变换的.如果物体在三维空间中发生了旋转,那么这种变换就成为投影变换,在投影变换中就会出现阴影或者遮挡,我们可以运用二维投影对三维投影变换进行模块化,来处理阴影 ...
- ARCore中Pose类变换点的算法实现
ARCore中Pose类变换点的算法实现,主要分为两步,分别是平移和旋转. 1. 旋转向量:通过四元数计算旋转后的向量 参数列表:q表示四元数, v是长度为4的float数组,表示待旋转的向量, ...
- Halcon中缩放Region或XLD的方法研究
在Halcon中,Region和XLD之间可以彼此转换.但这种转换并不是“无损”的,XLD可以是不闭合的,但是Region一定是闭合的.因此,如果将不闭合的XLD转为Region,然后再转回XLD,那 ...
- ReactiveCocoa 中 RACSignal 所有变换操作底层实现分析(上)
前言 在上篇文章中,详细分析了RACSignal是创建和订阅的详细过程.看到底层源码实现后,就能发现,ReactiveCocoa这个FRP的库,实现响应式(RP)是用Block闭包来实现的,而并不是用 ...
- [UWP-小白日记16]UWP中的3D变换API
原文:[UWP-小白日记16]UWP中的3D变换API 还没开始 好久没写博客了,再来开坑. 正文 Transform3D:“这个和CSS的3D好像的说” PerspectiveTransform3D ...
- OpenGL中的空间变换
OpenGL中的空间变换 在使用OpenGL的三维虚拟程序中.当我们指定了模型的顶点之后.在屏幕上显示它们之前,一共会发生3种类型的变换:视图变换.模型变换.投影变换. ...
随机推荐
- linux开机启动详细流程图
linux开机启动详细流程图: 一.BIOS 加电自检当你按电源开关开机时,电脑会首先去启动BIOS(基本输入输出系统),BIOS一般是集成在主板上的.BIOS 的工作1.检测连接硬件,比如显卡,内存 ...
- PHP图片压缩
<?php /** * 分享请保持网址.尊重别人劳动成果.谢谢. * 图片压缩类:通过缩放来压缩.如果要保持源图比例,把参数$percent保持为1即可. * 即使原比例压缩,也可大幅度缩小.数 ...
- Tornado之模板
知识点 静态文件配置 static_path StaticFileHandler 模板使用 变量与表达式 控制语句 函数 块 4.1 静态文件 现在有一个预先写好的静态页面文件 (下载静态文件资源), ...
- 本地同时安装python2和python3时pip报错
引言: 安装完成后,想测试一下两个版本的pip是否都可以正常工作,结果python3的能正常工作,但是pip2 --version就会报错,报错信息如下: Traceback (most recent ...
- uva-10160-枚举
若当前搜索到的城市n前面1-n-1编号的城市中有没有通电的,则永远也无法输送电力给那个城市,因为在剪枝时附加了和此结点连接的最大结点小于当前的结点 这段 for(int i = 1; i < c ...
- 《GPU高性能编程CUDA实战》第七章 纹理内存
▶ 本章介绍了纹理内存的使用,并给出了热传导的两个个例子.分别使用了一维和二维纹理单元. ● 热传导(使用一维纹理) #include <stdio.h> #include "c ...
- Appium——unknown error: cannot activate web view
测试步骤: 1. 打开必应APP(如果出现欢迎界面和定位服务弹窗,需要点掉) 2. 点击搜索按钮 3. 输入JAVA到搜索框 4. 点击搜索网页 5. 观察显示搜索出来的结果是否含有java 6. ...
- node 删除文件 和文件夹
删除文件 var fs = require('fs'); fs.unlink(path,callback); 删除文件夹 deleteFolder(path); function deleteFold ...
- VS 类快捷键
生成类的构造函数 输入 ctrl,按两下 TAB 键 快速添加属性输入prop,按2下tab键 添加折叠输入reg,按2下tab键,快速输入#region输入class,按下2次tab建,快速输入类定 ...
- as3 程序域
问题我要在应用程序中载入其他域的swf文件,并且允许它访问程序中的 ActionScript 解决办法使用flash.system.Security.allowDomain( ), flash.sys ...