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

[复制链接]
nitenite 发表于 2017-12-31 08:20:30 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
分享前还是先分享自己的Python学习交流群:666468218& c" c- n3 K! b5 K( B
6 {% O0 Z& B9 k0 I; j" V- u% Z* n
群内不定时分享干货,包括最新的python企业案例学习资料和零基础入门教程,欢迎初学和进阶中的小伙伴入群学习交流
5 U9 W3 |5 x+ S0 x6 P/ }
7 n- N  G% q* Y2 s2 d2 {' ]- e/ h4 d4 Q$ H" O+ t
1.PIL:Python影像库
6 g& Q0 g7 l  }
3 K/ w! F4 l2 b! ?1 KPIL或者Python Imaging Library是一个包含许多函数来处理来自Python脚本的图像的包。PIL官方网站在这里。目前版本的PIL是PIL 1.1.7,可用于Python 2.3到Python 2.7。本文将使用Python 2.6的PIL 1.1.7。
" p! q6 j) g4 D' d在Windows(XP,Vista或者Seven)下,安装PIL相当简单:只需启动PIL Windows安装程序即可。当然你以前需要一个有效的Python 2.6.6安装。
' W$ l, a; T5 j4 @& a7 \/ nPIL文档可在这里找到:
4 }7 M& N$ D% _1 q" b

    2 P) m* I* ~% G. l
  • 在线PIL文档
    " y% E+ s6 X# D9 k6 p5 O
  • PDF PIL文件
    ' _# V; A3 q, [  A2 O
