백엔드 개발 파이썬 튜토리얼 Python编程中使用Pillow来处理图像的基础教程

Python编程中使用Pillow来处理图像的基础教程

Jun 10, 2016 pm 03:07 PM
pillow python

安装
刚接触Pillow的朋友先来看一下Pillow的安装方法,在这里我们以Mac OS环境为例:
(1)、使用 pip 安装 Python 库。pip 是 Python 的包管理工具,安装后就可以直接在命令行一站式地安装/管理各种库了(pip 文档)。

$ wget http://pypi.python.org/packages/source/p/pip/pip-0.7.2.tar.gz

$ tar xzf pip-0.7.2.tar.gz

$ cd pip-0.7.2

$ python setup.py install

로그인 후 복사

(2)、使用 pip 下载获取 Pillow:

$ pip install pillow

로그인 후 복사

(3)、安装过程中命令行出现错误提示:”error: command ‘clang' failed with exit status 1”。上网查阅,发现需要通过 Xcode 更新 Command Line Tool。于是打开 Xcode->Preferences->Downloads-Components选项卡。咦?竟然没了 Command Line Tools。再查,发现 Xcode 5 以上现在需要用命令行安装:

$ xcode-select —install

로그인 후 복사

系统会弹出安装命令行工具的提示,点击安装即可。

此时再 pip install pillow,就安装成功了。

pip freeze 命令查看已经安装的 Python 包,Pillow 已经乖乖躺那儿了。

好了,下面开始进入教程~

Image类
Pillow中最重要的类就是Image,该类存在于同名的模块中。可以通过以下几种方式实例化:从文件中读取图片,处理其他图片得到,或者直接创建一个图片。

使用Image模块中的open函数打开一张图片:

>>> from PIL import Image
>>> im = Image.open("lena.ppm")
로그인 후 복사

如果打开成功,返回一个Image对象,可以通过对象属性检查文件内容

>>> from __future__ import print_function
>>> print(im.format, im.size, im.mode)
로그인 후 복사

PPM (512, 512) RGB
로그인 후 복사

format属性定义了图像的格式,如果图像不是从文件打开的,那么该属性值为None;size属性是一个tuple,表示图像的宽和高(单位为像素);mode属性为表示图像的模式,常用的模式为:L为灰度图,RGB为真彩色,CMYK为pre-press图像。

如果文件不能打开,则抛出IOError异常。

当有一个Image对象时,可以用Image类的各个方法进行处理和操作图像,例如显示图片:

>>> im.show()
로그인 후 복사

ps:标准版本的show()方法不是很有效率,因为它先将图像保存为一个临时文件,然后使用xv进行显示。如果没有安装xv,该函数甚至不能工作。但是该方法非常便于debug和test。(windows中应该调用默认图片查看器打开)

读写图片
Pillow库支持相当多的图片格式。直接使用Image模块中的open()函数读取图片,而不必先处理图片的格式,Pillow库自动根据文件决定格式。

Image模块中的save()函数可以保存图片,除非你指定文件格式,那么文件名中的扩展名用来指定文件格式。

图片转成jpg格式

from __future__ import print_function
import os, sys
from PIL import Image

for infile in sys.argv[1:]:
 f, e = os.path.splitext(infile)
 outfile = f + ".jpg"
 if infile != outfile:
  try:
   Image.open(infile).save(outfile)
  except IOError:
   print("cannot convert", infile)

로그인 후 복사

save函数的第二个参数可以用来指定图片格式,如果文件名中没有给出一个标准的图像格式,那么第二个参数是必须的。

创建缩略图

from __future__ import print_function
import os, sys
from PIL import Image

size = (128, 128)

for infile in sys.argv[1:]:
 outfile = os.path.splitext(infile)[0] + ".thumbnail"
 if infile != outfile:
  try:
   im = Image.open(infile)
   im.thumbnail(size)
   im.save(outfile, "JPEG")
  except IOError:
   print("cannot create thumbnail for", infile)

로그인 후 복사

必须指出的是除非必须,Pillow不会解码或raster数据。当你打开一个文件,Pillow通过文件头确定文件格式,大小,mode等数据,余下数据直到需要时才处理。

