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

[复制链接]
nitenite 发表于 2017-12-31 08:20:30 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
分享前还是先分享自己的Python学习交流群:666468218
( o7 q! k1 T0 A: c5 R9 @
- J1 {5 T3 G1 U0 K) m群内不定时分享干货,包括最新的python企业案例学习资料和零基础入门教程,欢迎初学和进阶中的小伙伴入群学习交流
$ h1 q5 X, i2 }) M
/ g+ |. y9 X6 g8 ^$ N. m1 \! Y* x
1.PIL:Python影像库
/ t) X  Y4 C) u/ Q% r2 d1 b4 |
) A- ^% u2 B% \9 V! s2 {0 PPIL或者Python Imaging Library是一个包含许多函数来处理来自Python脚本的图像的包。PIL官方网站在这里。目前版本的PIL是PIL 1.1.7,可用于Python 2.3到Python 2.7。本文将使用Python 2.6的PIL 1.1.7。
: H9 i5 d% q5 w, g( H0 A! A4 W在Windows(XP,Vista或者Seven)下,安装PIL相当简单:只需启动PIL Windows安装程序即可。当然你以前需要一个有效的Python 2.6.6安装。% R$ |" l$ ]! H7 A6 Y* {
PIL文档可在这里找到:
7 ]5 T$ O+ {$ L! X0 Z8 D! r. a

    ( @& l, e# s: |- k6 j, N
  • 在线PIL文档
    : b3 Q, q4 ]6 a- w+ o% N2 b4 D) p$ C
  • PDF PIL文件
    % l: o) \+ j  ?# [" Z% H