2.加载图像
- |* Y9 Y5 J2 ]% t/ @
1 E& M/ S# {5 p6 o  z这是一个小的INIT脚本,它使用PIL来加载图像并显示它。如果您需要,可以在Image.VERSION变量中找到PIL版本。8 N3 L# b$ d$ p, z
导入HYP_Utils
! \, H5 Z6 D4 Q2 k. V/ A: h导入系统
, j- K' V6 h& c: t从PIL导入图像8 v+ w/ `% z7 d: S  ^& K$ h5 c
scriptDir = HYP_Utils.GetDemoDir()) J$ E5 Q3 e0 a0 Q
PIL_Version = Image.VERSION
, R  y7 ?' H/ d+ N8 o9 x5 O# Himg_filename =“%s / flower.jpg”%scriptDir0 L3 ]) F' u3 }1 X. p0 X
im = Image.open(img_filename)
& G$ R7 q. j7 P/ |0 C' _' P- ~im.show()
; G  p% k( M, |6 {3 N, x5 y在Windows下,Image.show()函数将图像保存到临时文件并调用默认图像查看器实用程序。, g: q. J7 y. ]1 s0 {
3.保存图像
+ u  ?2 i1 c7 j7 l- r7 }* G. d) ]" w1 n
只要调用Image.save()函数。你想保存为JPEG格式?只需将.jpg扩展名添加到图像文件名中即可。对于其他格式也是如此。$ q2 N% F) k1 ?, N  O5 C- S
阅读和写作支持的格式:*。bmp,*。gif,*。jpg,* .msp,* .pcx,*。png,* .ppm,*。tiff和.xbm。
8 @. I1 L  R( @这里是一个简单的JPG到BMP转换器:" x- m9 G* Q5 I' O, R4 [5 G
导入HYP_Utils
4 u; V3 E5 p, J# s: n从PIL导入图像! w- f/ C7 ], p* S% A4 r# i
scriptDir = HYP_Utils.GetDemoDir()
7 \- L5 d) s. E7 b% s, UPIL_Version = Image.VERSION6 F% ]7 i- ^; C' h# l" p6 u
img_filename =“%s / flower.jpg”%scriptDir* {2 i) a; C& B" o8 V/ L
im = Image.open(img_filename)
2 f  B9 G' l7 k6 K# f$ Z) X, C9 x# pim.save(“%s / flower.bmp”%scriptDir)
0 B7 k- b/ h" a9 u) S4.读取像素& Y& z" H  |- r% O9 w$ _
) |6 b2 h+ k) E/ x9 ]- o! |
有两个函数可以读取像素图(或像素数据):Image.getpixel()和Image.getdata()。8 G* P3 U* |' p' J8 e! }& w) _
图片。getpixel()返回单个像素的值。只需给出一个带有X和Y坐标的元组,getpixel()就可以为RGB图像返回一个3元组的RGB值,或者为亮度图像返回一个值。图片。getdata()返回完整的像素图。您需要Python函数list()来创建RGB元组的像素列表。
6 Y/ Y: N( P" w" r4 O5 s这里是一个代码片段,用PIL加载图像,用GeeXLab Python API创建一个纹理对象,并用图像像素填充纹理。: o! g5 A' U8 B" E
导入HYP_Utils
" Q; u7 k6 s& Z; E导入HYP_Texture
4 Q' ?5 |2 I2 }2 n/ {* [3 @& @2 L. T进口HYP_Material) X1 Z, y5 c4 f  j  U
导入系统
7 K% q7 o# b3 B9 X' y/ C从PIL导入图像8 }0 y* p( a* P' \
scriptDir = HYP_Utils.GetDemoDir()
3 j2 @8 K5 Z) pPIL_Version = Image.VERSION
7 N) a/ k! d! z+ C5 bimg_filename =“%s / flower.jpg”%scriptDir
/ I; t% J: C. j, ~im = Image.open(img_filename)+ U* P& J' P" ?( O- R) I
imageW = im.size [0]  h4 M% K! Z3 {
imageH = im.size [1]7 x' g2 e0 }9 ~
TEXTURE_2D = 2$ Y# l4 _3 I) M; [$ j
RGB_BYTE = 2
/ l: n3 ^& A& n6 o$ PtexId = HYP_Texture.Create(TEXTURE_2D,RGB_BYTE,imageW,imageH,0)
: |0 |% ^8 b6 V9 [' KmatId = HYP_Material.GetId(“plane1_mat”)1 k) x  ?) M' |( ]+ P) Y
HYP_Material.AddTexture(matId,texId)9 {  w. X$ R9 \; o
如果(im.mode ==“RGB”):3 f, @5 T. F% A$ p! F0 w5 l& C
对于范围内的y(0,imageH):% L$ x) N+ R: R8 q. Q
对于范围内的x(0,imageW):
% x' |' t" d# E  |" R  B4 K- O+ e0 X  Q offset = y * imageW + x' D5 y6 L: Q; F! {& h3 l1 L
xy =(x,y)' ~8 {) \6 J+ e3 ]% k" H9 X4 C
rgb = im.getpixel(xy)
' `5 s1 y) j8 l HYP_Texture.SetValueTex2DByteRgb(texId,offset,rgb [0],rgb [1],rgb [2])
8 n  f% q9 Y9 |0 @9 A5 Oelif(imout.mode ==“L”):0 \2 A* d7 M  U" r3 q
对于范围内的y(0,imageH):
( y2 V9 `4 S  r# ~5 Q 对于范围内的x(0,imageW):2 v5 f) E% [6 w( N3 F, K
offset = y * imageW + x6 ^9 [7 {$ _6 L" R8 @
xy =(x,y)
# O2 \2 i7 x4 V8 u; V rgb = im.getpixel(xy)
; d3 r6 J1 Q8 A3 ~ HYP_Texture.SetValueTex2DByteRgb(texId,offset,rgb,rgb,rgb)
4 J' }% @& }8 @( G$ R' e; z- C0 V使用Image.getdata(),前面脚本的最后几行是:
. D8 D1 N  d' G  N; V0 E  _+ W6 n! wpixels = list(im.getdata())3 d2 s5 a# R! i, l# o9 \
如果(im.mode ==“RGB”):
9 [+ j8 W9 f9 c+ Z2 e7 s! E! Z' O 对于范围内的y(0,imageH):2 u+ Z7 `9 Y' ~& z) b
对于范围内的x(0,imageW):6 j6 Q& B. Z3 ^9 a/ e0 j/ o$ q
offset = y * imageW + x# p! K' n; u8 j" Q
rgb =像素[偏移]
5 x7 i0 M: s6 h: W9 ?6 [4 X, z2 b HYP_Texture.SetValueTex2DByteRgb(texId,offset,rgb [0],rgb [1],rgb [2])
  ^& M/ n0 m+ Z/ Z( k7 P) R. pelif(imout.mode ==“L”):+ B$ Z+ V4 d/ f0 P" @' _
对于范围内的y(0,imageH):0 c) H' V4 g( D8 ]( u2 \. N, J
对于范围内的x(0,imageW):- E: `/ S5 L/ K2 B9 _
offset = y * imageW + x* _" N& [1 I' P& N0 `0 \# M
rgb =像素[偏移]
2 Z& S; u3 \2 l. L8 x HYP_Texture.SetValueTex2DByteRgb(texId,offset,rgb,rgb,rgb)/ |  t2 R/ w% a& s7 i' f/ K
5.图像处理
0 T- \: [% H3 @8 w' l1 c" o
: ?; C3 b! \. K; V( Q& M4 Q您可以使用PIL轻松应用通用图像滤镜:模糊,浮雕,锐化等。只需导入ImageFilter模块:# ^* ~( l+ `0 C1 w) B! `+ y( v3 N
从PIL导入图像
8 a/ S* l9 K; U% v$ M从PIL导入ImageFilter
4 J3 K# O4 g9 z+ }5 v) D! r% }...1 W  E4 t! h4 [% O, B' C  M
i = Image.open(img_filename)& T1 e0 l5 k* `
im = i.filter(ImageFilter.EMBOSS)& E% A- ?1 ^# V7 G$ T( u2 S7 n
#im = i.filter(ImageFilter.FIND_EDGES)0 u+ e+ `' K% Q
...
# P, V- Q; A, u; l1 |. ]  }2 `6 @1 J预定义的滤镜包括:BLUR,CONTOUR,DETAIL,EDGE_ENHANCE,EDGE_ENHANCE_MORE,EMBOSS,FIND_EDGES,SMOOTH_MORE和SHARPEN。
0 n; y: ^5 N( J& `, K9 v; B0 S还有一个名为ImageOps的模块,用于显示colorize(),flip(),grayscale(),invert(),mirror(),solarize()或posterize()等图像处理函数。
6 m  T/ o+ d& \- y. T. q, b/ E6.添加水印2 \# H* H2 W. r: y

5 s5 B/ g, P6 ?" M# S7 sImageDraw和ImageFont使PIL能够在图像上写文本以及绘制线条或点。这是一个代码片段,显示了一个简单的批量转换器与PIL:它读取文件夹的所有jpg文件,添加水印(十字和“GEEXLAB”字符串),并保存带有gxl_前缀的图像。! i- B4 X5 h( K2 k2 {& c  X' n& ^) u
导入HYP_Utils
: F2 P6 H# ~  ^/ b% z2 R  k导入os,glob
$ P& j. i2 z; o9 H从PIL导入图像
, o7 P  B+ I: e0 K* x* E$ V从PIL导入ImageDraw
% Q1 P; p1 r0 a从PIL导入ImageFont  o* Q) o" L, ^0 `6 [; H" ?' \
scriptDir = HYP_Utils.GetDemoDir()
( d7 B, Z0 P3 q* m2 f5 U" B% @ft = ImageFont.load(“timR24.pil”)
; [9 b$ E) k  @& E' xos.chdir(SCRIPTDIR)$ @. ?! t9 O" J$ S/ x$ u0 `  S" O
file_list = glob.glob(“*。jpg”)4 j* n7 S9 ~# b( N# ]6 b
对于file_list中的f:
& U3 @7 \; F' |0 a# V4 Q im = Image.open(scriptDir + str(f))  K8 h/ W. e5 L) a1 h3 L
draw = ImageDraw.Draw(im)7 [8 c$ n6 s2 x/ E3 a- \; D
draw.line((0,0)+ im.size,fill =(255,255,255))& K$ N2 D7 V1 z" ~) v
draw.line((0,im.size [1],im.size [0],0),fill =(255,255,255))
4 |- V  N7 J1 y3 O wh = ft.getsize(“GEEXLA B”)
5 S+ d5 M! u% ]' E6 m2 x: H draw.text((im.size [0] / 2-wh [0] / 2,im.size [1] / 2 + 20),“GEEXLA B”,\
( a' W2 d. J& P4 C: w$ E7 z9 h8 V fill =(255,255,0),font = ft)6 t6 F9 O9 a8 N
draw.text((im.size [0] / 2 - wh [0] / 2,im.size [1] / 2 - 60),“GEEXLA B”,\ : B9 d. k5 o; V- J' D' Y4 J
fill =(255,255,0),font = ft)
" v( R  I2 G2 _0 V1 J 德尔绘制 . {8 ~6 i& K! n+ m2 A
im.save(scriptDir +“gxl_”+ str(f)), t! B2 y' _3 _
还有一个很好的函数ImageFont.truetype(),但它不能在我的系统上工作,因为这个函数依赖于_imagingft.pyd库(实际上是一个DLL),由于Visual C运行时问题,无法加载。这是GeeXLab控制台中的错误:7 B# Q9 i* W/ L0 w6 C8 n
我们来看看实际运用
. k  p5 `+ `- B3 M; K* k# X
/ ]* j. h  V0 V4 \' V) b+ [

    & `8 |, L7 v( L' f3 ]; s" J
  • 调整图片亮度:
    ! B# n. @- f6 D  Y( g: x
6 {& z% I( M/ l
就个人而言,我认为这张照片看起来不错,但为了演示,我们试着把这张照片调亮。为了提高照片的关键是使用 Pillow's ImageEnhance module:
+ j& b( {' N0 u7 `  w& U$ l3 ]
, v/ r; G" E2 r0 Z7 Y运行完上面的代码,你就会获得下面这样的图片:4 L  f6 ]# v% x" L8 \: N0 v

+ ]* L2 ^% k& J( k如果你将enhancement factor调整0.0,那么你就会发现整张图片都变成了黑色,而如果你将其调整为0.7,那么你将获得下图:
6 k( K, ~! O% E7 W& a; [, L, E, j" C) f* n5 h/ f; Y

    ; `( M+ _& o  @& s& m
  • 调整图片对比度5 g8 V6 T0 q! R9 \& h" q3 a9 i
如果我们之前拍摄了一些比较暗的图片,我们可以通过调整对比度和亮度来优化。4 e# N  V3 o1 ^8 ~
# K& ^3 g) ?1 Q& z& _
上图是一张毛毛虫的照片,我们可以通过将下图的代码和上面的代码相结合来调整图片:
& Y, M$ X# W; J' I+ v& S* |, ?+ N7 ?# r
ImageEnhance模块中的所有类都以相同的方式运行。你可以通过改变增强值来优化图片,下图是我将值调整到0.7后得到的:
" a& D' e+ s7 x8 N, u8 U1 C) G. y% q3 o! y+ X8 [' W6 v- o; J

    * K6 Z& t8 m/ f% {0 b, C, U, S
  • 改变图片的清晰度
    . Q" t! ?2 C$ A1 a- W- E
4 z$ q# K9 z! t6 s
如果你想要通过代码来实现图片锐化,那么下面的代码就值得一看:0 }, C& u0 n6 j- Q' D

. m6 Z2 t* r/ g+ [% L- u在这里需要改变的是ImageEnhance的Sharpness类,如果想要锐化图片也可以参照上面的操作。. q5 s7 u+ H; n* ^) a4 E; _$ {
Pillow package 有很多简洁易用的功能,例如color类,有了它,你就可以随意使用Python来优化图片,玩转图片也可以这么酷炫!

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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

扫一扫关注我们

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