一、Pillow
PIL(Python Imaging Library)是一个 Python 图像处理库,Pillow 是一个对 PIL 友好的分支
1. 安装Pillow
pip install Pillow
如果下载失败或者超时,Linux下用国内镜像下载
pip install --index https://pypi.mirrors.ustc.edu.cn/simple/ pillow
2. Image类
PIL中最重要的是Image类,可以通过几种方法实例化:从文件中加载图像,处理其他图像得到,或者直接创建一个图像
2.1从文件中加载图像
使用open()函数加载图像,通过使用示例属性查看文件内容
from PIL import Image
im=Image.open("./2+2.jpg")
print(im.format, im.size, im.mode)
运行结果:
$ python test1.py
('JPEG', (954, 960), 'RGB')
format: 这个属性标识了图像来源。如果图像不是从文件读取它的值就是None
size:属性是一个二元tuple,包含width和height(宽度和高度,单位都是px)
mode 属性定义了图像bands的数量和名称,以及像素类型和深度。常见的modes 有 “L” (luminance) 表示灰度图像, “RGB” 表示真彩色图像, and “CMYK” 表示出版图像
如果文件打开错误,返回 IOError 错误
2.2对图像进行处理
2.2.1图像的裁剪
用PIL.Image.Image.crop方法获取图像一个子矩形区域
box = (0,0,500,500)
region = im.crop(box)
2.2.2图像的旋转
rotate(x): x需要顺时针旋转的角度
region = region.rotate(90) //顺时针旋转90°
在Pillow中,对于一些常见的旋转作了专门的定义:
region = region.transpose(Image.FLIP_LEFT_RIGHT)
region = region.transpose(Image.FLIP_TOP_BOTTOM)
region = region.transpose(Image.ROTATE_90)
region = region.transpose(Image.ROTATE_180)
region = region.transpose(Image.ROTATE_270)
2.2.3图像的粘贴合并
paste(now,old),粘贴矩形选区时候必须保持尺寸一致
im.paste(region, box)
2.2.4图像大小变换
resize((x,y))
im=im.resize((600,600))
2.2.5 颜色变换
convert(“L”) 彩色转化为黑白
convert(“CMYK”) 转化为出版彩色
im = im.convert("L")
im = im.convert("CMYK")
2.3 保存图片
save方法即可保存图片
综合上面图像处理方法的代码:
from PIL import Image
im=Image.open("./2+2.jpg") #打开图片
print(im.format, im.size, im.mode) #打印相关属性
box = (0,0,500,500)
region = im.crop(box) #选取了一块500*500px的矩形选区
region = region.rotate(90) #选区顺时针旋转90°
im.paste(region, box) #粘贴到原图位置
im=im.resize((600,600)) #原图图片大小变为600*600
im = im.convert("L") #图片转化为灰色
print(im.format, im.size, im.mode) #打印相关属性
im.save("./2+2_new.jpg") #保存图片
运行结果
$ python test1.py
('JPEG', (954, 960), 'RGB')
(None, (600, 600), 'L')
之前图片:
之后图片:
二、图片转字符串
1.原理
用一个字符表现一种颜色,将彩色图(RGB)转换成灰度图,用著名心理学公式
Gray = R*0.299 + G*0.587 + B*0.114
灰度值:指黑白图像中点的颜色深度,范围一般从0到255,白色为255,黑色为0.
创建一个不重复的字符列表,灰度值小(暗)的用列表开头的符号,灰度值大(亮)的用列表末尾的符号
2.实现
#*- coding:utf-8 -*-
from PIL import Image
import argparse
#命令行输入参数处理
parser = argparse.ArgumentParser()
parser.add_argument('file') #输入文件
parser.add_argument('-o', '--output') #输出文件
parser.add_argument('--width', type = int, default = 80) #输出字符画宽
parser.add_argument('--height', type = int, default = 80) #输出字符画高
#获取参数
args = parser.parse_args()
IMG = args.file
WIDTH = args.width
HEIGHT = args.height
OUTPUT = args.output
ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")
# 将256灰度映射到70个字符上
def get_char(r,g,b,alpha = 256):
if alpha == 0:
return ' '
length = len(ascii_char)
gray = int(0.299 * r + 0.587 * g + 0.114 * b)
unit = (256.0 + 1)/length
return ascii_char[int(gray/unit)]
if __name__ == '__main__':
im = Image.open(IMG)
im = im.resize((WIDTH,HEIGHT), Image.NEAREST)
txt = ""
for i in range(HEIGHT):
for j in range(WIDTH):
txt += get_char(*im.getpixel((j,i)))
txt += '\n'
print txt
#字符画输出到文件
if OUTPUT:
with open(OUTPUT,'w') as f:
f.write(txt)
else:
with open("output.txt",'w') as f:
f.write(txt)
运行结果:
$ python pic_to_str.py 2+2.jpg -o 2+2.txt
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$]_+$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$#+-(-_/$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$b~_[~(+_]$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$Q{-[~~~)v?+$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$x{+(~+^~~{/1+$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$1_)~~^^,+~[1)$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$[]}$$$j[{~~""^",_+?){$$$]}\$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$v[][]]$$m}}~~"""""<~j)U$$[[\]f$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$r[+>>?|}$$u{)~~^"^~<u(t$$}}>>?{\$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$?/_<>>>]x{$$u{\<<"~<n/x$$1{>>>!-//$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$~x+<>+"<>?r)$$n)j<<<cfx$${{>>!">i-f\$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$1-<><,"^<<-n/$$u)j<nnu$$1)~<i"^"+i_(j$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$u)>>~,^^^"<<-tt$$n(()c$$)(><+,^^":>>+(L$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$8(x>]^"^^"<~ufX$$((((($$j))<<"""",<<n|0$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$a_n>~^""<<j]v$$|||\|(|$$j)]<<^""<<c)v$$@$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$w}$/a_n<<"><vnfu$\\\/$0\|($$-\t>>I>~vtuq$f}h$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$q{}}$/o-v~<<zux$p///|$$$J|\u_$(\x><<vxuq@f}f}o$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$w}zwt{$jh?v~Xcc$$tttt$$C$$0x-/$$/tn>zcYq$\{wwCtk$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$@{fqwqff$tatffc$$tffj_@jff$@]//t$$/tttUm$$1nqwqxf$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$@1fpqZf0$$jjjjt$$jjj$o?fjjt]$Ofj$$/tttt$$$c{ZwUfW$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$1{wjU$$rrrnrrr$$$$@j\qbq}j$$$$$tjftff/$$$n1uf&$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$@){J$$rrrn$#xxr$$$xrdkhqqvx$$@rjjd$vjjf$$@c1W$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$&$$xrrz$$$axnx$nnpk&!opqUx$jxrd$$$zjjf$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$@nrxY$$$$$annnubbMoonhpqXcnxd$$$$$cjjj$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$nxrz$$$$$$$ouvbb+uohh#hqQzvq$$$$$$$zrrx$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$OxX$$$$$w$$$avvdb+bkbkpp0Xw$$$$$$$$$cxQ$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$O$$@$$Bccdd]hbppwUZ$$$$%Z$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$BccddtppwJq$$$$Z$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$BcUpppwLm$$$$Z$#$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$m$$$BzCpm0q$$$8$$a$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$ccv*$$$$$$O$$$$$Bzzzm$$$$$0$$$ccb@$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$qcvvczu$$$$$$$$$$XXXXX$$$$$$$$$vvvcvz@$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$@ccccvvvc$$$$$$$$YYYqXXX$$$$$$$$cccvvvc$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$@$@cvvvvc$$$$$$XYY&$%XXX$$$$$$$$Wcvvvcv$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$Bzvvvv$$$$$YYY&$$$BXXX$$$$$$$$$$vvvc8$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$vvvv@$$$XYUM$$a$$%UYU$$$$$$$$$vvvcb$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$#cvcc$$$YYY&$$$f%$$BYUY$$$$$$$$vvvc$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$@vcvc@$$$hYW$$$$f$@$$%Yp$$$$$$$$vvvv$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$Cvvc%$$$$$$$$xwXnbLC$$$$$$$$$$$cvvz@$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$WvccB$@$$$$$$$(xczvvc$$$$$$$$$$Cvvc$$@$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$#vvvvvvvz$$$$$$$$$z$$$$$$$$$$$@0vvccccc$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$Qcvvvvvvvz$$$$$$$$$z$$$$$$$$$$$ncvvvcccc$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$cccccvvvvvz$$$$$$$$$X$$$$$$$$$$zvvvvvvvvc@$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$@$$$$$$$$@$$$$$$$$$$$$$$$$$$$$$B@B@%88&km@$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$@@$$$$$$?$$$$$$@$$$$$$$&xZ$$$$$$$$$$$@$$$$@$$$@C$$$$$$@$$$$$J$$$$&$$$$$$
$$$$$$$$--$$$$$@-%$$$$?-_-+$$$-----c$$?-?--W$_-----@$$)-$$$$$_-_--$@_-@$??$$$$$$
$$$$$$$$-?$$$$$_--B$$$--@?-$$_-m$B-_$$--@r--@@$-?$@@$$--?$$$$-?$--$@]--?-?%$$$$$
$$$$$$$$-?$$$$q-M?-$$$-?]]B$@--$$$--$@--@]?B$$$-?$$$@??+-*$$$-?@-_$$$_--?$$$$$$$
$$$$$$$$-?$$$@--$--@$$-?8?-$@--$$$--@$--@-_$$$$-?$$$*??@--@$$-_]?&$$$@-?$$$$$$$$
$$$$$$$$-?B#$?-?----B$_?$--$@--k@)--$$--@--+$$$-?$$$--?---?$$-_$?-%$$$-?$$$$$$$$
$$$$$$$$----B--$$B_-C$?---a@$$-_--_@$$--$$--@$$-?@$]-_@$$--$$-_@#_[$$$??$$$$$$$$
$$$$$$$$$@@@$$J$$$B$$$@$$$$$$$$$%$$$$$$$$$$$$$$$$$$$$@$$$Y$$$$$$$8$$$$$$$$$$$$$$
$$$$$$$$$$$$$@@$$@$$$$$$$$$$$$$$$@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$