这意味着打开文件非常快,与文件大小和压缩格式无关。下面的程序用来快速确定图片属性:

确定图片属性

from __future__ import print_function
import sys
from PIL import Image

for infile in sys.argv[1:]:
 try:
  with Image.open(infile) as im:
   print(infile, im.format, "%dx%d" % im.size, im.mode)
 except IOError:
  pass

로그인 후 복사

裁剪、粘贴、与合并图片
Image类包含还多操作图片区域的方法。如crop()方法可以从图片中提取一个子矩形

从图片中复制子图像

box = im.copy() #直接复制图像
box = (100, 100, 400, 400)
region = im.crop(box)
로그인 후 복사

区域由4-tuple决定,该tuple中信息为(left, upper, right, lower)。 Pillow左边系统的原点(0,0)为图片的左上角。坐标中的数字单位为像素点,所以上例中截取的图片大小为300*300像素^2。

处理子图,粘贴回原图

region = region.transpose(Image.ROTATE_180)
im.paste(region, box)
로그인 후 복사

将子图paste回原图时,子图的region必须和给定box的region吻合。该region不能超过原图。而原图和region的mode不需要匹配,Pillow会自动处理。

另一个例子

Rolling an image

def roll(image, delta):
 "Roll an image sideways"

 image = image.copy() #复制图像
 xsize, ysize = image.size

 delta = delta % xsize
 if delta == 0: return image

 part1 = image.crop((0, 0, delta, ysize))
 part2 = image.crop((delta, 0, xsize, ysize))
 image.paste(part2, (0, 0, xsize-delta, ysize))
 image.paste(part1, (xsize-delta, 0, xsize, ysize))

 return image

로그인 후 복사

分离和合并通道

r, g, b = im.split()
im = Image.merge("RGB", (b, g, r))
로그인 후 복사

对于单通道图片,split()返回图像本身。为了处理单通道图片,必须先将图片转成RGB。

几何变换
Image类有resize()、rotate()和transpose()、transform()方法进行几何变换。

简单几何变换

out = im.resize((128, 128))
out = im.rotate(45) # 顺时针角度表示
로그인 후 복사

置换图像

out = im.transpose(Image.FLIP_LEFT_RIGHT)
out = im.transpose(Image.FLIP_TOP_BOTTOM)
out = im.transpose(Image.ROTATE_90)
out = im.transpose(Image.ROTATE_180)
out = im.transpose(Image.ROTATE_270)
로그인 후 복사

transpose()和象的rotate()没有性能差别。

更通用的图像变换方法可以使用transform()

模式转换
convert()方法

模式转换

im = Image.open('lena.ppm').convert('L')
로그인 후 복사

图像增强
Filter
ImageFilter模块包含很多预定义的增强filters,通过filter()方法使用

应用filters

from PIL import ImageFilter
out = im.filter(ImageFilter.DETAIL) 
로그인 후 복사

像素点处理
point()方法通过一个函数或者查询表对图像中的像素点进行处理(例如对比度操作)。

像素点变换

# multiply each pixel by 1.2
out = im.point(lambda i: i * 1.2)
로그인 후 복사

上述方法可以利用简单的表达式进行图像处理,通过组合point()和paste()还能选择性地处理图片的某一区域。

处理单独通道

# split the image into individual bands
source = im.split()

R, G, B = 0, 1, 2

# select regions where red is less than 100
mask = source[R].point(lambda i: i < 100 and 255)

# process the green band
out = source[G].point(lambda i: i * 0.7)

# paste the processed band back, but only where red was < 100
source[G].paste(out, None, mask)

# build a new multiband image
im = Image.merge(im.mode, source)

로그인 후 복사

注意到创建mask的语句:

mask = source[R].point(lambda i: i < 100 and 255)
로그인 후 복사

该句可以用下句表示

imout = im.point(lambda i: expression and 255)
로그인 후 복사

如果expression为假则返回expression的值为0(因为and语句已经可以得出结果了),否则返回255。(mask参数用法:当为0时,保留当前值,255为使用paste进来的值,中间则用于transparency效果)

高级图片增强
对其他高级图片增强,应该使用ImageEnhance模块 。一旦有一个Image对象,应用ImageEnhance对象就能快速地进行设置。 可以使用以下方法调整对比度、亮度、色平衡和锐利度。

