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

[复制链接]
nitenite 发表于 2017-12-31 08:20:30 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
分享前还是先分享自己的Python学习交流群:666468218% j! {5 b9 |/ o$ Y5 o
' C2 H9 U  j6 w  M- @4 B
群内不定时分享干货,包括最新的python企业案例学习资料和零基础入门教程,欢迎初学和进阶中的小伙伴入群学习交流
1 d8 ~* j5 b0 n! W6 Z6 Z
$ S& e  S' D* U
7 V3 o/ E4 b/ W/ o0 x$ Q! o- B4 q( [; e1.PIL:Python影像库; W! ]+ L* \# N! B9 b2 ^
" Y5 }7 E8 K3 t: k3 F9 u
PIL或者Python Imaging Library是一个包含许多函数来处理来自Python脚本的图像的包。PIL官方网站在这里。目前版本的PIL是PIL 1.1.7,可用于Python 2.3到Python 2.7。本文将使用Python 2.6的PIL 1.1.7。: E/ w2 `# b" ?' F+ s. i
在Windows(XP,Vista或者Seven)下,安装PIL相当简单:只需启动PIL Windows安装程序即可。当然你以前需要一个有效的Python 2.6.6安装。) {; A& X9 x5 x6 C
PIL文档可在这里找到:8 `+ l: K' b& o! {5 Z5 k9 D

    6 z2 Q3 E; Z5 H2 N: \  a' ^- M8 e. r
  • 在线PIL文档
    ' Q) `$ P! z2 P
  • PDF PIL文件+ W; n6 b- a% S2 O/ W8 D7 Z/ W
2.加载图像9 ?% x: z* W- f7 i

& |5 W4 x& b+ _这是一个小的INIT脚本,它使用PIL来加载图像并显示它。如果您需要,可以在Image.VERSION变量中找到PIL版本。) w* K7 l9 {; s. G
导入HYP_Utils0 |) `% [$ N% w6 `! L
导入系统+ c  s  W) l; i$ }
从PIL导入图像
: Q/ m/ X5 I7 r, m8 FscriptDir = HYP_Utils.GetDemoDir()9 z* _8 _- E( w) R# q
PIL_Version = Image.VERSION: U3 f$ l& e* z' i) N9 O0 u
img_filename =“%s / flower.jpg”%scriptDir
0 {1 Y/ }2 E' Tim = Image.open(img_filename)
) q) E0 m1 H6 l$ L6 eim.show()  L0 S( M% d2 a6 J5 B
在Windows下,Image.show()函数将图像保存到临时文件并调用默认图像查看器实用程序。: @/ t' L" P+ o3 T
3.保存图像0 G2 o8 {4 |  i( ]$ f( ?6 S4 ~
9 U* _6 e2 Z( R3 \
只要调用Image.save()函数。你想保存为JPEG格式?只需将.jpg扩展名添加到图像文件名中即可。对于其他格式也是如此。
/ \8 A3 m! q5 m$ k' M阅读和写作支持的格式:*。bmp,*。gif,*。jpg,* .msp,* .pcx,*。png,* .ppm,*。tiff和.xbm。
3 x. N0 E8 g7 R+ d  p& c这里是一个简单的JPG到BMP转换器:7 z8 `. V5 w  G
导入HYP_Utils
, }$ Z: D0 q  h' P' {) U从PIL导入图像' U- P0 d3 `1 }/ [3 V2 b# {& M
scriptDir = HYP_Utils.GetDemoDir()8 C0 T0 S1 M; x5 ^
PIL_Version = Image.VERSION
- }3 ^7 L! n5 H' c' d* e! @img_filename =“%s / flower.jpg”%scriptDir
8 q  r4 ~: y2 \: mim = Image.open(img_filename)
5 Z! V6 N1 u. q$ M) n  i! e/ gim.save(“%s / flower.bmp”%scriptDir)
  E2 e  H: c) K" O3 _6 C  d; E4.读取像素- J1 B+ D0 O6 k

) |# w$ a3 s' B! k# e有两个函数可以读取像素图(或像素数据):Image.getpixel()和Image.getdata()。
" r7 Z5 {# i/ s& R+ X  m- }2 |图片。getpixel()返回单个像素的值。只需给出一个带有X和Y坐标的元组,getpixel()就可以为RGB图像返回一个3元组的RGB值,或者为亮度图像返回一个值。图片。getdata()返回完整的像素图。您需要Python函数list()来创建RGB元组的像素列表。
% c9 I3 k# P( h- D& Q( U这里是一个代码片段,用PIL加载图像,用GeeXLab Python API创建一个纹理对象,并用图像像素填充纹理。$ ?( x/ U! e: }: o
导入HYP_Utils
2 W! {. I$ a; y1 r% [$ @4 ~0 T9 {% \导入HYP_Texture3 l/ {& V& O% m/ a9 G5 m& o
进口HYP_Material
2 y: ~) V5 R; o导入系统  ?8 j) p+ t7 K
从PIL导入图像$ @- n+ M+ C: q: s! ^
scriptDir = HYP_Utils.GetDemoDir()
- _1 s( y- M1 _+ j8 z: z$ T/ OPIL_Version = Image.VERSION- h; P" `1 K& }7 ^' u1 h9 j) ~
img_filename =“%s / flower.jpg”%scriptDir: `, D2 i7 A3 q- `
im = Image.open(img_filename)( p1 _6 c% \, K0 O* e
imageW = im.size [0]- |, P2 d& p: Z0 i$ \$ c
imageH = im.size [1]  k* R- U% s5 ~
TEXTURE_2D = 24 f# y! T  k$ K( e$ I0 q+ A2 X
RGB_BYTE = 2
& p  _8 l/ [( Y% u# y8 I' S7 ~texId = HYP_Texture.Create(TEXTURE_2D,RGB_BYTE,imageW,imageH,0)
. y6 s. f" M& Z2 ^# ~, [* jmatId = HYP_Material.GetId(“plane1_mat”), M) e- r; v4 O6 v$ W8 }; d
HYP_Material.AddTexture(matId,texId)
- s& n7 a& z7 b! H. E如果(im.mode ==“RGB”):
+ R2 ?$ }0 |/ i3 ^ 对于范围内的y(0,imageH):# x7 f! c  v: O. k7 z% z* a, {
对于范围内的x(0,imageW):& {  E' @) f1 b
offset = y * imageW + x, H: g3 O4 T. e! v$ V6 M: a
xy =(x,y)
- |9 B+ e/ [' ^6 ` rgb = im.getpixel(xy)  `( G3 @; F1 o, B
HYP_Texture.SetValueTex2DByteRgb(texId,offset,rgb [0],rgb [1],rgb [2]) * l6 a: f% s5 Z% L
elif(imout.mode ==“L”):
; s& y6 ?3 w. o) _2 E 对于范围内的y(0,imageH):
$ C0 P" X5 e8 v' Y% l 对于范围内的x(0,imageW):
. d, x! F$ y/ I! P9 G8 {8 _! r5 |# S offset = y * imageW + x4 v; c( J6 N4 f: i( m; N9 d8 Y
xy =(x,y)/ T) ^8 R4 m+ K) m/ E! i) t
rgb = im.getpixel(xy)( {+ A3 t! d" r! Q
HYP_Texture.SetValueTex2DByteRgb(texId,offset,rgb,rgb,rgb) 7 Y6 }1 J* _; e4 H
使用Image.getdata(),前面脚本的最后几行是:& Q. Q# g" r3 d/ S3 F; s
pixels = list(im.getdata())2 |/ b- l; G% n3 e4 B' j
如果(im.mode ==“RGB”):
  k3 t+ R5 `% Y0 Q/ \ 对于范围内的y(0,imageH):1 `3 ]- Z& F1 w3 J6 f! h
对于范围内的x(0,imageW):
# D1 L  E/ P( c9 }0 ^- y; \# h offset = y * imageW + x
6 ]1 V7 s2 c9 S0 t6 p9 { rgb =像素[偏移]2 n9 h" G0 y' n0 O( C- U+ P
HYP_Texture.SetValueTex2DByteRgb(texId,offset,rgb [0],rgb [1],rgb [2])
% L; Z. b# v2 B3 P; n2 s" Eelif(imout.mode ==“L”):
9 \+ A( |9 l5 s- {0 g9 d/ z 对于范围内的y(0,imageH):
6 v; d9 G5 a. H 对于范围内的x(0,imageW):# l9 a1 l6 C, _4 Y
offset = y * imageW + x2 t1 I, E) z' O/ y3 j- L1 M2 D
rgb =像素[偏移]
  d% E& |7 z% { HYP_Texture.SetValueTex2DByteRgb(texId,offset,rgb,rgb,rgb)
/ W0 c- b- A2 ^' q; z5.图像处理
4 P5 D. c/ e% J9 J( x5 e$ J
% d3 ^4 t" H* X. M$ f您可以使用PIL轻松应用通用图像滤镜:模糊,浮雕,锐化等。只需导入ImageFilter模块:" k4 U, {8 ?; j0 p- E: D
从PIL导入图像3 k, F* W4 J0 L8 d& V# ^7 U
从PIL导入ImageFilter
4 @0 X/ ]) i, j: `$ u" o...% M  Q+ F5 l% H8 K
i = Image.open(img_filename)
% U8 I" }& V; c' T' gim = i.filter(ImageFilter.EMBOSS)/ ]$ p5 Y. W2 b
#im = i.filter(ImageFilter.FIND_EDGES)) [' [3 L: Z5 Y
...- J( y" l% ~! h+ v9 d. C- L) E7 d
预定义的滤镜包括:BLUR,CONTOUR,DETAIL,EDGE_ENHANCE,EDGE_ENHANCE_MORE,EMBOSS,FIND_EDGES,SMOOTH_MORE和SHARPEN。
' z$ g& u: W+ G# @. R1 L# d2 b/ @还有一个名为ImageOps的模块,用于显示colorize(),flip(),grayscale(),invert(),mirror(),solarize()或posterize()等图像处理函数。
0 ^$ U& }1 Z; b2 s! n6.添加水印: ^5 z# L# j3 _  @% ~
2 O$ r) V; E& `+ p! T
ImageDraw和ImageFont使PIL能够在图像上写文本以及绘制线条或点。这是一个代码片段,显示了一个简单的批量转换器与PIL:它读取文件夹的所有jpg文件,添加水印(十字和“GEEXLAB”字符串),并保存带有gxl_前缀的图像。0 u5 a- r& U/ n; L2 t
导入HYP_Utils
2 h& f+ x9 q4 U; R# U3 @4 c导入os,glob; B5 M8 z3 C4 Z0 n! t/ x1 |
从PIL导入图像
; Z4 g, B$ P5 ~" }4 a从PIL导入ImageDraw  `$ j8 _* g- Z! v0 _
从PIL导入ImageFont# v- U) z) O9 W/ h
scriptDir = HYP_Utils.GetDemoDir()7 {' p$ f/ H  N# ~/ l
ft = ImageFont.load(“timR24.pil”)
% J, D! t" E9 _* c* f6 K9 vos.chdir(SCRIPTDIR)3 N) Y% b* @7 |; e9 L" I0 J- l
file_list = glob.glob(“*。jpg”)/ t6 [( H4 I7 e* n5 o
对于file_list中的f:
/ k/ B; J4 x+ X im = Image.open(scriptDir + str(f))7 C3 d+ `" S! x! k& `
draw = ImageDraw.Draw(im)! u( q- c# }) s# I3 Z: \
draw.line((0,0)+ im.size,fill =(255,255,255)): ]& [8 V, O" O3 h
draw.line((0,im.size [1],im.size [0],0),fill =(255,255,255))
$ t+ c5 v- I0 M( m5 ^: } wh = ft.getsize(“GEEXLA B”)
" E' {9 `5 U) a draw.text((im.size [0] / 2-wh [0] / 2,im.size [1] / 2 + 20),“GEEXLA B”,\
" u: |* d# U8 r! w fill =(255,255,0),font = ft)$ _# G: g( U- P/ Q1 A/ I
draw.text((im.size [0] / 2 - wh [0] / 2,im.size [1] / 2 - 60),“GEEXLA B”,\ 6 S# y6 }" W/ v2 M3 ?/ M8 R. }
fill =(255,255,0),font = ft)+ R+ L( E2 K$ d; ?& m
德尔绘制
6 }+ i8 n* S9 A3 j$ [" u im.save(scriptDir +“gxl_”+ str(f))
( H3 k1 R9 N" T# b还有一个很好的函数ImageFont.truetype(),但它不能在我的系统上工作,因为这个函数依赖于_imagingft.pyd库(实际上是一个DLL),由于Visual C运行时问题,无法加载。这是GeeXLab控制台中的错误:! \+ \- B* G3 S/ e% x; S% S
我们来看看实际运用
! G+ d4 T$ c" [4 r7 ^/ C2 c$ C  c% F% G' g# o- m* w, r# \
    & M! R2 B9 M( l# t) t& L2 d# l0 l8 e
  • 调整图片亮度:
    ' J0 z6 ^  f$ [; i. J

7 O1 o/ i& b5 e& B/ S就个人而言,我认为这张照片看起来不错,但为了演示,我们试着把这张照片调亮。为了提高照片的关键是使用 Pillow's ImageEnhance module:# }! z: N5 x2 C" e- b: J
$ t; T) `$ |$ W+ E
运行完上面的代码,你就会获得下面这样的图片:
" M- y! X  z5 ~. {1 O8 T" K4 n6 o& A# s3 }4 p' H! Z
如果你将enhancement factor调整0.0,那么你就会发现整张图片都变成了黑色,而如果你将其调整为0.7,那么你将获得下图:& f8 A' I' \# p, T6 V- \
8 M4 q4 z" z+ G: _- N# N2 q
    8 N. y$ |) @4 S) p* K4 C! C
  • 调整图片对比度& x8 ~6 f) i+ i2 F4 T* a. M9 M/ u2 T' C7 s
如果我们之前拍摄了一些比较暗的图片,我们可以通过调整对比度和亮度来优化。! [% b# V+ a$ e$ z
" C5 |4 u) M* R' p, o2 O
上图是一张毛毛虫的照片,我们可以通过将下图的代码和上面的代码相结合来调整图片:0 v" @8 P$ k7 T3 F8 H/ o

# t5 O$ L9 C* ]6 t, R2 J  @; |ImageEnhance模块中的所有类都以相同的方式运行。你可以通过改变增强值来优化图片,下图是我将值调整到0.7后得到的:* _* {& S2 H6 H2 ?
/ C1 C( F& E# _* t& }
    4 i1 i" s5 J. Y. F* H% s8 c
  • 改变图片的清晰度
    % _+ v8 H& \6 c( f9 O4 P0 e
) w6 u9 b" s0 D: [: S- ]9 {: U+ i
如果你想要通过代码来实现图片锐化,那么下面的代码就值得一看:8 c3 l8 c4 k8 ?5 c% ~
2 e+ A7 L5 D1 T1 V
在这里需要改变的是ImageEnhance的Sharpness类,如果想要锐化图片也可以参照上面的操作。
  g, E2 W; _3 N( w* sPillow package 有很多简洁易用的功能,例如color类,有了它,你就可以随意使用Python来优化图片,玩转图片也可以这么酷炫!

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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

扫一扫关注我们

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