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

[复制链接]
nitenite 发表于 2017-12-31 08:20:30 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
分享前还是先分享自己的Python学习交流群:666468218
+ ]3 m5 S5 g2 U7 H7 v+ b  V7 g8 a! E: P- W5 n1 b
群内不定时分享干货,包括最新的python企业案例学习资料和零基础入门教程,欢迎初学和进阶中的小伙伴入群学习交流
# Z, P5 B6 m, Z% i$ y0 V  W! e$ L* K% N) T, i
/ |+ g7 @( h" s( m2 ^8 y" R( d
1.PIL:Python影像库
4 K3 ?7 m& |% Q) Y: T
+ `0 G7 [( t5 k- C) A7 @- D$ APIL或者Python Imaging Library是一个包含许多函数来处理来自Python脚本的图像的包。PIL官方网站在这里。目前版本的PIL是PIL 1.1.7,可用于Python 2.3到Python 2.7。本文将使用Python 2.6的PIL 1.1.7。
2 z/ E1 |1 i% ^+ a! j. L在Windows(XP,Vista或者Seven)下,安装PIL相当简单:只需启动PIL Windows安装程序即可。当然你以前需要一个有效的Python 2.6.6安装。
/ u) D4 R5 P7 E. U0 n0 h; LPIL文档可在这里找到:
3 c8 l7 ?1 i* X4 y
    3 z, E" E* C# E3 t( O4 k- v
  • 在线PIL文档- J) N% T6 n5 i; j3 S+ P! v3 @
  • PDF PIL文件4 M. s. h6 Q/ C8 d: ^5 K$ h. b+ `* E
2.加载图像
5 R5 B" m9 U/ a+ q% U5 Z  `  t
% ?5 n/ Y# @1 S  x9 s: ]$ O这是一个小的INIT脚本,它使用PIL来加载图像并显示它。如果您需要,可以在Image.VERSION变量中找到PIL版本。' M. l6 [6 l: c5 q+ S
导入HYP_Utils
! u6 W$ `8 p+ i6 j; \  i导入系统! R4 V- i$ @& w" o  W; ?
从PIL导入图像
- L0 E4 j3 R& T) a* ]scriptDir = HYP_Utils.GetDemoDir(): r* o4 \6 T; R/ q4 l
PIL_Version = Image.VERSION
& z3 z- G  p- G& J/ timg_filename =“%s / flower.jpg”%scriptDir" D8 A% X* _3 i0 [( R4 A
im = Image.open(img_filename)
1 u- q$ b$ A$ ^7 ?* J" ]: W4 xim.show()
8 {, g6 X/ K( u( z在Windows下,Image.show()函数将图像保存到临时文件并调用默认图像查看器实用程序。
9 ?! _( N) ~5 H  Z/ G3.保存图像
- o. O1 }' p$ Y& [2 x2 t( H: y( z$ z, c. j5 B
只要调用Image.save()函数。你想保存为JPEG格式?只需将.jpg扩展名添加到图像文件名中即可。对于其他格式也是如此。" J" e6 F+ N- ]9 k9 g
阅读和写作支持的格式:*。bmp,*。gif,*。jpg,* .msp,* .pcx,*。png,* .ppm,*。tiff和.xbm。& I5 O$ k5 A# S5 @
这里是一个简单的JPG到BMP转换器:
( g. C& t6 x0 {$ }导入HYP_Utils
; b' s  y# ^7 v, E6 W% ^( v从PIL导入图像
3 ]$ l3 ~! t0 H. s# J8 `8 c, jscriptDir = HYP_Utils.GetDemoDir()
. k: T. F4 }5 U9 e) o0 S+ ]& TPIL_Version = Image.VERSION
& U2 Q/ F# M& r5 ?, Himg_filename =“%s / flower.jpg”%scriptDir; r6 d1 G! @  F% {% U, N
im = Image.open(img_filename)9 z, g# F. x1 P2 Y
im.save(“%s / flower.bmp”%scriptDir)* W1 Q7 g) J& u) d
4.读取像素
$ J3 J/ k: w& m+ z: q9 V1 K: U3 U8 I" L7 j: r
有两个函数可以读取像素图(或像素数据):Image.getpixel()和Image.getdata()。
2 U4 y( ^* d  m" m0 _/ j9 T' X, q图片。getpixel()返回单个像素的值。只需给出一个带有X和Y坐标的元组,getpixel()就可以为RGB图像返回一个3元组的RGB值,或者为亮度图像返回一个值。图片。getdata()返回完整的像素图。您需要Python函数list()来创建RGB元组的像素列表。6 K# Y& ?/ p8 S- l. ?9 h! J
这里是一个代码片段,用PIL加载图像,用GeeXLab Python API创建一个纹理对象,并用图像像素填充纹理。( `* Q2 l& T. [, u& |) n( q9 }
导入HYP_Utils
  X8 D# ], U" u, p/ M导入HYP_Texture, U1 e2 Y3 O/ X8 m
进口HYP_Material
4 H2 H5 M8 o7 D) R9 Z7 O导入系统
' l( A$ h& }# `5 s! D从PIL导入图像
3 ]  |* f/ S  d" X6 ^scriptDir = HYP_Utils.GetDemoDir()
' z; n: L* O9 o2 aPIL_Version = Image.VERSION. Q+ ~! J  q0 U& Q9 u' c9 a
img_filename =“%s / flower.jpg”%scriptDir& G  j7 I' K6 W' }2 o$ J/ L6 [
im = Image.open(img_filename)
+ o0 @; [# b1 Q) Z" J5 JimageW = im.size [0]
7 E* d+ a) `, L% v. iimageH = im.size [1]
. f2 P8 E- s$ I* c& s0 d6 TTEXTURE_2D = 2* S4 ^+ ^2 a" b* G& B+ I
RGB_BYTE = 2
1 h/ ^0 D3 N+ t. B, @% J" etexId = HYP_Texture.Create(TEXTURE_2D,RGB_BYTE,imageW,imageH,0)3 m7 I5 k# q- R8 m$ @
matId = HYP_Material.GetId(“plane1_mat”)
( w0 ]/ F5 n: C- {HYP_Material.AddTexture(matId,texId)
; _3 k1 u0 K9 g+ m) G如果(im.mode ==“RGB”):1 P) {' m1 @4 }5 Y: k
对于范围内的y(0,imageH):
7 V3 |, P  ]. [3 [- f 对于范围内的x(0,imageW):
6 Q7 t! Y% N, [) W5 m6 C6 O& M3 R3 V offset = y * imageW + x1 W" t1 b& l/ n5 s
xy =(x,y)
* O5 z0 `; h( O. Z" h, j rgb = im.getpixel(xy)4 r$ s  x) O: f" J! s! p
HYP_Texture.SetValueTex2DByteRgb(texId,offset,rgb [0],rgb [1],rgb [2]) 1 o. R7 \; v! j' f# h+ L
elif(imout.mode ==“L”):
& M# S$ n0 P. M; @, {' A2 B 对于范围内的y(0,imageH):
1 m% H3 F9 e: N* A$ L 对于范围内的x(0,imageW):' k# y7 h- ~% a5 M* r1 N) E  l5 P
offset = y * imageW + x
- q$ S" N6 L$ K5 Z* e4 O xy =(x,y)
, B: B$ e7 Z7 s) j+ ^- @ rgb = im.getpixel(xy), w: p; w8 q; \; Q  ?9 o# k3 l- W' a1 z9 l
HYP_Texture.SetValueTex2DByteRgb(texId,offset,rgb,rgb,rgb) ) p/ M. ]  P" O( k& l
使用Image.getdata(),前面脚本的最后几行是:
# `) u. i- V2 t& C5 \5 `pixels = list(im.getdata())7 h5 v' e3 I; k9 i0 h/ e/ ?  H& e
如果(im.mode ==“RGB”):$ q/ s, H  `$ |
对于范围内的y(0,imageH):: N% n0 v, Z# M5 W( S! s4 R
对于范围内的x(0,imageW):
1 z. y9 n3 M, P5 c offset = y * imageW + x# Z' r( i. _- h6 q$ i* o
rgb =像素[偏移]. ]# z- W+ y* d6 i: ^6 E
HYP_Texture.SetValueTex2DByteRgb(texId,offset,rgb [0],rgb [1],rgb [2]) ; ^3 O1 C; C9 b9 i" V
elif(imout.mode ==“L”):- k' V# C2 P  N7 `  N6 q/ D7 g* q
对于范围内的y(0,imageH):
- n! M$ ^4 p: Z; Z. D 对于范围内的x(0,imageW):
# ~/ Z0 Q+ U! t' r- c8 J4 R offset = y * imageW + x/ h- u" ]6 g8 T8 i) Q4 l3 m# d
rgb =像素[偏移]. n$ H& x# j9 y0 m: ~
HYP_Texture.SetValueTex2DByteRgb(texId,offset,rgb,rgb,rgb)
4 k- d  V! f3 r5.图像处理" s7 U3 r: E7 h$ n

