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

[复制链接]
nitenite 发表于 2017-12-31 08:20:30 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
分享前还是先分享自己的Python学习交流群:666468218
8 ~0 g; P9 L  g, i: D5 g. N5 ?+ B5 }0 h9 A" N8 q
群内不定时分享干货,包括最新的python企业案例学习资料和零基础入门教程,欢迎初学和进阶中的小伙伴入群学习交流, E* ?6 }! A# v* v4 K7 A
2 P6 }) j! t+ X1 ]! U" }
  t- F2 l4 R$ F0 K) u# k
1.PIL:Python影像库
6 H$ P0 j( F3 v7 ~1 o& [5 T% v
6 y. X: @+ E9 U3 A/ K- ~' EPIL或者Python Imaging Library是一个包含许多函数来处理来自Python脚本的图像的包。PIL官方网站在这里。目前版本的PIL是PIL 1.1.7,可用于Python 2.3到Python 2.7。本文将使用Python 2.6的PIL 1.1.7。
0 ?; `) M) z5 Q/ d在Windows(XP,Vista或者Seven)下,安装PIL相当简单:只需启动PIL Windows安装程序即可。当然你以前需要一个有效的Python 2.6.6安装。/ |* u+ P  W. [4 z! u. N
PIL文档可在这里找到:1 z: s- y" l3 G) n# `
    1 E. ^) S" J  I4 g1 v
  • 在线PIL文档
    / }$ U+ l& p- N: P
  • PDF PIL文件; {) O- z' s+ s1 S! H