2.加载图像
3 ~& ?% T$ j; j* x. n4 |/ p- n0 p1 i3 S+ U; b  w
这是一个小的INIT脚本,它使用PIL来加载图像并显示它。如果您需要,可以在Image.VERSION变量中找到PIL版本。
# ~# y. k: c) X9 P/ D( Y导入HYP_Utils
! x! T9 z9 J( l: t  K. I导入系统* ?# ^" v% s) ]& u: G
从PIL导入图像
0 g" W; F% R% {+ N2 \scriptDir = HYP_Utils.GetDemoDir()
% d4 U: y' k3 P$ \7 R) ?PIL_Version = Image.VERSION
% d) A$ f# H7 K; k# N' G, k' Simg_filename =“%s / flower.jpg”%scriptDir
& ^1 r# G9 ?! i1 y5 c7 d+ B9 fim = Image.open(img_filename)* l' U7 ~$ q$ s- H) Q# Y
im.show()5 G9 n: {. V7 i8 D& @. j' V
在Windows下,Image.show()函数将图像保存到临时文件并调用默认图像查看器实用程序。+ C0 A, I3 M" l: C7 i# q$ L
3.保存图像
, `) I8 i1 T! M3 L3 i4 Z4 r# i" Y8 M& p& k( [1 h( P! R: q
只要调用Image.save()函数。你想保存为JPEG格式?只需将.jpg扩展名添加到图像文件名中即可。对于其他格式也是如此。
  m' ?  \1 i6 S& U* n阅读和写作支持的格式:*。bmp,*。gif,*。jpg,* .msp,* .pcx,*。png,* .ppm,*。tiff和.xbm。# t$ y9 e3 Z. I2 d; t0 y
这里是一个简单的JPG到BMP转换器:- ^0 J/ K8 L6 c+ c4 Y7 v, c
导入HYP_Utils
/ ]( o/ q( r  s4 h! H$ a从PIL导入图像
1 a2 E; G  q+ e: K- VscriptDir = HYP_Utils.GetDemoDir()7 h, V3 ?. m. z" H9 c
PIL_Version = Image.VERSION+ I" [) d9 y, d
img_filename =“%s / flower.jpg”%scriptDir
+ f  W, V8 [9 u/ `7 ~# Aim = Image.open(img_filename)
1 A! J0 C+ Q4 K! d! w/ u4 @im.save(“%s / flower.bmp”%scriptDir)
$ h( F2 R- m0 @* e8 ]$ K4.读取像素+ J- _9 Q5 f7 {
+ }; O. w+ Y8 Y, F* [6 b' v
有两个函数可以读取像素图(或像素数据):Image.getpixel()和Image.getdata()。. ^: o1 L/ w- z/ N7 ]& v
图片。getpixel()返回单个像素的值。只需给出一个带有X和Y坐标的元组,getpixel()就可以为RGB图像返回一个3元组的RGB值,或者为亮度图像返回一个值。图片。getdata()返回完整的像素图。您需要Python函数list()来创建RGB元组的像素列表。
( S1 h+ A# V" Z+ ]3 ~这里是一个代码片段,用PIL加载图像,用GeeXLab Python API创建一个纹理对象,并用图像像素填充纹理。
5 T% g+ g/ A1 g4 w导入HYP_Utils
! i, O* c4 P( S  Z  H- C导入HYP_Texture$ i: E9 ^/ u) ?. v2 y1 r8 F3 I
进口HYP_Material) ^$ m! l  Y/ Y
导入系统
  k& D6 ]8 |+ H8 _. l/ u$ R( x从PIL导入图像" g: P2 ^8 W$ |" q0 z
scriptDir = HYP_Utils.GetDemoDir()
% M  _* n7 W. ?( L# |% SPIL_Version = Image.VERSION4 ?7 f+ o. p0 A3 C: `% y
img_filename =“%s / flower.jpg”%scriptDir
% J& _% w' `$ g- Wim = Image.open(img_filename)% y* G5 U+ |6 K
imageW = im.size [0]5 y8 d; [1 |  }5 w2 A1 d% M
imageH = im.size [1]
- Y( I1 t9 S' @4 F3 yTEXTURE_2D = 2
5 [* [; w9 |7 F. w9 e" l3 KRGB_BYTE = 2
9 i4 ?' l1 u: \1 ztexId = HYP_Texture.Create(TEXTURE_2D,RGB_BYTE,imageW,imageH,0)
2 L8 g& c7 M1 j0 N  B( dmatId = HYP_Material.GetId(“plane1_mat”)3 T* V+ E* O1 f/ M! q4 l8 {. G
HYP_Material.AddTexture(matId,texId)
9 x, y" m% R  g) T如果(im.mode ==“RGB”):
6 g) N  {' i- f* J9 a+ p 对于范围内的y(0,imageH):
5 C' J' O4 \/ [3 y6 U/ Z3 S7 a% n 对于范围内的x(0,imageW):! w3 F1 q1 ^- Z2 A6 n
offset = y * imageW + x
7 b; ?( m8 t' g, D* Y xy =(x,y)
) ?* R9 |6 i" v rgb = im.getpixel(xy)! w6 ?! f" G; A
HYP_Texture.SetValueTex2DByteRgb(texId,offset,rgb [0],rgb [1],rgb [2]) 2 {# J4 m' e  Z, F* \
elif(imout.mode ==“L”):" E) d# {% }, U0 R. J
对于范围内的y(0,imageH):, A$ Y' B. z0 Q
对于范围内的x(0,imageW):
% {. t- J: N# z  n offset = y * imageW + x# \5 ^- g1 V; @0 ]. c( G* n7 p
xy =(x,y), K6 d/ c+ ]+ e2 u7 f8 O/ F
rgb = im.getpixel(xy)
2 `; ~0 U% A) o& [4 j4 Q HYP_Texture.SetValueTex2DByteRgb(texId,offset,rgb,rgb,rgb) 3 M" r, d5 a8 T$ A( f9 [" [+ g: ?- l
使用Image.getdata(),前面脚本的最后几行是:
8 e4 [  Z7 @% P9 ?, Wpixels = list(im.getdata())8 o6 `. y! w, A, ~, B! N! X: ~
如果(im.mode ==“RGB”):
; q. h' n7 Y/ l, p* Q 对于范围内的y(0,imageH):( `8 P0 K' Y! \8 l
对于范围内的x(0,imageW):
) P, v  g5 |6 B" y. } offset = y * imageW + x
8 P+ W/ A; O1 w$ a rgb =像素[偏移]
" q3 V/ ]# B, t4 ?+ P( o HYP_Texture.SetValueTex2DByteRgb(texId,offset,rgb [0],rgb [1],rgb [2]) - B& f% V$ ]2 E$ k
elif(imout.mode ==“L”):
& I4 K" |1 \) X! A0 }: o" S 对于范围内的y(0,imageH):5 g/ h( X9 J$ ^6 k# n
对于范围内的x(0,imageW):: B3 U! t9 [6 d4 e$ J( x) P& I
offset = y * imageW + x
" N+ A5 z4 {$ A rgb =像素[偏移]
+ [1 n% N1 V9 j5 P. N/ o HYP_Texture.SetValueTex2DByteRgb(texId,offset,rgb,rgb,rgb)
1 T2 d& f$ ]( ^' a5 ~6 P% i5.图像处理
2 y- }7 p7 h! m& i. _3 d' u' T( K# ?$ T
您可以使用PIL轻松应用通用图像滤镜:模糊,浮雕,锐化等。只需导入ImageFilter模块:
" v$ Q) H5 N) v' ^) c- P从PIL导入图像  {5 ~# a8 ]# z) @5 v
从PIL导入ImageFilter
  M  ~( m9 Z& J5 s...8 A0 u) I% k9 a' l
i = Image.open(img_filename)
$ C* E) P8 j4 iim = i.filter(ImageFilter.EMBOSS)% S! z3 L- r! `& j
#im = i.filter(ImageFilter.FIND_EDGES); x) o, Q) I3 Y% N9 E( G
...( d1 X- ?$ T# q! B- Y
预定义的滤镜包括:BLUR,CONTOUR,DETAIL,EDGE_ENHANCE,EDGE_ENHANCE_MORE,EMBOSS,FIND_EDGES,SMOOTH_MORE和SHARPEN。% Q8 o7 e% n" Z5 K% P
还有一个名为ImageOps的模块,用于显示colorize(),flip(),grayscale(),invert(),mirror(),solarize()或posterize()等图像处理函数。
! g- ^8 h- X- n! D" O6.添加水印) @. c1 ?" s+ i8 m+ M' t
& V* ]" A, h* b5 x4 g. W
ImageDraw和ImageFont使PIL能够在图像上写文本以及绘制线条或点。这是一个代码片段,显示了一个简单的批量转换器与PIL:它读取文件夹的所有jpg文件,添加水印(十字和“GEEXLAB”字符串),并保存带有gxl_前缀的图像。
: w* x3 U' Y5 Q, c# G% R' N导入HYP_Utils
5 ?6 L9 A6 }! ~" A# c( k; t. S导入os,glob
" ?3 o# w7 f! ]/ i/ }5 e从PIL导入图像
9 T  @. P6 B; O& _+ C$ a3 t从PIL导入ImageDraw' R8 B0 V0 l1 E2 B) J( h2 T
从PIL导入ImageFont9 W& T* n6 \, g6 s' p1 M
scriptDir = HYP_Utils.GetDemoDir()+ |. C. _+ o: q
ft = ImageFont.load(“timR24.pil”)
1 j1 ?8 z2 O2 P9 c% [3 p" O, s5 y6 \& d/ P: mos.chdir(SCRIPTDIR)3 h8 F& s; \. K6 P' x& w" K
file_list = glob.glob(“*。jpg”)
, }1 w' l/ |6 Y对于file_list中的f:
$ \6 }( h0 l8 `1 ~4 l  N im = Image.open(scriptDir + str(f))2 x/ E( D4 a; x1 ]9 x$ ]/ M
draw = ImageDraw.Draw(im)
9 ~, T" E9 E% m2 e1 N0 ?8 j draw.line((0,0)+ im.size,fill =(255,255,255))
) D, o- x1 k$ i$ ?9 _4 b draw.line((0,im.size [1],im.size [0],0),fill =(255,255,255))( i8 @" H& {% L2 [6 T+ Z/ i
wh = ft.getsize(“GEEXLA B”)  w3 C" e0 u+ d; m% }
draw.text((im.size [0] / 2-wh [0] / 2,im.size [1] / 2 + 20),“GEEXLA B”,\
' Z5 l) @( _3 f$ X9 P$ D fill =(255,255,0),font = ft)0 o) z& {  _) W+ K3 O) L
draw.text((im.size [0] / 2 - wh [0] / 2,im.size [1] / 2 - 60),“GEEXLA B”,\
2 d+ C$ _: l2 l; P fill =(255,255,0),font = ft)
, {* V. k% u# g( i, U" M* ^ 德尔绘制
+ ^3 B7 |' d3 x5 s5 L  r9 c" Q, T5 U im.save(scriptDir +“gxl_”+ str(f))
( w8 S, r( L( p' E/ P: E2 Y还有一个很好的函数ImageFont.truetype(),但它不能在我的系统上工作,因为这个函数依赖于_imagingft.pyd库(实际上是一个DLL),由于Visual C运行时问题,无法加载。这是GeeXLab控制台中的错误:* k9 ^) m) y' P" \/ B
我们来看看实际运用$ Q1 a( j3 k/ v6 c) d* P
9 m% N% U( J( Q: h) V( G& p
    % S+ H( U: ~# I3 J
  • 调整图片亮度:. I9 N* A- ^( u+ y% V! k! D
% x6 C- b4 N" P8 j0 T4 P: S$ |
就个人而言,我认为这张照片看起来不错,但为了演示,我们试着把这张照片调亮。为了提高照片的关键是使用 Pillow's ImageEnhance module:
+ O) C/ O, \4 t5 |* {6 }& B
& g. c6 ?: c* U$ ]: K% Y1 K运行完上面的代码,你就会获得下面这样的图片:
( o! g/ Y1 r! m  A) A$ |0 m1 `4 y# f  G7 F! k  Q
如果你将enhancement factor调整0.0,那么你就会发现整张图片都变成了黑色,而如果你将其调整为0.7,那么你将获得下图:
- J5 w& E& c9 X3 d' L' w: i
$ C( I+ [( b5 r. Q, v6 q1 n+ W
    9 Q+ r2 `& ]0 }9 D
  • 调整图片对比度
    0 h4 Z1 U/ [+ G9 x& f
如果我们之前拍摄了一些比较暗的图片,我们可以通过调整对比度和亮度来优化。6 {* b& H- r5 ^5 @* [/ b

# k' l! v+ B! _4 k: x上图是一张毛毛虫的照片,我们可以通过将下图的代码和上面的代码相结合来调整图片:
9 @( I0 l7 B! H0 u7 f( B! \+ a! l. N* P
ImageEnhance模块中的所有类都以相同的方式运行。你可以通过改变增强值来优化图片,下图是我将值调整到0.7后得到的:1 G* e& T. N* U* L* M& Z
5 B0 t9 u% Q4 o4 k3 s+ {
    5 S* N" M, S9 e( x& n: e- c
  • 改变图片的清晰度
    5 O1 P& b* m9 V1 |2 F3 ^; G
$ u( N2 R  X. L$ x, S
如果你想要通过代码来实现图片锐化,那么下面的代码就值得一看:
: U( L) I- G# a1 H0 }5 C/ ~  p' J3 u( T5 u8 f
在这里需要改变的是ImageEnhance的Sharpness类,如果想要锐化图片也可以参照上面的操作。. ^% R* b# p% F' S, a! j) h: A: z
Pillow package 有很多简洁易用的功能,例如color类,有了它,你就可以随意使用Python来优化图片,玩转图片也可以这么酷炫!

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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

扫一扫关注我们

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