' {* ?" r+ |$ n! k, v5 }! V7 f您可以使用PIL轻松应用通用图像滤镜:模糊,浮雕,锐化等。只需导入ImageFilter模块:9 N- V6 u+ ]2 Z8 Z
从PIL导入图像' x& n) v4 p" `
从PIL导入ImageFilter
; O4 @. Z# W* O9 ?; l& \3 U...9 ]8 n9 J" M; F# L
i = Image.open(img_filename)1 D# H% ?3 O$ r1 @, Y5 q( L: y
im = i.filter(ImageFilter.EMBOSS)
. i( Y, D) D! d9 s, ~3 a#im = i.filter(ImageFilter.FIND_EDGES)5 h, Q. n, ?2 {. ?1 P$ m, N) y9 y3 Q
...8 H: H8 Y  W) x2 ~
预定义的滤镜包括:BLUR,CONTOUR,DETAIL,EDGE_ENHANCE,EDGE_ENHANCE_MORE,EMBOSS,FIND_EDGES,SMOOTH_MORE和SHARPEN。6 ]5 ~4 \& [& }/ l/ J
还有一个名为ImageOps的模块,用于显示colorize(),flip(),grayscale(),invert(),mirror(),solarize()或posterize()等图像处理函数。! ]$ i' _7 ^. b- W! d* u* X1 F
6.添加水印0 a3 ~" V( t! X0 A9 j2 ?9 h