2.加载图像
+ I  b. A  a# o/ e8 D
! v- u) O* I& `0 D9 `这是一个小的INIT脚本,它使用PIL来加载图像并显示它。如果您需要,可以在Image.VERSION变量中找到PIL版本。
! V$ e3 Z/ J6 b9 h  d导入HYP_Utils
9 \3 w6 W# o9 c1 Y" x+ ~3 Z导入系统
' C5 L! Q" M3 }2 A) J从PIL导入图像
' B; K; {) s' {7 s/ H5 L% @) NscriptDir = HYP_Utils.GetDemoDir()2 ?/ Q2 u0 Z  T# `0 \+ U' h
PIL_Version = Image.VERSION0 D1 e) x* i& g2 K$ ]
img_filename =“%s / flower.jpg”%scriptDir7 }4 O0 c, S8 ]
im = Image.open(img_filename)
! m& [8 m0 Q# Iim.show(); b7 N0 g- D' g" d& m7 r, |% g  n4 e" C
在Windows下,Image.show()函数将图像保存到临时文件并调用默认图像查看器实用程序。  |- Y4 N; J1 E( R
3.保存图像
9 T6 Q. v1 l- ?, l, b2 u' t* X6 _, E; u4 _$ J' N+ P0 I5 b
只要调用Image.save()函数。你想保存为JPEG格式?只需将.jpg扩展名添加到图像文件名中即可。对于其他格式也是如此。
5 `$ P% k! T1 s/ U+ z阅读和写作支持的格式:*。bmp,*。gif,*。jpg,* .msp,* .pcx,*。png,* .ppm,*。tiff和.xbm。+ n: D7 B' Q( C6 i( Y
这里是一个简单的JPG到BMP转换器:9 r! [/ |& l0 |0 I1 P) i, n
导入HYP_Utils
! b7 M: a' u* D. \* w从PIL导入图像; I+ \  h/ r" ]: }: x# D" h" b
scriptDir = HYP_Utils.GetDemoDir()
" J( K6 U/ k0 mPIL_Version = Image.VERSION( Y5 z" E" S; B" k
img_filename =“%s / flower.jpg”%scriptDir/ C3 _7 E* S3 m# l4 q
im = Image.open(img_filename)
& e% ]; A" X* b; Z* o6 O3 Tim.save(“%s / flower.bmp”%scriptDir)( M, U( y: Q$ Y, B1 |0 u9 u
4.读取像素" l# O# ^+ M" H1 M* g) {6 \. f7 ~

- C, q& a% r+ `7 W有两个函数可以读取像素图(或像素数据):Image.getpixel()和Image.getdata()。
3 K0 _  I( q. k& h' H图片。getpixel()返回单个像素的值。只需给出一个带有X和Y坐标的元组,getpixel()就可以为RGB图像返回一个3元组的RGB值,或者为亮度图像返回一个值。图片。getdata()返回完整的像素图。您需要Python函数list()来创建RGB元组的像素列表。
1 `+ \' t6 Q# c) T, _: T这里是一个代码片段,用PIL加载图像,用GeeXLab Python API创建一个纹理对象,并用图像像素填充纹理。, ~% @$ _4 Z+ _6 i' D* c
导入HYP_Utils
/ q+ ~# [. x1 l" |) |# R0 v& n导入HYP_Texture$ \6 U" A" Z4 Y5 Z8 D
进口HYP_Material1 \" K  P) o/ q; E
导入系统
1 m; T2 `5 J* J/ M9 d从PIL导入图像
& |( Q8 R' F( l4 bscriptDir = HYP_Utils.GetDemoDir(); q: P# i. L) k3 d5 C
PIL_Version = Image.VERSION
" k6 J9 W4 _/ N; O: I4 eimg_filename =“%s / flower.jpg”%scriptDir
3 z$ x; S% M5 Fim = Image.open(img_filename)
) P. p4 ^8 h. a! G7 Z: @8 m5 T; \imageW = im.size [0]$ W1 y* Q( P# O4 v+ x$ R3 k( P
imageH = im.size [1]0 Z6 `/ R# J: ]" T" y* i
TEXTURE_2D = 2
( G, C: }, c$ m1 S* gRGB_BYTE = 2
8 m- \. v, d9 o9 y' m- g; TtexId = HYP_Texture.Create(TEXTURE_2D,RGB_BYTE,imageW,imageH,0)5 L4 I9 r- B4 N* |" f$ p
matId = HYP_Material.GetId(“plane1_mat”)% F6 v  i4 F# Y. O# K
HYP_Material.AddTexture(matId,texId)3 D9 K& T' X7 A, H/ q
如果(im.mode ==“RGB”):
' Y: I4 h# K1 f' C; f 对于范围内的y(0,imageH):
1 k* M" \8 L$ `, W2 a0 i- @! R 对于范围内的x(0,imageW):0 G9 L5 t2 A/ A4 o
offset = y * imageW + x
6 E  M3 i0 ^2 h5 P# @2 x* N+ A xy =(x,y)( Q# Y( c: ?4 L, l
rgb = im.getpixel(xy)
6 U( D0 f+ f1 T4 i0 [' x, F) { HYP_Texture.SetValueTex2DByteRgb(texId,offset,rgb [0],rgb [1],rgb [2])
; i0 F! A  F0 belif(imout.mode ==“L”):/ m# a( e; k- R
对于范围内的y(0,imageH):
& i) o3 Z, C2 Q  J 对于范围内的x(0,imageW):2 \4 P' N2 O& E
offset = y * imageW + x& s+ K. z  y& j. U8 n1 F6 [
xy =(x,y)$ R; S$ K  ~! F- I  I5 ]" ]  L
rgb = im.getpixel(xy)
# B- y: G8 r; j6 g1 V8 Q HYP_Texture.SetValueTex2DByteRgb(texId,offset,rgb,rgb,rgb) 0 w; a; B) i# k" a9 ]5 t. ~+ U
使用Image.getdata(),前面脚本的最后几行是:
- H5 `* N: f% s5 xpixels = list(im.getdata())
+ i/ D, x! b# c$ V# n如果(im.mode ==“RGB”):$ x: I+ V) {! w; t6 c; Z
对于范围内的y(0,imageH):
2 g7 Y, \* E  j" }% q6 H 对于范围内的x(0,imageW):
7 B) V, w. \# R  A offset = y * imageW + x
* M6 M1 R' R% d  l7 x rgb =像素[偏移]
9 G1 C, c8 X- @0 H% i& T" g+ { HYP_Texture.SetValueTex2DByteRgb(texId,offset,rgb [0],rgb [1],rgb [2])
$ v, k% w: K  B! Oelif(imout.mode ==“L”):) D" m8 @) {( j& K4 [1 x
对于范围内的y(0,imageH):
3 S+ f" t% v' a& A6 b2 i( x& o5 o 对于范围内的x(0,imageW):
; u1 y- O. `! W" k offset = y * imageW + x/ |8 _# j! [; |
rgb =像素[偏移]
1 Q$ `; i, S5 ]9 {" L% A$ Z" h. g HYP_Texture.SetValueTex2DByteRgb(texId,offset,rgb,rgb,rgb)
% s; D. d, `) P6 r9 P5.图像处理
( u& K" s) h9 }% s2 R/ R. Z# a2 _2 j$ l; ?, O
您可以使用PIL轻松应用通用图像滤镜:模糊,浮雕,锐化等。只需导入ImageFilter模块:
0 ?! G0 g  m6 W" ^从PIL导入图像  j* o9 s- e9 f8 N$ @- j9 V
从PIL导入ImageFilter
: V) L/ K+ \, l$ R, m' W; @...) p: M. ?* U9 E! U. C
i = Image.open(img_filename)
/ v+ w: x* ]1 p8 f$ X' Mim = i.filter(ImageFilter.EMBOSS)
! h. k; a0 u% ~5 ?: |#im = i.filter(ImageFilter.FIND_EDGES)  e( n. L. j  N2 ?
...) F7 @& O! l# f
预定义的滤镜包括:BLUR,CONTOUR,DETAIL,EDGE_ENHANCE,EDGE_ENHANCE_MORE,EMBOSS,FIND_EDGES,SMOOTH_MORE和SHARPEN。
% [1 c- \) C9 O- O  |9 Z7 Z* H, X还有一个名为ImageOps的模块,用于显示colorize(),flip(),grayscale(),invert(),mirror(),solarize()或posterize()等图像处理函数。
) y; n9 C2 Y: v$ F  a# f6.添加水印
/ s2 F/ @5 x. \
" ]# J: V% T& w1 wImageDraw和ImageFont使PIL能够在图像上写文本以及绘制线条或点。这是一个代码片段,显示了一个简单的批量转换器与PIL:它读取文件夹的所有jpg文件,添加水印(十字和“GEEXLAB”字符串),并保存带有gxl_前缀的图像。
$ h4 p9 _/ q# Z  r" e% q9 o导入HYP_Utils
7 L0 e6 {* b. e2 u0 e6 R5 @: P导入os,glob5 a: K- y* v5 L& F0 _4 E# M: w
从PIL导入图像
! z% |1 H% z: h4 ]: L9 ~从PIL导入ImageDraw+ L' W" g2 b6 n# l& y9 v+ b7 U  o
从PIL导入ImageFont' }! ~3 O! ^9 j
scriptDir = HYP_Utils.GetDemoDir()
. n8 B" _7 p) W; g7 Tft = ImageFont.load(“timR24.pil”)" a1 d# @( t& z2 {( S: b
os.chdir(SCRIPTDIR)7 w: F" Y2 a; X1 K, O: A  m6 N) U
file_list = glob.glob(“*。jpg”)
  s& p- r% s1 X( Z7 g对于file_list中的f:+ ^; y* c. M2 D3 e$ v
im = Image.open(scriptDir + str(f))
% Z4 a. r. F7 d6 k& x draw = ImageDraw.Draw(im)
7 l6 E5 F- o) t1 \- f' h' B8 | draw.line((0,0)+ im.size,fill =(255,255,255))
& I- R* O- n; W& g& a0 H draw.line((0,im.size [1],im.size [0],0),fill =(255,255,255))% j! u$ b; k5 P; a) N$ @* E
wh = ft.getsize(“GEEXLA B”)# e' ~% t0 x! h2 t0 l
draw.text((im.size [0] / 2-wh [0] / 2,im.size [1] / 2 + 20),“GEEXLA B”,\
3 V0 O1 h' S/ j" p fill =(255,255,0),font = ft)
' s! a$ o9 V- M6 y- ?/ i% X% R  Q draw.text((im.size [0] / 2 - wh [0] / 2,im.size [1] / 2 - 60),“GEEXLA B”,\ 1 z4 n, G& E7 i5 u, Q
fill =(255,255,0),font = ft)
9 ~/ N9 B! f: r& _( A 德尔绘制 $ f6 l& \  k; N" ]7 _5 _
im.save(scriptDir +“gxl_”+ str(f))( x- R5 t" ?# T6 `
还有一个很好的函数ImageFont.truetype(),但它不能在我的系统上工作,因为这个函数依赖于_imagingft.pyd库(实际上是一个DLL),由于Visual C运行时问题,无法加载。这是GeeXLab控制台中的错误:
+ b6 t+ `' D) u( R, ?7 c我们来看看实际运用5 N- ~  K, b8 D- }; m- ^3 q$ K
, n2 H6 O( [: h+ k* n

    8 {8 V# L, G) X) Q* i  D7 @
  • 调整图片亮度:# E! {+ [% ^6 C
) l' T" {7 F' ?* M
就个人而言,我认为这张照片看起来不错,但为了演示,我们试着把这张照片调亮。为了提高照片的关键是使用 Pillow's ImageEnhance module:6 q6 p, P2 x" u; l4 O: t

3 {0 R8 [$ |# d' H3 x. ~运行完上面的代码,你就会获得下面这样的图片:2 H2 f9 P+ \" _& q$ u( R

4 r$ O  f& U0 O4 T; B2 q如果你将enhancement factor调整0.0,那么你就会发现整张图片都变成了黑色,而如果你将其调整为0.7,那么你将获得下图:
* F4 k! a! b* C9 ?7 C
- L) q8 H7 n5 z: b9 ]) r

    % t" |% H: {; w; d: H" v7 y' q% X
  • 调整图片对比度1 R) h2 L' {& W5 c' W$ n6 R
如果我们之前拍摄了一些比较暗的图片,我们可以通过调整对比度和亮度来优化。: T. S  `& u! U

% D! [$ H3 I( t9 ?+ B4 ?% |上图是一张毛毛虫的照片,我们可以通过将下图的代码和上面的代码相结合来调整图片:
6 p! `5 K; h, a" Q
; Q4 k6 N; r8 ^! g/ `; w( H$ V; zImageEnhance模块中的所有类都以相同的方式运行。你可以通过改变增强值来优化图片,下图是我将值调整到0.7后得到的:  F% T3 E% j" q# m  x

, S9 Q+ ]$ E% M; v; X0 Q
    * |- j* E5 s! D4 j& Z
  • 改变图片的清晰度
    6 f% c8 ~9 E0 Q/ H3 B3 T
3 [- K4 i- G2 x# h4 A
如果你想要通过代码来实现图片锐化,那么下面的代码就值得一看:# \* c0 w+ H" l  u

% T2 q  n1 N% n% O, O  }- i) y" ~在这里需要改变的是ImageEnhance的Sharpness类,如果想要锐化图片也可以参照上面的操作。
: c, {0 T1 i7 _0 ~( P/ A' a! uPillow package 有很多简洁易用的功能,例如color类,有了它,你就可以随意使用Python来优化图片,玩转图片也可以这么酷炫!

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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

扫一扫关注我们

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