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

[复制链接]
nitenite 发表于 2017-12-31 08:20:30 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
分享前还是先分享自己的Python学习交流群:666468218
* r- J# f6 k3 E& O* T( H0 U" e$ T8 N; l5 J
群内不定时分享干货,包括最新的python企业案例学习资料和零基础入门教程,欢迎初学和进阶中的小伙伴入群学习交流0 N+ Y6 ^% J: a6 S4 L
( a: {! D/ r1 l9 V
! E" r# F- O. A% h; b- B! L
1.PIL:Python影像库2 T" h5 K) I, m3 l, l$ u8 u! k

1 f0 j2 l% O: `' DPIL或者Python Imaging Library是一个包含许多函数来处理来自Python脚本的图像的包。PIL官方网站在这里。目前版本的PIL是PIL 1.1.7,可用于Python 2.3到Python 2.7。本文将使用Python 2.6的PIL 1.1.7。. W7 }9 d( z9 c; d' f
在Windows(XP,Vista或者Seven)下,安装PIL相当简单:只需启动PIL Windows安装程序即可。当然你以前需要一个有效的Python 2.6.6安装。
& V  \- o& J* y1 F& D5 ]PIL文档可在这里找到:
  E5 J" r7 M0 f5 j9 V

    % Z& o  h8 Q2 Q/ y9 W3 @
  • 在线PIL文档
    # s" h: K' ~/ D; E
  • PDF PIL文件( m2 S6 J1 e4 ?  g: @
2.加载图像  U9 @8 B4 K# b6 B7 c6 G8 X3 }

2 [& J+ A+ h6 C% Y5 e( u这是一个小的INIT脚本,它使用PIL来加载图像并显示它。如果您需要,可以在Image.VERSION变量中找到PIL版本。5 ?0 M9 o7 q$ s: \) ^, J
导入HYP_Utils' [' P' O+ _3 i0 z' f+ ?
导入系统
0 k* h- g# Y; H! }4 O从PIL导入图像
! ]9 c' k( a# PscriptDir = HYP_Utils.GetDemoDir()1 b, I7 q$ M! H4 s  v6 s! w
PIL_Version = Image.VERSION* K& o% s( V6 F7 r3 v1 z
img_filename =“%s / flower.jpg”%scriptDir% v* Y/ p3 M8 o8 l8 w
im = Image.open(img_filename)7 M7 ^( y- j" g  \, N# ]
im.show()
  p- o* k. F: K$ x3 q, @* X在Windows下,Image.show()函数将图像保存到临时文件并调用默认图像查看器实用程序。0 z4 E5 C0 N5 q6 y+ a
3.保存图像
. y0 H+ Q- A0 P$ |6 r
$ P" e# s6 E3 {  Y4 L7 i只要调用Image.save()函数。你想保存为JPEG格式?只需将.jpg扩展名添加到图像文件名中即可。对于其他格式也是如此。
, ]  g8 z# j/ m% s) u% W阅读和写作支持的格式:*。bmp,*。gif,*。jpg,* .msp,* .pcx,*。png,* .ppm,*。tiff和.xbm。
- ]0 W, b' p# x1 ]3 o这里是一个简单的JPG到BMP转换器:
% E; v" L. ?/ W导入HYP_Utils
0 T: O& d( g" N; K从PIL导入图像
% S0 }. V! N$ u1 R% k$ WscriptDir = HYP_Utils.GetDemoDir()% b: |5 f7 l0 |) o
PIL_Version = Image.VERSION
1 F" ?8 \& q; |/ X3 \$ R' W, zimg_filename =“%s / flower.jpg”%scriptDir3 _! X% j4 U2 ^8 U7 _- o1 I4 E6 f
im = Image.open(img_filename)( T- h9 F0 H4 t6 g
im.save(“%s / flower.bmp”%scriptDir)5 {$ z( H" v" K/ \$ Z, R
4.读取像素* {# w( t0 \6 S4 H: Q9 l
* Q* O8 t0 v4 f
有两个函数可以读取像素图(或像素数据):Image.getpixel()和Image.getdata()。
& V: F, x* ~3 m" J; z图片。getpixel()返回单个像素的值。只需给出一个带有X和Y坐标的元组,getpixel()就可以为RGB图像返回一个3元组的RGB值,或者为亮度图像返回一个值。图片。getdata()返回完整的像素图。您需要Python函数list()来创建RGB元组的像素列表。% Q% [, n! |2 U* V. w
这里是一个代码片段,用PIL加载图像,用GeeXLab Python API创建一个纹理对象,并用图像像素填充纹理。( W- K; x, h* N8 f. G! [4 q
导入HYP_Utils, k6 w: o5 \& U
导入HYP_Texture/ a; }* f6 \9 C
进口HYP_Material3 D9 o2 N9 L. J0 V6 g) V
导入系统$ }/ {5 g% @3 Y% `: z
从PIL导入图像$ }2 e/ u) v1 v1 P6 I
scriptDir = HYP_Utils.GetDemoDir()
8 p. n7 s6 f0 Z8 Y7 e* t* Y( @  x, |PIL_Version = Image.VERSION
1 J0 D" S; _$ f- Rimg_filename =“%s / flower.jpg”%scriptDir
( e% w. a$ s( h0 N- f6 J  v  ?im = Image.open(img_filename)% {; E, _2 p5 `: _
imageW = im.size [0]5 I, ]& n* s# ~7 ]  d) S
imageH = im.size [1]% e( y, w- d# d7 r3 F" L2 I
TEXTURE_2D = 23 x! K7 [5 u) x1 ~
RGB_BYTE = 2' L# E, R$ U- A% q. {1 `
texId = HYP_Texture.Create(TEXTURE_2D,RGB_BYTE,imageW,imageH,0)7 {0 i: K9 e! Q* s/ [
matId = HYP_Material.GetId(“plane1_mat”)
) }/ B, O7 l  T& E0 pHYP_Material.AddTexture(matId,texId)
6 {! v, L1 ?9 L9 m+ @如果(im.mode ==“RGB”):+ U* \" Z" g" q9 y# f0 i4 y
对于范围内的y(0,imageH):
. V+ g8 J0 M; i 对于范围内的x(0,imageW):
# R8 f/ q( e: {7 ^8 _+ t offset = y * imageW + x/ V2 P! F: D5 d0 E; L1 [
xy =(x,y)
" y% D; g6 }4 z1 h& a2 N( r7 n& u rgb = im.getpixel(xy)
. ]9 I" M. v  Y8 K HYP_Texture.SetValueTex2DByteRgb(texId,offset,rgb [0],rgb [1],rgb [2]) & }- M8 k6 O+ {& N" i
elif(imout.mode ==“L”):7 f# a: ?: m9 {& @$ _0 ]
对于范围内的y(0,imageH):, {/ f: v9 M( q/ a/ \, E
对于范围内的x(0,imageW):
8 a5 m. l! z, t1 w offset = y * imageW + x# A+ E! u+ q2 n* O6 R" ^$ Q
xy =(x,y)2 z. e+ K# v# h7 x
rgb = im.getpixel(xy)
% c2 p9 R& w2 G. y HYP_Texture.SetValueTex2DByteRgb(texId,offset,rgb,rgb,rgb)
0 o! y* {* F0 y2 ~, W8 v& T. s使用Image.getdata(),前面脚本的最后几行是:! Y! m, Q2 y2 r5 Q6 l+ f
pixels = list(im.getdata())' G6 c9 b# M9 N6 ]& e. s5 n
如果(im.mode ==“RGB”):
! |) J7 z% t& R, s% j 对于范围内的y(0,imageH):) s" b; ^2 V! O" S/ e
对于范围内的x(0,imageW):
& ]+ K- l+ L2 e offset = y * imageW + x
' u, h3 m0 \3 r4 E" I rgb =像素[偏移]
, y- Q; w8 b" {; ^1 p/ |9 k. Z+ ` HYP_Texture.SetValueTex2DByteRgb(texId,offset,rgb [0],rgb [1],rgb [2])
, i( ~. W1 n4 I- R( d1 c, ?elif(imout.mode ==“L”):
/ C8 f2 V! L3 _/ a4 K$ `8 Z 对于范围内的y(0,imageH):
5 E& J/ g; W2 a8 }9 [. x' q 对于范围内的x(0,imageW):7 m% H, p! P. m; f. n
offset = y * imageW + x1 g. h7 T  N, F* P7 h
rgb =像素[偏移]
! [& q; D# ?3 }! x4 Z$ l HYP_Texture.SetValueTex2DByteRgb(texId,offset,rgb,rgb,rgb)* N0 \. {$ ?0 D$ i6 g
5.图像处理8 T- n; Q) z3 r7 Q
; p1 L! r( ^% k( f' Z
您可以使用PIL轻松应用通用图像滤镜:模糊,浮雕,锐化等。只需导入ImageFilter模块:
0 _2 v5 e: B. F% W从PIL导入图像9 S3 }3 \- U" ^
从PIL导入ImageFilter
' ?6 q2 ?9 |" k* Z0 ?$ [...% L- Z4 l- Q0 i3 I
i = Image.open(img_filename)! i) M; q8 K( z+ n
im = i.filter(ImageFilter.EMBOSS)/ E0 M% ]( A* l& E
#im = i.filter(ImageFilter.FIND_EDGES)! q0 h0 ^. n: L6 W9 [: `% ]- w! _
...
' m( @9 t* W1 n. D3 Y, B! Q预定义的滤镜包括:BLUR,CONTOUR,DETAIL,EDGE_ENHANCE,EDGE_ENHANCE_MORE,EMBOSS,FIND_EDGES,SMOOTH_MORE和SHARPEN。( j+ Y; o2 m" M9 `' c* l6 U* B) O
还有一个名为ImageOps的模块,用于显示colorize(),flip(),grayscale(),invert(),mirror(),solarize()或posterize()等图像处理函数。
& T) E/ h" V* Y+ y: H6.添加水印& K6 g/ _4 Y% H  C- \0 ]& c

; ?8 ?1 p6 Z8 KImageDraw和ImageFont使PIL能够在图像上写文本以及绘制线条或点。这是一个代码片段,显示了一个简单的批量转换器与PIL:它读取文件夹的所有jpg文件,添加水印(十字和“GEEXLAB”字符串),并保存带有gxl_前缀的图像。
; h9 L, F! T6 v3 l" ?8 e导入HYP_Utils" @* i, O' m) J$ {2 F. B3 v
导入os,glob
0 m0 r1 ]1 n- I: |. `从PIL导入图像$ N# ?0 w' V' @
从PIL导入ImageDraw
% E/ b/ n7 ~/ N% w' p% e从PIL导入ImageFont0 A6 M# S; ]" P: U
scriptDir = HYP_Utils.GetDemoDir()( M/ Y5 P! N' j' R3 S! N
ft = ImageFont.load(“timR24.pil”)
$ I# d( n0 I$ P" u' {' b/ Qos.chdir(SCRIPTDIR)9 N. ~3 i" J' f- Z* d( y+ |
file_list = glob.glob(“*。jpg”)
9 R  r) U! i, e" q7 h! z对于file_list中的f:
) b' ^  I) K0 G- e. X im = Image.open(scriptDir + str(f))
0 ~/ |; j1 |- ]! I4 S( ~% N: U7 Z draw = ImageDraw.Draw(im)
1 e" z8 k/ X0 w# f2 z% j draw.line((0,0)+ im.size,fill =(255,255,255))
; P: F; Y* a0 m: v4 v; ~+ [: A( O# o draw.line((0,im.size [1],im.size [0],0),fill =(255,255,255))" B0 }& ]( ~/ A' _
wh = ft.getsize(“GEEXLA B”)
: b% Z# O/ g3 Q9 I" z$ F. B draw.text((im.size [0] / 2-wh [0] / 2,im.size [1] / 2 + 20),“GEEXLA B”,\
. ]* R% l) B) _: A" r( p fill =(255,255,0),font = ft)* g/ g. @- m& Y2 R0 e3 U( p
draw.text((im.size [0] / 2 - wh [0] / 2,im.size [1] / 2 - 60),“GEEXLA B”,\ 1 c, K' [1 V% n/ ]! ~
fill =(255,255,0),font = ft)4 U/ r: w. T- t
德尔绘制 + u% |. @% b; v( f4 a2 d! t
im.save(scriptDir +“gxl_”+ str(f))4 P" l4 {& i9 |& ~7 u* h
还有一个很好的函数ImageFont.truetype(),但它不能在我的系统上工作,因为这个函数依赖于_imagingft.pyd库(实际上是一个DLL),由于Visual C运行时问题,无法加载。这是GeeXLab控制台中的错误:
; {* f7 h# F7 v! b我们来看看实际运用( C, C2 T: L4 h( [+ W, q) b
; b8 X  v) ?9 g* c, l

      {! G! n) b  X* e. n# G: P& O: Y: M
  • 调整图片亮度:2 U/ O) f) w( S
8 S7 @+ T# g3 Y. T
就个人而言,我认为这张照片看起来不错,但为了演示,我们试着把这张照片调亮。为了提高照片的关键是使用 Pillow's ImageEnhance module:
$ w6 ^" \7 Q. J# o- Z6 w" Q
/ y$ w% ]( U% i3 E8 O) V3 g  U7 |运行完上面的代码,你就会获得下面这样的图片:. U7 B. U7 v& x. U% Y7 T

, N3 h1 f0 e  N如果你将enhancement factor调整0.0,那么你就会发现整张图片都变成了黑色,而如果你将其调整为0.7,那么你将获得下图:+ b9 X+ ~. p8 f3 Z" P
% {* @8 r9 n8 l: W) ?( X8 Y' Q! `
    9 ?$ Y6 [2 o9 J2 w: n4 ^
  • 调整图片对比度7 c7 ~3 f- ]3 U$ |2 w1 B  r
如果我们之前拍摄了一些比较暗的图片,我们可以通过调整对比度和亮度来优化。
' h/ j, ^2 P% X. E9 Q( L  ~
4 ^8 D9 N" V+ P! `+ y上图是一张毛毛虫的照片,我们可以通过将下图的代码和上面的代码相结合来调整图片:
3 e* S- Z' O& `/ ^  r  f8 Q4 P+ i$ A: p2 @7 v5 M
ImageEnhance模块中的所有类都以相同的方式运行。你可以通过改变增强值来优化图片,下图是我将值调整到0.7后得到的:/ s: n% a. i8 _$ r( C

! k  v9 ]8 K4 ^1 A! m4 I
      w3 Q0 R1 u7 F5 O" D; @5 Y. D
  • 改变图片的清晰度$ _% F4 l' _9 ^0 @* B, w. t2 S" y! e* V

+ _6 o6 U! {: ?- ?, e! g) a6 d如果你想要通过代码来实现图片锐化,那么下面的代码就值得一看:
& i3 s% }. t0 O4 a% w* N7 N9 D. _4 }. k
在这里需要改变的是ImageEnhance的Sharpness类,如果想要锐化图片也可以参照上面的操作。
) M4 ~) Q- j/ [# \Pillow package 有很多简洁易用的功能,例如color类,有了它,你就可以随意使用Python来优化图片,玩转图片也可以这么酷炫!

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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

扫一扫关注我们

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