( C: t" K; f' o2 I- ]' t! C! i- cImageDraw和ImageFont使PIL能够在图像上写文本以及绘制线条或点。这是一个代码片段,显示了一个简单的批量转换器与PIL:它读取文件夹的所有jpg文件,添加水印(十字和“GEEXLAB”字符串),并保存带有gxl_前缀的图像。" {/ c3 n' g; K5 x
导入HYP_Utils
8 X! N: g1 I/ L* _8 b. v1 s3 n8 T5 U导入os,glob8 s  z. c# o2 o7 r0 K- ~
从PIL导入图像4 L% B# k9 r4 i" d. W( L% k/ Y" `
从PIL导入ImageDraw
% d4 R: l' m/ J5 R- K5 ^. D从PIL导入ImageFont7 c, X- W' c5 f0 r
scriptDir = HYP_Utils.GetDemoDir()
7 l) V- L$ Y; F* E; o* yft = ImageFont.load(“timR24.pil”)
7 X5 F. J+ \7 `. z8 K  q( |1 E3 G; Ros.chdir(SCRIPTDIR); G" a: r. a& t- ^- C5 e
file_list = glob.glob(“*。jpg”)
3 v& h1 P' Z# `3 H. r对于file_list中的f:/ P4 }- Y! l! S$ Y* S" f7 q: I. z
im = Image.open(scriptDir + str(f))
) @! N/ h1 C* h; @& X draw = ImageDraw.Draw(im)
+ u# r/ {9 _5 i8 t# }8 Y- E draw.line((0,0)+ im.size,fill =(255,255,255))9 M9 }  z( E3 r- _
draw.line((0,im.size [1],im.size [0],0),fill =(255,255,255))2 F* }, Z5 Z/ {9 U& c6 {& _9 {
wh = ft.getsize(“GEEXLA B”)
4 {5 y! W$ {: r( m+ X draw.text((im.size [0] / 2-wh [0] / 2,im.size [1] / 2 + 20),“GEEXLA B”,\1 @7 w: v- n7 C( R
fill =(255,255,0),font = ft)
$ }$ S# q6 S5 `+ r9 y. f4 Q# |; j draw.text((im.size [0] / 2 - wh [0] / 2,im.size [1] / 2 - 60),“GEEXLA B”,\ 7 M4 L5 n4 C. H. f! |
fill =(255,255,0),font = ft)
* C( V, X$ P; ^# Z 德尔绘制 9 P5 E8 w- w( ~
im.save(scriptDir +“gxl_”+ str(f))
  I/ z  w% q2 [  f$ q1 U还有一个很好的函数ImageFont.truetype(),但它不能在我的系统上工作,因为这个函数依赖于_imagingft.pyd库(实际上是一个DLL),由于Visual C运行时问题,无法加载。这是GeeXLab控制台中的错误:
: F9 i0 \7 z" v- h/ S我们来看看实际运用3 j" F7 X2 t- W2 [! ^  i, p
0 W5 y5 h! g' z0 O8 t. ^- Y

    : d8 J5 a- _: V4 r
  • 调整图片亮度:' f+ Z1 f, \5 o* H) _/ m4 d

0 t$ s$ _! I# o9 H- p; q就个人而言,我认为这张照片看起来不错,但为了演示,我们试着把这张照片调亮。为了提高照片的关键是使用 Pillow's ImageEnhance module:2 T; o% W3 D  k
# n9 T' s" t( r% `( U# z5 o
运行完上面的代码,你就会获得下面这样的图片:
; B" s  b! ~  n/ ^1 {. e
- N* q! ?* f  A如果你将enhancement factor调整0.0,那么你就会发现整张图片都变成了黑色,而如果你将其调整为0.7,那么你将获得下图:
2 ]# W3 l3 ?5 A+ z5 l
2 y" g( Q' o. F- W
      S! }: {& E4 [
  • 调整图片对比度/ Y) U/ r$ p: @% [; s6 ~7 z3 e0 i
如果我们之前拍摄了一些比较暗的图片,我们可以通过调整对比度和亮度来优化。
( U' M6 |  l0 ?+ T  Q1 h" t! u$ U+ U2 l
上图是一张毛毛虫的照片,我们可以通过将下图的代码和上面的代码相结合来调整图片:
3 P' C7 K: t" j  h; @
# I& W) \9 u& Q7 ?) T8 d; w0 cImageEnhance模块中的所有类都以相同的方式运行。你可以通过改变增强值来优化图片,下图是我将值调整到0.7后得到的:% w" j0 T, o3 R; h* `  S/ r

8 j/ E4 d, I) N- y+ U) ?6 ?
    8 C  I* ~% Q' a6 D3 r! |# i
  • 改变图片的清晰度2 A  m2 m* i6 ]9 m) P& s9 e+ `# J
1 n- ~  U, C9 M" W
如果你想要通过代码来实现图片锐化,那么下面的代码就值得一看:
% }+ `; Y& s; o1 R1 n- H8 c! L  a+ b( N+ q$ F, y
在这里需要改变的是ImageEnhance的Sharpness类,如果想要锐化图片也可以参照上面的操作。
, ^) E; S7 c/ P3 k- W& tPillow package 有很多简洁易用的功能,例如color类,有了它,你就可以随意使用Python来优化图片,玩转图片也可以这么酷炫!

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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

扫一扫关注我们

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