图像增强

from PIL import ImageEnhance

enh = ImageEnhance.Contrast(im)
enh.enhance(1.3).show("30% more contrast")

로그인 후 복사

动态图

Pillow支持一些动态图片的格式如FLI/FLC,GIF和其他一些处于实验阶段的格式。TIFF文件同样可以包含数帧图像。

当读取动态图时,PIL自动读取动态图的第一帧,可以使用seek和tell方法读取不同帧。

from PIL import Image

im = Image.open("animation.gif")
im.seek(1) # skip to the second frame

try:
 while 1:
  im.seek(im.tell()+1)
  # do something to im
except EOFError:
 pass # end of sequence

로그인 후 복사

当读取到最后一帧时,Pillow抛出EOFError异常。

当前版本只允许seek到下一帧。为了倒回之前,必须重新打开文件。

或者可以使用下述迭代器类

动态图迭代器类

class ImageSequence:
 def __init__(self, im):
  self.im = im
 def __getitem__(self, ix):
  try:
   if ix:
    self.im.seek(ix)
   return self.im
  except EOFError:
   raise IndexError # end of sequence

for frame in ImageSequence(im):
 # ...do something to frame...
Postscript Printing

로그인 후 복사

Pillow允许通过Postscript Printer在图片上添加images、text、graphics。

Drawing Postscript

from PIL import Image
from PIL import PSDraw

im = Image.open("lena.ppm")
title = "lena"
box = (1*72, 2*72, 7*72, 10*72) # in points

ps = PSDraw.PSDraw() # default is sys.stdout
ps.begin_document(title)

# draw the image (75 dpi)
ps.image(box, im, 75)
ps.rectangle(box)

# draw centered title
ps.setfont("HelveticaNarrow-Bold", 36)
w, h, b = ps.textsize(title)
ps.text((4*72-w/2, 1*72-h), title)

ps.end_document()

로그인 후 복사

更多读取图片方法
之前说到Image模块的open()函数已经足够日常使用。该函数的参数也可以是一个文件对象。

从string中读取

import StringIO

im = Image.open(StringIO.StringIO(buffer))

로그인 후 복사

从tar文件中读取

from PIL import TarIO

fp = TarIO.TarIO("Imaging.tar", "Imaging/test/lena.ppm")
im = Image.open(fp)

로그인 후 복사

草稿模式
draft()方法允许在不读取文件内容的情况下尽可能(可能不会完全等于给定的参数)地将图片转成给定模式和大小,这在生成缩略图的时候非常有效(速度要求比质量高的场合)。

draft模式

from __future__ import print_function
im = Image.open(file)
print("original =", im.mode, im.size)

im.draft("L", (100, 100))
print("draft =", im.mode, im.size)
로그인 후 복사

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

2 시간의 파이썬 계획 : 현실적인 접근 2 시간의 파이썬 계획 : 현실적인 접근 Apr 11, 2025 am 12:04 AM

2 시간 이내에 Python의 기본 프로그래밍 개념과 기술을 배울 수 있습니다. 1. 변수 및 데이터 유형을 배우기, 2. 마스터 제어 흐름 (조건부 명세서 및 루프), 3. 기능의 정의 및 사용을 이해하십시오. 4. 간단한 예제 및 코드 스 니펫을 통해 Python 프로그래밍을 신속하게 시작하십시오.

Redis 대기열을 읽는 방법 Redis 대기열을 읽는 방법 Apr 10, 2025 pm 10:12 PM

Redis의 대기열을 읽으려면 대기열 이름을 얻고 LPOP 명령을 사용하여 요소를 읽고 빈 큐를 처리해야합니다. 특정 단계는 다음과 같습니다. 대기열 이름 가져 오기 : "큐 :"와 같은 "대기열 : my-queue"의 접두사로 이름을 지정하십시오. LPOP 명령을 사용하십시오. 빈 대기열 처리 : 대기열이 비어 있으면 LPOP이 NIL을 반환하고 요소를 읽기 전에 대기열이 존재하는지 확인할 수 있습니다.

Redis로 서버를 시작하는 방법 Redis로 서버를 시작하는 방법 Apr 10, 2025 pm 08:12 PM

