大神级Python工程师是怎么P图的,带你用Python玩转P图

[复制链接]
nitenite 发表于 2017-12-31 08:20:30 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
分享前还是先分享自己的Python学习交流群:666468218' F6 N' d- \! Q% Y1 z, W

$ \9 Z8 t2 [4 g0 F3 r群内不定时分享干货,包括最新的python企业案例学习资料和零基础入门教程,欢迎初学和进阶中的小伙伴入群学习交流
- b& n6 f, u# x% E. r* ]  e* f+ b1 c
, e$ \4 y2 p) r  _, t5 ]: w
1.PIL:Python影像库
. \- J% |9 Y( o- m  P3 ?7 c3 c+ x1 d4 B
PIL或者Python Imaging Library是一个包含许多函数来处理来自Python脚本的图像的包。PIL官方网站在这里。目前版本的PIL是PIL 1.1.7,可用于Python 2.3到Python 2.7。本文将使用Python 2.6的PIL 1.1.7。" {) Z1 o3 H- I, L
在Windows(XP,Vista或者Seven)下,安装PIL相当简单:只需启动PIL Windows安装程序即可。当然你以前需要一个有效的Python 2.6.6安装。. y% L3 v' Y: R- ~9 e1 G8 T
PIL文档可在这里找到:, d: E6 v( W& z( L) a" Q

    - E9 A7 O. Q9 s9 R) m
  • 在线PIL文档
    / Z$ l4 z6 b# @
  • PDF PIL文件
    5 m9 M1 Z. C# a5 }3 w" N2 }1 d
2.加载图像+ [9 M: o5 d% K+ _! {& e

: Q! i5 F% H+ a; x- k2 M这是一个小的INIT脚本,它使用PIL来加载图像并显示它。如果您需要,可以在Image.VERSION变量中找到PIL版本。# o% g! w7 j0 z% G" ~
导入HYP_Utils
$ _6 O1 ~' S5 y! B( N  ^: c4 g5 U导入系统
: q% s/ \8 ?# r7 z2 c% j从PIL导入图像
$ p+ ], w* z6 F& G9 EscriptDir = HYP_Utils.GetDemoDir()/ `! v- w0 J) M0 g( L, x
PIL_Version = Image.VERSION* }8 _9 i0 x; n& t& i; R
img_filename =“%s / flower.jpg”%scriptDir
$ z7 U2 ?2 R2 D6 N/ u. Z# Tim = Image.open(img_filename)5 R! w* o3 d  F! b
im.show(). h. }8 u' g4 }- j4 [
在Windows下,Image.show()函数将图像保存到临时文件并调用默认图像查看器实用程序。0 m; k/ N9 t" h1 [0 s
3.保存图像! W2 Y) [* R' E, r8 F

/ r2 _3 Z5 n  u1 Z# J# x" p1 G只要调用Image.save()函数。你想保存为JPEG格式?只需将.jpg扩展名添加到图像文件名中即可。对于其他格式也是如此。- ?, I- a( p, y. {- J
阅读和写作支持的格式:*。bmp,*。gif,*。jpg,* .msp,* .pcx,*。png,* .ppm,*。tiff和.xbm。, ]+ S  Z  P! w
这里是一个简单的JPG到BMP转换器:
/ T4 ?- d/ n5 W5 m2 Z7 H导入HYP_Utils
# p/ [+ `, I! I2 q% s$ b从PIL导入图像: P3 v' P' c, j, R. Y. K
scriptDir = HYP_Utils.GetDemoDir()
8 ^8 _' [1 d" r- o0 e& SPIL_Version = Image.VERSION4 O4 i: M1 e, j7 {% M5 E
img_filename =“%s / flower.jpg”%scriptDir
0 w3 \# ^% Z$ a4 p/ Qim = Image.open(img_filename)3 L# s3 k0 L7 i6 ]0 r- a5 U
im.save(“%s / flower.bmp”%scriptDir)
$ q, N1 [: L  |4.读取像素1 P+ G  |! Q. R; m- W, x

/ I" e$ r$ X8 T' Z% u  [/ y% |有两个函数可以读取像素图(或像素数据):Image.getpixel()和Image.getdata()。
. S1 o5 v  P( [0 p2 O' K图片。getpixel()返回单个像素的值。只需给出一个带有X和Y坐标的元组,getpixel()就可以为RGB图像返回一个3元组的RGB值,或者为亮度图像返回一个值。图片。getdata()返回完整的像素图。您需要Python函数list()来创建RGB元组的像素列表。/ ^! ]  D/ E! @2 o
这里是一个代码片段,用PIL加载图像,用GeeXLab Python API创建一个纹理对象,并用图像像素填充纹理。6 z0 H) t  D7 b0 |8 m
导入HYP_Utils
6 d! h. |7 B4 {. V) Q; E% \导入HYP_Texture$ S2 h8 u& n' ~, q
进口HYP_Material# {0 P( V6 J4 I, m9 G1 A
导入系统9 f  L6 g- o' H$ g, v
从PIL导入图像
# O' w& D* d8 w2 |7 vscriptDir = HYP_Utils.GetDemoDir()
  Z. A# `: a8 d' k3 Z4 HPIL_Version = Image.VERSION6 u: D# T1 y" W: d% R) k, l
img_filename =“%s / flower.jpg”%scriptDir1 @5 `7 t$ e- f" I
im = Image.open(img_filename)
  W/ }$ v6 K% M8 h  j. d9 dimageW = im.size [0]( k  U3 n( w, @% a
imageH = im.size [1]  I2 D! \! ~3 s7 r# L7 ^  z
TEXTURE_2D = 2* u4 |5 K6 H1 F; G
RGB_BYTE = 2* c1 l- k* P; S) A( c
texId = HYP_Texture.Create(TEXTURE_2D,RGB_BYTE,imageW,imageH,0)
% G7 g3 `0 e$ z0 f, T; {1 imatId = HYP_Material.GetId(“plane1_mat”)0 b( h  n9 m; ^% M0 z1 h4 F
HYP_Material.AddTexture(matId,texId)1 x9 C% C+ Q3 [. F! K  ]% ]' s: `
如果(im.mode ==“RGB”):
) B1 ]0 Y$ J2 g 对于范围内的y(0,imageH):' R2 \6 W$ ?7 i2 c
对于范围内的x(0,imageW):
, _0 [, d% J+ X5 D+ E5 O$ Z offset = y * imageW + x5 s. A. o" j3 d7 I, ?5 G; x
xy =(x,y)
0 k3 a' ]  u+ H9 \ rgb = im.getpixel(xy)
! q6 q' F$ o8 d/ O  D$ Y, w! d HYP_Texture.SetValueTex2DByteRgb(texId,offset,rgb [0],rgb [1],rgb [2]) # [: T$ w/ E' |( W9 W/ X/ C
elif(imout.mode ==“L”):: K5 {# i% d/ n' a
对于范围内的y(0,imageH):
: i+ u6 e7 h* T( F 对于范围内的x(0,imageW):$ ^5 g; q# i, c3 }" ^5 J! D& I
offset = y * imageW + x
9 K  g7 @- R! m- A- j xy =(x,y)+ g7 f5 M7 J. g# g- O& ^1 e/ t, p: @
rgb = im.getpixel(xy)* Z9 v; @  ?6 c9 ?4 q" G7 H
HYP_Texture.SetValueTex2DByteRgb(texId,offset,rgb,rgb,rgb)
: E& G, o* I/ l" i$ h使用Image.getdata(),前面脚本的最后几行是:. `- }! L) E0 t7 U( O) J
pixels = list(im.getdata())4 _# d; }9 a* r3 u% }1 z
如果(im.mode ==“RGB”):& j! Z" h, z0 }; M* `
对于范围内的y(0,imageH):- W# i/ S/ r6 `; ^2 ]; x
对于范围内的x(0,imageW):
4 K# e1 U$ @* }& r0 p offset = y * imageW + x
1 W) L0 p0 l2 S% @; N rgb =像素[偏移]; o# q' H- e) L8 ~: Q. {0 v/ r
HYP_Texture.SetValueTex2DByteRgb(texId,offset,rgb [0],rgb [1],rgb [2])
' J1 e7 Y& @% h* @7 |# v  D/ ielif(imout.mode ==“L”):
: O4 Q9 E4 c8 m7 Y7 _ 对于范围内的y(0,imageH):
" P4 g: s! S9 k1 b 对于范围内的x(0,imageW):
" Y6 |5 q9 d. y, ^ offset = y * imageW + x" \& U: s" b* A1 E( `9 Q
rgb =像素[偏移]( j: z1 g0 R. U# ?6 s0 R( R
HYP_Texture.SetValueTex2DByteRgb(texId,offset,rgb,rgb,rgb)5 @& ^0 J. ^" y# `7 r# z9 G
5.图像处理/ [  J& ?. E, C; S

6 v2 `# H9 o; p# n您可以使用PIL轻松应用通用图像滤镜:模糊,浮雕,锐化等。只需导入ImageFilter模块:0 o0 I2 Z% G$ I: @2 U6 l% w
从PIL导入图像
9 f+ j5 T. V; ^$ o& \从PIL导入ImageFilter
9 }; J* I9 R$ D# ~...
* s8 d2 d3 I& Ei = Image.open(img_filename)
% V. l2 k1 D4 tim = i.filter(ImageFilter.EMBOSS)
5 Q1 t$ V' X& h; `  C4 e#im = i.filter(ImageFilter.FIND_EDGES)
9 w1 A! X* L+ `: B7 b...
% r( U6 P* x, D; j预定义的滤镜包括:BLUR,CONTOUR,DETAIL,EDGE_ENHANCE,EDGE_ENHANCE_MORE,EMBOSS,FIND_EDGES,SMOOTH_MORE和SHARPEN。" j+ p2 f$ q3 M" x( r
还有一个名为ImageOps的模块,用于显示colorize(),flip(),grayscale(),invert(),mirror(),solarize()或posterize()等图像处理函数。9 z$ I: s/ S# k8 ~( L
6.添加水印+ X4 c( [' \8 h; X8 h
. U& g' M1 D* O2 \4 F
ImageDraw和ImageFont使PIL能够在图像上写文本以及绘制线条或点。这是一个代码片段,显示了一个简单的批量转换器与PIL:它读取文件夹的所有jpg文件,添加水印(十字和“GEEXLAB”字符串),并保存带有gxl_前缀的图像。1 F6 B2 T. b' k5 Z
导入HYP_Utils5 _8 \/ m7 E+ s: X
导入os,glob
7 U) L1 r' ?1 J从PIL导入图像- Z0 x) ]2 L3 A
从PIL导入ImageDraw
9 P; T% K, G1 @; }* \  T从PIL导入ImageFont
% f8 ^+ m' j: O% d, a7 qscriptDir = HYP_Utils.GetDemoDir()2 B" L3 P. I) h$ S6 W7 @3 p
ft = ImageFont.load(“timR24.pil”)
% U$ I1 ^) V* S# a" E/ sos.chdir(SCRIPTDIR); T6 F. G9 Z+ J6 P
file_list = glob.glob(“*。jpg”)5 ?* ^* j: b( \- a& m% |! U$ u
对于file_list中的f:* m- b5 v4 z* s1 M2 L% }
im = Image.open(scriptDir + str(f))
/ S8 i4 q; ]1 a; e% l( l  x1 C% D draw = ImageDraw.Draw(im)7 `% h( X+ I$ z
draw.line((0,0)+ im.size,fill =(255,255,255))7 z) E1 N4 {0 Q, c$ e
draw.line((0,im.size [1],im.size [0],0),fill =(255,255,255))
! H% ?% M# R# W4 Y, c  X( d$ Y wh = ft.getsize(“GEEXLA B”)
" i, M3 Z& r: I draw.text((im.size [0] / 2-wh [0] / 2,im.size [1] / 2 + 20),“GEEXLA B”,\! U% a' n3 \0 X6 Z2 Y& [0 A
fill =(255,255,0),font = ft), A, `; I! _  \" O/ g  `( u- }
draw.text((im.size [0] / 2 - wh [0] / 2,im.size [1] / 2 - 60),“GEEXLA B”,\ / G( i+ [+ Y  N1 K0 ?+ w3 I
fill =(255,255,0),font = ft)
( Z6 ]- R, h& b; Q0 Z+ l& U+ K: |9 o 德尔绘制
+ M0 S9 W& s1 ?0 U/ r im.save(scriptDir +“gxl_”+ str(f))
! G: o4 u0 s. l: T, H还有一个很好的函数ImageFont.truetype(),但它不能在我的系统上工作,因为这个函数依赖于_imagingft.pyd库(实际上是一个DLL),由于Visual C运行时问题,无法加载。这是GeeXLab控制台中的错误:3 \6 h' ]. x% y4 G
我们来看看实际运用
6 z5 U0 m1 L' T6 ^+ B* E6 X* c0 z
6 _0 M' q: }: G1 k  A8 t/ L; N
    % q6 S0 \! B0 s7 z& D
  • 调整图片亮度:
      ^0 d( T2 m8 }: Y+ O" a, e9 y
( d- B: ^, N! c0 d3 f) ^2 E
就个人而言,我认为这张照片看起来不错,但为了演示,我们试着把这张照片调亮。为了提高照片的关键是使用 Pillow's ImageEnhance module:% H! h% \- b4 _  W8 l; b0 ^( J
4 @, n$ t2 L3 M) W% c6 e
运行完上面的代码,你就会获得下面这样的图片:
  u* L2 r! K9 C) K3 ~# n6 J. c, q$ q- t: o- W3 Y( x1 o' x
如果你将enhancement factor调整0.0,那么你就会发现整张图片都变成了黑色,而如果你将其调整为0.7,那么你将获得下图:
! N+ C# n( p' o. a9 J
$ P# I* m7 ?: l* O# q

    8 A2 D  l0 _! \9 h% [$ G: V+ q! C
  • 调整图片对比度
    2 n; p9 |+ a% X0 t/ p% P. v
如果我们之前拍摄了一些比较暗的图片,我们可以通过调整对比度和亮度来优化。- N, j9 X$ Q9 R! z7 ~+ p
$ m$ m! t1 I, M2 Z' M* M) z
上图是一张毛毛虫的照片,我们可以通过将下图的代码和上面的代码相结合来调整图片:
) w3 v1 d1 ?1 Y" H. j1 D: o( K  s1 F! m4 V; \  f
ImageEnhance模块中的所有类都以相同的方式运行。你可以通过改变增强值来优化图片,下图是我将值调整到0.7后得到的:3 l* ^$ V+ T( c+ f+ X

: k. r% G6 H9 i: K$ Z9 d1 l
    " ]2 F6 C  q% B) F% t6 Y; e
  • 改变图片的清晰度$ h0 s: `8 f+ p; d

7 L. t/ {9 E7 H* u0 P如果你想要通过代码来实现图片锐化,那么下面的代码就值得一看:4 v. B# I- C* l  K( s  H' C
2 ]0 J% w- A3 r  I$ Y3 N# U
在这里需要改变的是ImageEnhance的Sharpness类,如果想要锐化图片也可以参照上面的操作。# w+ C6 O0 M/ `( L+ |; r6 \  f
Pillow package 有很多简洁易用的功能,例如color类,有了它,你就可以随意使用Python来优化图片,玩转图片也可以这么酷炫!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题
推荐阅读更多+
阅读排行更多+
用心服务创业者
0851-88611148
周一至周五 9:00-18:00
意见反馈:admin@0851life.com

扫一扫关注我们

Powered by 童码少儿编程 X3.4© 2001-2013 0851life Inc.|网站地图