对于一些抽象的效果图,Photoshop中的极坐标滤镜还有很多东西值得研究……
$ ]( w3 S! o* E9 }! [
( @0 q. x% `! b4 T2 e `! v; m3 q/ l3 o& t% A
【摘要】对于一些抽象的效果图,Photoshop中的极坐标滤镜还有很多东西值得研究……
5 Z( r0 F, g4 N. h/ W& @1 Y; C' E8 b
在国外的网站上看到有人把Photoshop的滤镜分为两类,一类是对原图没有破坏性的滤镜,另一类是对原图有破坏性的滤镜。破坏性滤镜多以扭曲滤镜为主,其中极坐标的破坏性可以算是相当大的一种。
K5 `* Y; e, K4 O: M
2 n+ ?. ^: G2 P4 m j( Y 因为极坐标的破坏性,很多人认为这个滤镜对于图像、照片的处理没有什么太大的实际应用,但是如果对于一些抽象的图像,我觉得这个滤镜还是有些地方值得研究一下的,希望各位看过本文也会有所启发。
, ~7 A+ [: E& R* q8 F1 D* }% j7 ~% q( q" a9 Y( O5 C2 f. ]
一、极坐标变形的感性认识
( }' x$ T% s6 W5 A1 `# m' ~1 ?" X% n
先看一下极坐标对图像做的是一种什么样的扭曲。如图
o* s" R1 B. w1 ~8 h( f+ k- ~* z6 W4 h
N+ }" [* ]" k7 w: g7 r# M
- ?* E) R6 I; o+ i" a, ?0 U
这一组图分别是正方型、圆形和色块通过极坐标变换前后的图像。
' O, k$ g& T$ s0 D! p4 N- t! c h/ o, L% O: U0 h7 w, P
直角坐标到极坐标的变化:可以认为是顶边下凹,底边和两侧边上翻的过程。
: d+ f# j) ?2 x: R
5 \. B' s& X) g3 O0 Q8 Z
极坐标到直角坐标的变化:可以认为是底边上凹,顶边和两侧边下翻的过程。
) n$ R }5 f9 @) M' Q+ |
8 i4 I" v. Q7 } 这里所说的“过程”只是用来加深记忆而已,实际上这个上翻下翻的过程是不存在的,而是直接通过坐标映射而成的。
0 \( g9 N, c4 ~% [2 k
, L3 e2 t" x+ f9 |. h2 @$ T 1、直角坐标—>极坐标
; P0 \7 w7 T) x
/ V4 l& T; X. L 原图中的竖线经极坐标变换后,变为放射线。
; \3 u: O' S; A( a- @2 \
) I; K: R; |6 O 原图中的横线经极坐标变换后,变为同心圆。
* R, ?$ t' T4 {. _+ }: \- s( ?" O* \
8 I* k M" K+ | 当然横竖交错画出来就是蜘蛛网啦。
+ `+ E1 y6 @+ w* K8 W: w- g1 \: _
6 T% _3 s, H) m' \& n' a3 j9 q
请观察每种颜色色块在变换之后的位置,原图的顶部收缩为圆心部分,底部的红色成为画布内切圆。左右两个蓝色的色块向上翻转之后最终合并为一个扇型,原来的两个侧边会在上方重合。
: U4 b& q4 m( n# V! l
7 l7 p, d! @* W n 记住每种色块变化前后的位置不仅有住于加深对极坐标滤镜的理解而且在实际应用中也有帮助,至少现在你已经学会画放射线、同心圆、扇型了。
7 @; G! W \/ u4 Q- e/ Y" N$ {8 |0 f
- y' c* l2 l4 t( h- D4 _ 2、极坐标—>直角坐标 , ^! b! k D$ k$ K7 {) d; H
2 q; X9 R" k& J9 L! S8 k- E
1 [* W; _, z) c1 J4 J
原图中的竖线和横线(坐标轴除外)经变换后,变为图中的抛物线/双曲线(具体是那种线形我尚未搞清楚,但我更倾向于是双曲线)。
7 U& n& I2 ?5 o l1 J7 L
. w+ g8 j# x4 |4 c) C
坐标轴经变换后,变为纵向的5条分隔线,其中1,3,5是原纵轴,2,4是原横轴。
7 T9 h1 X6 ^- `2 F
1 u }; J7 L- m$ N 对于色块的变化,请大家注意一下位置和幅度就是了,这个我研究得不多。
2 @/ k3 C+ I7 `$ `# R6 T) q
: Y" f: q( I" S3 M% `' q* a
Btw:在前言里我曾说过极坐标对图像有破坏性,其实极坐标滤镜也具有一定的还原性,毕竟这是坐标系间的映射。对于执行了正变换的图形再执行反变换还是可以恢复出原图的一些信息的。但是因为极坐标不是一一对应的关系,所以在图的边缘部分的信息就不能恢复了。比较另类的应用还可以利用极坐标的还原性为图片加密。
1 d6 v! K9 A) \( |9 E) M
2 N6 J8 T0 o2 r3 t- r4 b* K二、极坐标滤镜应用 ( G9 {8 ]' [; I3 _( U
L4 G$ C2 }. R' i6 U# f: h
我使用极坐标滤镜主要还是用于画圆,或者说画以圆为基础的图像。我们经常看到用矢量软件画的一些重复的有规律的图形,其实某些图利用极坐标滤镜就可以完成,有时比用矢量软件做得更好,变化更多。
% b0 [" M- k; i% V
* ]6 m( J& S j+ ]. G+ i# l1 v+ Y 2.1 放射线的制作,参见第一部分。
+ s2 p: F6 Y2 w8 N* Y+ r) J
4 {, K- g6 N4 I& T: E$ x! p% ^ 2.2 同心圆的制作,参见第一部分。
! U: t3 u8 ^5 e7 E8 J8 T! j" |% Q- b
" ~$ }6 S4 A" W% G) y2 s
2.3 扇型,环型,彩虹,参见第一部分。
) J2 ^; o7 l' T1 w) [/ Z- R/ I
4 A: i) d+ E- U2 r& @) o" L
2.4 螺线
) x: `2 U6 D, ?2 B
% ~! B7 y E6 E 螺旋线在矢量软件中画是相当简单的事,有些软件本身就有螺线工具。但是对于ps来说,并没有特别合适的绘制螺线的工具或公式。在扭曲滤镜里有一个旋转扭曲(Twirl)滤镜可以做类似螺线的效果,但感觉可控性不强。
T$ N' Y* B$ j9 k2 `5 W$ m& c9 e3 H+ E7 j3 t, I7 x
7 | ~" p8 X C' h% c9 E! Z+ u4 }+ L+ S9 I! r. n k
我从画同心圆得到启发,发现可以利用极坐标滤镜来画螺线,无论是等距的还是开放式的都可以画,步骤也比较简单,只有几步而已。
( f. x" [* i/ C# Q! o
1 k& g$ J$ f( n. K3 Q 先建立一个矩形空白文件(400*20),画一条斜线(如果是粗斜线,那么注意斜线在画布的另两个顶角部分也要画斜线处理一下以保证下一步填充时能够正常衔接),定义图案。如图
7 v L! f: E& i9 @; q
, ?' V4 r' k" B( b. G
! C3 U, `; {* J" e( D/ E
9 W+ Y2 _2 _: w; S% V( S9 l 建立新文件(400*400)用刚才定义的图案填充。如图
+ }9 v3 ~% q9 P
' |+ l& P7 G' j- q7 c% m2 U
0 S! P7 W L' G, ]* J
$ y, ~+ o# i; {/ y. g! c
应用极坐标滤镜,直角坐标——极坐标
v' i: a: T& E+ |9 n
1 o, q% P; _% E# ?
3 r; s) B Q, T4 J
+ t& L8 o2 R' M8 g5 r, X+ t8 Q+ b, } 应用光照滤镜。
' X% d, O `. _- G G& T# u" q
* A: }6 W8 y/ S7 J
6 _7 Y6 ]! W I
0 S% k& V- `) y& U) T5 g4 | 再应用球面化滤镜和其他的修改,完成。
! ?: C: k& @3 F, a8 J0 O
^& ]% t( J* G V% k
1 r3 C5 i' x2 y; p* Q _- U7 V- \, B0 r4 s2 v: Q
0 j N3 x! J+ S' P9 i8 `% s% }3 b7 s. b4 [
上面这个图是画等距螺线用的,如果画不等距螺线,需要改变每条斜线的间距和斜率。
2 a' p" w" Q+ ]4 _' S- G. \' C
$ w- d' y5 R) \5 `! _
4 l2 `, y9 s9 s* ]0 p7 \- a
+ F8 B4 V* L. y9 u q 说明:图片的右下会出现一道黑色的痕迹,这条黑线是原图的底边上的黑点映射过来的。原图的底边在极坐标后会映射为与新图外边框内切的圆(正方形画布,如果是长方形画布就是椭圆)以及圆外的所有空白的地方。如果要避免这条黑线,只要注意原图的底边线为背景色就可以了。其实这道线也有其特殊的用法,具体见后面的例子。
v G6 S# X, [2 v! Y2 F! D3 H
* `; {( l# h8 `" i6 u0 S
画好的螺线还可以用ImageReady做成Gif动画。
! [, Q8 z; j6 H4 Q% `( v* E8 r2 {6 s: q, R
2.5 纵向斜线和网格的极坐标变化
7 W* _" @$ Q. h: N
, X Z9 m" o* N8 t+ V; P& x 道理都是一样的,看明白一个,其他的就都会了。但要注意,如果是填充竖线,新的画布尺寸最好是原定义图案尺寸的整数倍。不然,原图的左右两边在极坐标滤镜之后不能很好的融和。
# N) E! B( Q9 u& s; @
9 n/ H: t. \" j2 I+ T% C 下面的这两个图就利用了刚才介绍的黑线做成了内切圆外的放射线。
& ?, L( q! V: ~& j, f6 N! U0 x& t; D4 t% G5 u/ \7 t
6 ^& e& C* }) c
) D6 R" F. p2 D3 A7 p
5 b2 P2 f% \8 P0 i, y* P B! L
复杂图形演变
5 y( N) U5 ?+ C* T+ e& F" E, x
( V5 s' t0 X+ M* u- ]% h' h# m; F% Q
1 X4 M* z4 D! n% P
1 d; S- r7 L# M7 T' O A& P) g; o3 R& o7 ~* x" ~, o9 @6 q$ O; l; D1 Y
2.6 网格的极坐标变化
2 Y+ [/ s, x! |7 O7 L- S! }/ @- P2 y6 u, k
利用简单的网格配合其他一些滤镜的使用可以做出各种出人意料的效果。如图组6~组9。下面以组8为例简单介绍一下制作方法。
3 h5 v" |) y& c \) ?/ C1 q7 Y# f8 K
1 f6 l8 l- Y; S0 ? 先画网格,不知道大家用什么方法画网格?填充还是别的什么方法,以后可以交流一下。我画网格用的是拼贴(Tiles)。
" I0 h& f- V! |
% T$ J. l3 P8 E" w5 r
0 _+ [/ g5 N$ N1 Z5 H2 ~$ V
7 I8 O5 |6 I9 R: L* e; T) G& N) H$ P) i6 s7 K0 r. b
$ r9 W* L' l* r: n
( o& W5 F+ k! }$ S4 j: e
使用极坐标滤镜(极坐标—>直角坐标),垂直翻转。
; U6 t* ]8 [# v3 X
' W" ?! e* T6 B8 U# e7 Z5 l
5 V0 K5 g& r5 w3 k" k; Q
6 Q" E; t( }4 x! Q; n: x
. ]6 e( e+ X4 v( ]% V 再次s使用极坐标滤镜(极坐标—>直角坐标),垂直翻转。
& t( |, {( i5 G4 h% ? B9 X; e: w: M% q5 {
" \ z, E: V7 k: I6 O
: P$ s) I! ^* M; ~* v" O+ L
9 \& X. R. C; _# R9 T: l) A. y1 f
再使用极坐标滤镜(直角坐标—>极坐标)
S" T; [' h& ]) d4 q! c5 h6 U0 Y" W' K3 N8 Z, h* E
; ]# f& w2 j2 k( f X
& [2 E) U" R4 @, L! O: X
/ ^$ C+ t5 @' U Q0 Y5 f5 U 使用光照滤镜,曲线
, t% G `: p, Q3 i* y# \& ~1 N
: R. m. y, z7 r
# y6 I0 ?: ?/ b3 s/ f5 z
% v" M9 V; e q2 o6 q2 p0 x. `. Z
2 R$ j9 m" i6 j; s
) G8 \0 K! Y0 P
完成效果如下。
9 ^: ` S$ n% A3 `/ W' `/ }+ E, F) Y
; k+ I" K4 n* j; ~
$ j: u" E E2 D8 U8 m
) F0 Q; f/ i4 L# S
2 d! H" [$ M H+ R. U$ h
0 D* K/ ^9 R: n0 s3 x: P5 m2 \+ f
# N8 ]; N: E4 O% e4 B& q. m 组7和组9的制作方法与组8类似,只是中间夹杂了一些其他的步骤。
* q6 r' F- X8 V; V' A
) l- D% ?- Y( T! ]
) }' V u0 x% s) ]" k: D0 u& r6 |
8 M8 E" v& L1 i! P" H
2 x/ B% b0 A* l v
# E5 J5 H3 h! K9 m$ h$ d 其他应用
9 ?# ]% j' g8 _6 t+ u; }, T$ {6 C% Y& G+ k: r) Y7 G
1 Z. o$ u# k0 h
/ u9 \: k) G+ F" @; Y+ t6 ]% P5 a/ @3 ~! F( N% R
2.7 制作光盘
$ Y2 B. f& c) X# k5 M+ i
' U: \1 l* U2 b 制作光盘的方法很多,这个当然是用极坐标画的,但感觉做得并不好。
' d& R$ i( r3 b9 j. W3 c9 R" ]3 n; g' \0 i; {% ^2 J' w
8 ~3 V, p" w* A2 L
/ d. Z8 I. N5 K8 t) B/ l6 L
9 K( w' {( R( l/ M& t6 }
2.8 放射文字
" ~. q( r8 o6 r: B
7 a: q2 N) {- u/ K3 y$ z/ [9 p# y, M; _3 }$ G/ _4 A
+ p/ B7 Z b; {: T0 R
组11,关于这个网上有很多教程,不再赘述。
0 I2 t0 e3 @7 w% y, B
8 f, Q, f1 W, M# B2 c) O: G
& @! l3 w9 k o; x$ T' A既然如此,那么
极坐标到直角坐标转换有什么用处呢?大部分情况下,需要进行极坐标变换的仅仅是图像中的一部分,如果直接“做直线->直角坐标转极坐标”,那么原有图像也会被扭曲。因此可按照“极坐标转直角坐标->做直线->直角坐标转极坐标”的方式,就能保持原有图像不变。
4 Y* c! B* O8 [% a5 w z
由此我们可以总结出极坐标滤镜以下几个特点:
; V+ S) u8 T# T" g- 直角坐标到极坐标转换用于做效果,而极坐标到直角坐标的转换用于抵消前者的副作用;
- 水平线转换成圆,垂直线转换成放射线,斜线转换成螺旋线;
- 原图像上侧对应圆心,下侧对应圆心外;
与风结合 : Y$ C: m( f8 {
风滤镜恰好是制作直线特别是渐隐的放射效果直线的好工具。根据上面 “极坐标转直角坐标->做直线->直角坐标转极坐标”的理论,使用风来制作直线,就能获得所需的放射效果
D8 I) u# b" `0 N* w6 B7 g& k, O6 _# ~. @ o# Q# T8 z% r
$ `5 Q( |5 b4 I" \5 l, ~. J. b& e8 h
i: {, S( g6 D. I. ?4 ]5 R6 E
6 n* w3 k0 h9 _
2.9 形状的极坐标变化
/ K7 s* B7 Z3 F; M0 v+ ~+ R- W- F$ t# w, h
我最喜欢这个,是无意中试出来的。组12。
9 }4 P8 r* R/ [% F1 P4 i/ G
1 o2 z8 P9 h1 w% t1 l
' _' U: ?+ y+ l1 g- h' p$ ]: [& u
7 C# ^' @/ _3 |, W5 Q, j/ t2 |
' X9 c @( V( s5 d 具体应用就讲到这里,最后讲讲一点点理论,说一下极坐标转换滤镜的工作过程。
* _' |5 A! l" F3 T3 _% m4 G. {- t2 I4 h- }3 F) q ~/ f5 D2 J( B" M
三、 极坐标滤镜的工作过程(直角坐标到极坐标)
, K! V: z, S+ \: c3 n$ Z( a
1 u) d- `, N" }, O) j; A% x 一般而言,位图图像中的任意一点(象素)可以用直角坐标(x,y)来表示。同样这个象素也可以由极坐标(r,a)来表示。极坐标滤镜的工作过程就是将基于直角坐标系的象素(x,y)经过极坐标映射(r,a)之后再由直角坐标(x’,y’)表示出来的过程。
8 _; o4 r; J- e
& {9 J% [2 A" V0 h" e 直角坐标和极坐标的互化公式如下:
2 B k. V! m/ Z# V j/ ~0 A; s
3 i- P) K5 \8 N0 ~! L* _7 ] r = sqrt ( x * x + y * y )
9 b. E3 K4 l: G; l" r- [8 [
/ g7 I- q$ U3 ` w. F) X! j, g2 E a = arctg ( y / x )
0 b/ \) q$ i$ |/ h d4 a3 L, Z! P9 P, |% A
x = r * cos ( a )
% S, V3 r1 r* I/ Z0 r3 t; L8 ]* P% M* b u
y = r * sin ( a )
. p, f" k5 g! N8 D/ w
$ Y0 c3 N! k0 o& m7 k" j0 [ 下面是一段是模拟极坐标滤镜工作的伪代码。这个代码并不是我编写的,我也只是看懂而已,更详细的解释可以参考下面的链接:
; x8 _+ m) W6 J: Z% ^2 A O; K9 K. |1 U A3 R/ g
http://www.jasonwaltman.com/thesis/filter-polar.html " d1 Q; M) X( s& i4 P# O* x
- A8 e& L: w0 e" b# E (这是个国外的网站,站主利用C++模拟出了一些PS的滤镜的效果,而且提供源代码和源程序。)
+ `: e1 ~ m* H+ E$ b
( m, h u, Y. `; U7 V2 q for every pixel in the original image do
! z, D: o( R9 L$ H1 a2 e w+ }: `- \1 P- v% C
{
1 o; N$ M9 I) n7 e& M. r3 p, E
* T: n: P$ h! Y Q/ \& U
// x和y是当前象素在直角坐标内的坐标。
B& m2 n S" K, T0 m3 e9 h+ y! H+ Y0 e( g" W
// 图像中心点的坐标为 x = 0, y = 0。
1 w9 B9 w6 f) M1 h1 m8 v/ \. E+ y# W! F4 i3 r* f6 d/ e
// r 和 a 是象素的极坐标。其中角度a为弧度单位。
& d1 A# G! z y" I" `6 I D9 N! ?# d! r0 v! C
r = sqrt ( x * x + y * y );
2 s9 k# _6 e1 ~, s. t
9 b( e* p) n5 ?: l8 i a = atan2 ( y / x );
' }. ^+ ~# ]1 A+ P/ i6 n! s+ u! m3 I1 K* x$ Q1 ^ z
// R取图像长和宽的最小值的一半。
8 c' l( ^) t3 M9 s7 S. H/ l U# N
3 S& E1 A; ^5 [% Z/ H" `* S$ _. r
R= min[ image_width , image_height ] / 2
/ f9 h$ R0 w2 {/ x/ T, F
2 C5 i* f4 q' k3 T
// 新的x和y是经过极坐标滤镜变换之后,象素在直角坐标系中的新坐标。这个转换的目的,特别是R和6.2832(2pi)的选择,我认为是将转换后的图像限定到原画布大小之内的作用。同时这个步骤最终导致了图像的变形。
9 e f. |( e { c% O
+ v( I- O8 O2 i! M% E x = r * image_height / R;
* N9 T" E- y5 ?0 q2 m4 d: `
S/ { c6 G# I! I* ?" l3 W
y = a * image_width / 6.2832;
# O5 T2 j: |+ v* R2 z
* Z) o# c" v4 U! V: V. B filterpixel.x = x;
?5 O# a% j7 J8 h. K ]5 b. `; ?6 F2 J
filterpixel.y = y;
: N4 K h, o( [/ O8 n
1 Y' l! K* s% m }
) M0 y+ A' e! v% M+ {6 W& ]
- S. I5 w( x3 ?6 w7 j 这仅仅是一段伪代码而已,真正的执行过程要复杂一些,如果继续深入下去就严重跑题了,所以深入的讨论还是请参见那个链接,自己去看吧。
! \+ K6 P) v6 O
# H' S5 |1 R; G# T% u0 J' T! B 最后引用那个网站的一句话作为结束语。
/ @; [4 z4 L/ a V8 O$ b& B6 N; C3 m. P" L
“If used creatively, the effect is worth more than just its novelty.”
+ [# s# r) S( \
7 z5 Z0 b8 s0 U6 D2 n) f) ^ 希望各位在看过本文之后能有所启发。口动不如心动,心动不如行动,期待各位的作品