Redis 서버를 시작하는 단계에는 다음이 포함됩니다. 운영 체제에 따라 Redis 설치. Redis-Server (Linux/MacOS) 또는 Redis-Server.exe (Windows)를 통해 Redis 서비스를 시작하십시오. Redis-Cli Ping (Linux/MacOS) 또는 Redis-Cli.exe Ping (Windows) 명령을 사용하여 서비스 상태를 확인하십시오. Redis-Cli, Python 또는 Node.js와 같은 Redis 클라이언트를 사용하여 서버에 액세스하십시오.

비즈니스 요구에 따라 Redis 메모리 크기를 설정하는 방법은 무엇입니까? 비즈니스 요구에 따라 Redis 메모리 크기를 설정하는 방법은 무엇입니까? Apr 10, 2025 pm 02:18 PM

Redis 메모리 크기 설정은 다음 요소를 고려해야합니다. 데이터 볼륨 및 성장 추세 : 저장된 데이터의 크기 및 성장 속도를 추정하십시오. 데이터 유형 : 다른 유형 (예 : 목록, 해시)은 다른 메모리를 차지합니다. 캐싱 정책 : 전체 캐시, 부분 캐시 및 단계 정책은 메모리 사용에 영향을 미칩니다. 비즈니스 피크 : 트래픽 피크를 처리하기에 충분한 메모리를 남겨 두십시오.

Python vs. C : 응용 및 사용 사례가 비교되었습니다 Python vs. C : 응용 및 사용 사례가 비교되었습니다 Apr 12, 2025 am 12:01 AM

Python은 데이터 과학, 웹 개발 및 자동화 작업에 적합한 반면 C는 시스템 프로그래밍, 게임 개발 및 임베디드 시스템에 적합합니다. Python은 단순성과 강력한 생태계로 유명하며 C는 고성능 및 기본 제어 기능으로 유명합니다.

Redis 메모리 구성 매개 변수는 무엇입니까? Redis 메모리 구성 매개 변수는 무엇입니까? Apr 10, 2025 pm 02:03 PM

** Redis 메모리 구성의 핵심 매개 변수는 MaxMemory로 Redis가 사용할 수있는 메모리의 양을 제한합니다. 이 한계가 초과 될 때, Redis는 Maxmemory-Policy에 따라 제거 전략을 실행합니다. 다른 관련 매개 변수로는 MaxMemory-Samples (LRU 샘플 수량), RDB- 압축이 있습니다

메모리에 대한 Redis 지속성의 영향은 무엇입니까? 메모리에 대한 Redis 지속성의 영향은 무엇입니까? Apr 10, 2025 pm 02:15 PM

Redis Persistence는 추가 메모리를 차지하고 RDB는 스냅 샷을 생성 할 때 메모리 사용량을 일시적으로 증가시키고 AOF는 로그를 추가 할 때 계속 메모리를 차지합니다. 영향 요인에는 데이터 볼륨, 지속성 정책 및 Redis 구성이 포함됩니다. 영향을 완화하려면 RDB 스냅 샷 정책을 합리적으로 구성하고 구성 최적화, 하드웨어 업그레이드 및 메모리 사용을 모니터링 할 수 있습니다. 또한 성능과 데이터 보안 사이의 균형을 찾는 것이 중요합니다.

Redis의 데이터를 읽는 방법 Redis의 데이터를 읽는 방법 Apr 10, 2025 pm 07:30 PM

Redis의 데이터를 읽으려면 다음 단계를 따를 수 있습니다. 1. Redis 서버에 연결하십시오. 2. get (키)을 사용하여 키의 값을 얻으십시오. 3. 문자열 값이 필요한 경우 이진 값을 해독하십시오. 4. 키가 존재하는지 확인하기 위해 사용 (키)을 사용합니다. 5. MGET (키)를 사용하여 여러 값을 얻으십시오. 6. 유형 (키)을 사용하여 데이터 유형을 얻습니다. 7. Redis는 다음과 같은 다른 읽기 명령을 가지고 있습니다. 예 : 모든 키를 일치 패턴으로 가져오고, 커서를 사용하여 키를 반복하고, 키 값을 정렬합니다.

See all articles