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

[复制链接]
nitenite 发表于 2017-12-31 08:20:30 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
分享前还是先分享自己的Python学习交流群:6664682182 S# O& U( A* ~0 l$ @

/ Z) M- @+ O  j5 P1 S) Z& ?. X群内不定时分享干货,包括最新的python企业案例学习资料和零基础入门教程,欢迎初学和进阶中的小伙伴入群学习交流$ H- @6 ]' A) r3 C
) _: G: p# X7 n% \3 `) Q$ G
  |  k! D$ K3 y- ~( J3 c
1.PIL:Python影像库: T4 t) s/ T% i8 d; q2 Z

' \! h% ]" c4 _+ q: }1 j3 i& kPIL或者Python Imaging Library是一个包含许多函数来处理来自Python脚本的图像的包。PIL官方网站在这里。目前版本的PIL是PIL 1.1.7,可用于Python 2.3到Python 2.7。本文将使用Python 2.6的PIL 1.1.7。: [* }  T2 i6 }
在Windows(XP,Vista或者Seven)下,安装PIL相当简单:只需启动PIL Windows安装程序即可。当然你以前需要一个有效的Python 2.6.6安装。2 ]9 h/ d0 T, H) K) ^' h
PIL文档可在这里找到:2 S2 N7 w* ~' W. ]# Z0 ~1 \' Z

    8 Z5 q5 g2 K1 a" c# P2 Z7 ~. t
  • 在线PIL文档
    7 _" _" b% X! `. ~' D- h
  • PDF PIL文件
    2 v2 b0 C/ ~7 l' r$ l8 ?
2.加载图像
$ B/ K$ ?* k1 ?
$ n) z: T5 u: B8 F这是一个小的INIT脚本,它使用PIL来加载图像并显示它。如果您需要,可以在Image.VERSION变量中找到PIL版本。. a4 _/ z9 Q" C7 e* B1 n0 n
导入HYP_Utils, D! h1 Z; X: _) x& J: s
导入系统
( ~1 z* J9 x0 K1 ]7 D" L从PIL导入图像' i( v! x$ O, h
scriptDir = HYP_Utils.GetDemoDir()
4 y9 F2 h, a# A# r/ Z- Q( APIL_Version = Image.VERSION
$ [# \# E% ~2 Y! Qimg_filename =“%s / flower.jpg”%scriptDir
/ H' m, f( S8 x7 L& R: fim = Image.open(img_filename)7 j  t. H( p( ~* @. w* s7 b0 w# g
im.show()
" Q! N! C- B0 B0 o6 d1 i; o3 r7 t在Windows下,Image.show()函数将图像保存到临时文件并调用默认图像查看器实用程序。5 e8 e, D3 G$ W+ q5 t2 H
3.保存图像0 t+ h! x: `+ @: E3 R$ b3 T
$ _; J- h: z! h0 y3 t( a9 @
只要调用Image.save()函数。你想保存为JPEG格式?只需将.jpg扩展名添加到图像文件名中即可。对于其他格式也是如此。
/ D- z) R; I3 Q, I, V% x) Z* L阅读和写作支持的格式:*。bmp,*。gif,*。jpg,* .msp,* .pcx,*。png,* .ppm,*。tiff和.xbm。
; P  h8 F* T& R& V) g这里是一个简单的JPG到BMP转换器:
1 G9 A, [4 h: r4 U导入HYP_Utils# d( C3 |. b" u" d  B2 f; j; o
从PIL导入图像" q6 I" D8 h/ r; r) F. g+ ?
scriptDir = HYP_Utils.GetDemoDir()4 ~7 u2 u6 @( f3 I2 a* S" R  v
PIL_Version = Image.VERSION
- t. I- J" b* H  ximg_filename =“%s / flower.jpg”%scriptDir
4 r6 x' z4 o& yim = Image.open(img_filename)
( |1 }' Y* f" ~  @; @0 R7 Y5 fim.save(“%s / flower.bmp”%scriptDir)
; s/ H# p7 W( i( ]# w' }4.读取像素/ y1 B, W4 k6 r. W; B

( O2 p2 Y( L  M3 c. F5 `$ o有两个函数可以读取像素图(或像素数据):Image.getpixel()和Image.getdata()。* ]4 l* W5 c/ l7 |/ B
图片。getpixel()返回单个像素的值。只需给出一个带有X和Y坐标的元组,getpixel()就可以为RGB图像返回一个3元组的RGB值,或者为亮度图像返回一个值。图片。getdata()返回完整的像素图。您需要Python函数list()来创建RGB元组的像素列表。
! ?5 @4 ?* f: k这里是一个代码片段,用PIL加载图像,用GeeXLab Python API创建一个纹理对象,并用图像像素填充纹理。) d7 c1 C& V2 |
导入HYP_Utils
' m! [) u2 K& f: c导入HYP_Texture
% s4 Y0 ^, M; ?6 }0 G: B9 T进口HYP_Material" ~8 i5 u; y8 G! `& v
导入系统3 ~! e* \' L/ T5 p! w7 E
从PIL导入图像3 t, K' Q4 i, k( O, z# q
scriptDir = HYP_Utils.GetDemoDir()1 k8 v. k) ~4 V/ {- E
PIL_Version = Image.VERSION  W0 @+ m7 |) O2 I+ a- Q
img_filename =“%s / flower.jpg”%scriptDir
0 n6 |, ^* [) z  b$ q, @im = Image.open(img_filename)' g, b( n! ^+ @. ^2 U& F
imageW = im.size [0]
- b, W$ g9 ]( i4 k0 `7 s! ]7 ]imageH = im.size [1]
  b  n- I+ {5 U! j1 D9 bTEXTURE_2D = 2( B# F% d+ i. H/ T
RGB_BYTE = 25 _! `8 d3 G) O6 A
texId = HYP_Texture.Create(TEXTURE_2D,RGB_BYTE,imageW,imageH,0)
6 V2 a' t; }" g' P+ y! pmatId = HYP_Material.GetId(“plane1_mat”)$ p- v* ^# H1 w7 X: p/ d- {4 o1 J
HYP_Material.AddTexture(matId,texId)
4 n% V3 A: J5 O. U# S6 Z4 q" A如果(im.mode ==“RGB”):% u# X& S- S# H- D) h! U: M
对于范围内的y(0,imageH):! i7 C3 A9 k8 {6 `* ^" {/ D$ J
对于范围内的x(0,imageW):8 e2 K. W2 s( S/ s
offset = y * imageW + x
- M, S* r2 o9 W% T% a xy =(x,y)
* M4 f  |9 X$ B: Q# h$ {4 f9 }- R rgb = im.getpixel(xy)  O; h/ [! \7 B+ R( Q1 X- a* Z
HYP_Texture.SetValueTex2DByteRgb(texId,offset,rgb [0],rgb [1],rgb [2])   n, Z, A/ y+ t' ~
elif(imout.mode ==“L”):
0 ^, C/ u( R2 r* L& `! X 对于范围内的y(0,imageH):+ _$ F+ S8 Q( u- j3 G& k  c
对于范围内的x(0,imageW):0 A- C; y) a2 S+ q* _' W
offset = y * imageW + x4 h0 F- X+ k( H$ ]  C  s9 v
xy =(x,y)$ Z0 M; B* e9 z! p3 z  T
rgb = im.getpixel(xy)
* l5 e8 u. f- Y* E3 Y% f/ p6 q8 Z HYP_Texture.SetValueTex2DByteRgb(texId,offset,rgb,rgb,rgb) " Q. @8 ]" a4 W; X2 x7 \- @2 Y/ n
使用Image.getdata(),前面脚本的最后几行是:
) o* s& l) w# }  x  |4 Spixels = list(im.getdata())! i& r2 g; O$ P5 v0 I, o
如果(im.mode ==“RGB”):
- K2 f2 @/ B' t% J  z 对于范围内的y(0,imageH):7 Z7 ~7 H9 E: M6 l& _
对于范围内的x(0,imageW):
4 L3 X: h' }( u% w' x offset = y * imageW + x4 [/ S) o; ~; Z
rgb =像素[偏移]' p" Z8 J% S, p( J' R
HYP_Texture.SetValueTex2DByteRgb(texId,offset,rgb [0],rgb [1],rgb [2])
6 W" _3 D" i$ M' }: P; Nelif(imout.mode ==“L”):2 L: e% r. {- |9 L  b
对于范围内的y(0,imageH):! z6 T0 Q6 \1 x% V& g
对于范围内的x(0,imageW):& F/ S, I9 C/ G9 i4 G8 _
offset = y * imageW + x
, T& |! M2 ], U. P, l rgb =像素[偏移]
, E9 T5 a4 J( |; e: m' @3 O5 | HYP_Texture.SetValueTex2DByteRgb(texId,offset,rgb,rgb,rgb)8 K, g8 O) W  S- q! G
5.图像处理( I/ b) n; y" V5 {1 ~

- _" p6 N7 Y& g0 x  h: \您可以使用PIL轻松应用通用图像滤镜:模糊,浮雕,锐化等。只需导入ImageFilter模块:; W' t7 Z1 ]% ?8 A6 s# B! v  f6 c
从PIL导入图像
8 ^2 k7 X  _3 u$ R" A, P从PIL导入ImageFilter2 O# g0 b; h% D: f9 h, L
...
/ j; y- }( U$ j8 L* x9 ai = Image.open(img_filename)* |2 M" w" Y$ o6 U
im = i.filter(ImageFilter.EMBOSS)
( g% R3 }  @% V' c+ {- r# r  d4 T#im = i.filter(ImageFilter.FIND_EDGES)  j- b7 @9 C1 M8 M' Q2 _: w
...
* r5 @6 j- R  {7 B' L0 f预定义的滤镜包括:BLUR,CONTOUR,DETAIL,EDGE_ENHANCE,EDGE_ENHANCE_MORE,EMBOSS,FIND_EDGES,SMOOTH_MORE和SHARPEN。* h( ]5 p2 w) F: n- a7 f6 u/ ~- @
还有一个名为ImageOps的模块,用于显示colorize(),flip(),grayscale(),invert(),mirror(),solarize()或posterize()等图像处理函数。3 q# Q" {, A, ~
6.添加水印
0 Q7 X9 A& h% }1 A- ^6 H4 E" g  B' P/ }! q8 `3 L' N3 \- w
ImageDraw和ImageFont使PIL能够在图像上写文本以及绘制线条或点。这是一个代码片段,显示了一个简单的批量转换器与PIL:它读取文件夹的所有jpg文件,添加水印(十字和“GEEXLAB”字符串),并保存带有gxl_前缀的图像。
- e9 O9 ~! n7 `1 ^, j6 ?导入HYP_Utils  V( D, L3 ~+ X+ ?
导入os,glob
- p% }7 I5 f+ L6 o6 R从PIL导入图像4 |" k) E4 b! F1 p- `5 t/ B0 H" D
从PIL导入ImageDraw5 |- x9 j- L+ H. K# V3 M) L; ?5 a
从PIL导入ImageFont5 y; c- ?2 t5 n2 d# X8 X+ M2 v4 G
scriptDir = HYP_Utils.GetDemoDir()
2 c. a0 D; Z5 L' F: G0 _7 kft = ImageFont.load(“timR24.pil”)
0 b+ v. I4 P* V" Y  fos.chdir(SCRIPTDIR)0 I( |  c4 v  \
file_list = glob.glob(“*。jpg”)
1 x/ b  G8 j* [$ |( @1 \! U5 m5 V对于file_list中的f:  h! r4 u' }. ^2 M( O; C6 p
im = Image.open(scriptDir + str(f))  F0 S7 M3 r# C9 h7 u
draw = ImageDraw.Draw(im)
* Q2 H9 v4 J2 P# y! W1 l draw.line((0,0)+ im.size,fill =(255,255,255))
! @$ `8 T% r$ S4 y# |' n8 A draw.line((0,im.size [1],im.size [0],0),fill =(255,255,255))6 E+ I* x' |4 u+ C2 t
wh = ft.getsize(“GEEXLA B”)
; c. S& i) W8 R) F4 I draw.text((im.size [0] / 2-wh [0] / 2,im.size [1] / 2 + 20),“GEEXLA B”,\  A9 u3 P( f; p$ j: D5 f* p
fill =(255,255,0),font = ft)/ ?  X2 W, A6 Y+ Q
draw.text((im.size [0] / 2 - wh [0] / 2,im.size [1] / 2 - 60),“GEEXLA B”,\
/ f% ?, d  M5 h3 V' Z$ ] fill =(255,255,0),font = ft)
, t& e& |( V! u$ ?2 s 德尔绘制
2 L" u: n- q( S0 {8 t im.save(scriptDir +“gxl_”+ str(f))2 {! Y$ F* X2 y6 ], K
还有一个很好的函数ImageFont.truetype(),但它不能在我的系统上工作,因为这个函数依赖于_imagingft.pyd库(实际上是一个DLL),由于Visual C运行时问题,无法加载。这是GeeXLab控制台中的错误:
$ }6 b4 f, z" G9 A- O& u我们来看看实际运用
5 O+ i- c2 K9 E5 m8 k1 }! y4 n: W4 ?2 ~& a, z. H& ~
    4 ]  m3 K6 \" t( G3 y
  • 调整图片亮度:4 h4 C/ d1 a2 s) M' j3 X7 X" g
" F% r4 D9 \$ N9 e7 Z4 T
就个人而言,我认为这张照片看起来不错,但为了演示,我们试着把这张照片调亮。为了提高照片的关键是使用 Pillow's ImageEnhance module:$ ^& D( H9 M) H1 ~; V
( D9 W+ }- s0 p% g/ z. C# D) }! K
运行完上面的代码,你就会获得下面这样的图片:( G' l* o' G* R7 ~9 ^' v! o  P

3 L& b# e( c9 J! J0 Q( c0 }8 l# w如果你将enhancement factor调整0.0,那么你就会发现整张图片都变成了黑色,而如果你将其调整为0.7,那么你将获得下图:/ E3 b$ w* I; c- k+ b: x
6 c$ }+ K; p) C
    ! i+ s* R6 Y4 Y" t" j* F
  • 调整图片对比度5 U1 S  g& A5 b4 W1 P
如果我们之前拍摄了一些比较暗的图片,我们可以通过调整对比度和亮度来优化。
5 l6 o, _) x  P/ ~
4 a( q% g( B6 k8 H# D1 ]# w$ N! o+ N上图是一张毛毛虫的照片,我们可以通过将下图的代码和上面的代码相结合来调整图片:
( ^) i% d" X- v% f. ^
8 B  a; J& Q4 K9 o  c: ]ImageEnhance模块中的所有类都以相同的方式运行。你可以通过改变增强值来优化图片,下图是我将值调整到0.7后得到的:7 `8 H7 Q' S8 ?+ n+ S
5 T" c" t. b0 \  g$ {2 @* l

    2 [5 [7 ^% E$ A
  • 改变图片的清晰度
    ( Y8 O  [) S, w' t  }
! h9 h1 ]5 d/ e1 X
如果你想要通过代码来实现图片锐化,那么下面的代码就值得一看:' ^3 b' L: B7 U, K0 n* q

( ]5 d2 ^1 Y$ ]0 T6 Q7 K在这里需要改变的是ImageEnhance的Sharpness类,如果想要锐化图片也可以参照上面的操作。* H3 K6 E# `/ j- t9 T* B1 P
Pillow package 有很多简洁易用的功能,例如color类,有了它,你就可以随意使用Python来优化图片,玩转图片也可以这么酷炫!

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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

扫一扫关注我们

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