您的位置:首页 > 编程语言 > Python开发

PIL(Python Image Library)常用操作简介

2017-08-25 11:48 976 查看

Basic Operations

因为我有点儿懒。。。所以本篇后续就基本是英文了(输入法切换好累0.0),本教程配套有Jupyter Notebook,请在此处下载

Python3 based PIL(python image library) tutorials from Documents

from PIL import ImageFilter
from PIL import Image
import numpy as np
import matplotlib
import matplotlib.pyplot as plt


im = Image.open("test.jpg")
print('format: ', im.format)
print('size: ', im.size)
print('mode: ', im.mode)
im.show()   # show the figure in photo viewer


format: JPEG

size: (625, 625)

mode: RGB

Cut A Certain Region

box = (100, 100, 400, 400)
region = im.crop(box)
# region.show()
plt.imshow(region)
plt.show()




Rotate

box = (100, 100, 400, 400)
region = im.crop(box)
region = region.transpose(Image.ROTATE_180)
im.paste(region, box)
# im.show()
plt.imshow(im)
plt.show()




Splitting and Merging Bands

im = Image.open("test.jpg")
r, g, b = im.split()
# r.show()
# g.show()
# b.show()
f, ax = plt.subplots(2, 2)
ax[0, 0].imshow(r)
ax[0, 0].set_title("R")
ax[0, 1].imshow(g)
ax[0, 1].set_title("G")
ax[1, 0].imshow(b)
ax[1, 0].set_title("B")

im = Image.merge("RGB", (g, b, r))

ax[1, 1].imshow(im)
ax[1, 1].set_title("Mixed Image")

plt.show()




Geometrical Transforms

im = Image.open("test.jpg")
out = im.resize((128,128))

f, ax = plt.subplots(2, 4)
ax[0, 0].imshow(out)

out = im.rotate(45) # degrees counter-clockwise, black background if empty
ax[0, 1].imshow(out)

out = im.transpose(Image.FLIP_LEFT_RIGHT)
ax[0, 2].imshow(out)

out = im.transpose(Image.FLIP_TOP_BOTTOM)
ax[0, 3].imshow(out)

out = im.transpose(Image.ROTATE_90)
ax[1, 0].imshow(out)

out = im.transpose(Image.ROTATE_180)
ax[1, 1].imshow(out)

out = im.transpose(Image.ROTATE_270)
ax[1, 2].imshow(out)

plt.show()




Colour Transform

"""
The official explanation of convert:

|  convert(self, mode=None, matrix=None, dither=None, palette=0, colors=256)
|      Returns a converted copy of this image. For the "P" mode, this
|      method translates pixels through the palette.  If mode is
|      omitted, a mode is chosen so that all information in the image
|      and the palette can be represented without a palette.
|
|      The current version supports all possible conversions between
|      "L", "RGB" and "CMYK." The **matrix** argument only supports "L"
|      and "RGB".
|
|      When translating a color image to black and white (mode "L"),
|      the library uses the ITU-R 601-2 luma transform::
|
|          L = R * 299/1000 + G * 587/1000 + B * 114/1000
|
|      The default method of converting a greyscale ("L") or "RGB"
|      image into a bilevel (mode "1") image uses Floyd-Steinberg
|      dither to approximate the original image luminosity levels. If
|      dither is NONE, all non-zero values are set to 255 (white). To
|      use other thresholds, use the :py:meth:`~PIL.Image.Image.point`
|      method.
|
|      :param mode: The requested mode. See: :ref:`concept-modes`.
|      :param matrix: An optional conversion matrix.  If given, this
|         should be 4- or 12-tuple containing floating point values.
|      :param dither: Dithering method, used when converting from
|         mode "RGB" to "P" or from "RGB" or "L" to "1".
|         Available methods are NONE or FLOYDSTEINBERG (default).
|      :param palette: Palette to use when converting from mode "RGB"
|         to "P".  Available palettes are WEB or ADAPTIVE.
|      :param colors: Number of colors to use for the ADAPTIVE palette.
|         Defaults to 256.
|      :rtype: :py:class:`~PIL.Image.Image`
|      :returns: An :py:class:`~PIL.Image.Image` object.
"""
im = Image.open("test.jpg")
gray_im = im.convert("L")
plt.imshow(gray_im)
plt.show()




Image Filter

from PIL import ImageFilter
im = Image.open("test.jpg")
plt.imshow(im)
plt.title('Original Figure')
plt.show()




im = Image.open("test.jpg")
out = im.filter(ImageFilter.BLUR)

f, (ax1, ax2) = plt.subplots(1, 2, sharey=True)
ax1.imshow(im)
ax1.set_title('Original Figure')
ax2.imshow(out)
ax2.set_title('Image Filter BLUR')

plt.imshow(out)
plt.show()




im = Image.open("test.jpg")
out = im.filter(ImageFilter.CONTOUR)

f, (ax1, ax2) = plt.subplots(1, 2, sharey=True)
ax1.imshow(im)
ax1.set_title('Original Figure')
ax2.imshow(out)
ax2.set_title('Image Filter CONTOUR')

plt.imshow(out)
plt.show()




im = Image.open("test.jpg")
out = im.filter(ImageFilter.DETAIL)

f, (ax1, ax2) = plt.subplots(1, 2, sharey=True)
ax1.imshow(im)
ax1.set_title('Original Figure')
ax2.imshow(out)
ax2.set_title('Image Filter DETAIL')

plt.imshow(out)
plt.show()




im = Image.open("test.jpg")
out = im.filter(ImageFilter.EDGE_ENHANCE)

f, (ax1, ax2) = plt.subplots(1, 2, sharey=True)
ax1.imshow(im)
ax1.set_title('Original Figure')
ax2.imshow(out)
ax2.set_title('Image Filter EDGE_ENHANCE')

plt.imshow(out)
plt.show()




im = Image.open("test.jpg")
out = im.filter(ImageFilter.EDGE_ENHANCE_MORE)

f, (ax1, ax2) = plt.subplots(1, 2, sharey=True)
ax1.imshow(im)
ax1.set_title('Original Figure')
ax2.imshow(out)
ax2.set_title('Image Filter EDGE_ENHANCE_MORE')

plt.imshow(out)
plt.show()




im = Image.open("test.jpg")
out = im.filter(ImageFilter.EMBOSS)

f, (ax1, ax2) = plt.subplots(1, 2, sharey=True)
ax1.imshow(im)
ax1.set_title('Original Figure')
ax2.imshow(out)
ax2.set_title('Image Filter EMBOSS')

plt.imshow(out)
plt.show()




im = Image.open("test.jpg")
out = im.filter(ImageFilter.FIND_EDGES)

f, (ax1, ax2) = plt.subplots(1, 2, sharey=True)
ax1.imshow(im)
ax1.set_title('Original Figure')
ax2.imshow(out)
ax2.set_title('Image Filter FIND_EDGES')

plt.imshow(out)
plt.show()




im = Image.open("test.jpg")
out = im.filter(ImageFilter.SMOOTH)

f, (ax1, ax2) = plt.subplots(1, 2, sharey=True)
ax1.imshow(im)
ax1.set_title('Original Figure')
ax2.imshow(out)
ax2.set_title('Image Filter SMOOTH')

plt.imshow(out)
plt.show()




im = Image.open("test.jpg")
out = im.filter(ImageFilter.SMOOTH_MORE)

f, (ax1, ax2) = plt.subplots(1, 2, sharey=True)
ax1.imshow(im)
ax1.set_title('Original Figure')
ax2.imshow(out)
ax2.set_title('Image Filter SMOOTH_MORE')

plt.imshow(out)
plt.show()




im = Image.open("test.jpg")
out = im.filter(ImageFilter.SHARPEN)

f, (ax1, ax2) = plt.subplots(1, 2, sharey=True)
ax1.imshow(im)
ax1.set_title('Original Figure')
ax2.imshow(out)
ax2.set_title('Image Filter SHARPEN')

plt.imshow(out)
plt.show()




Point Transform

im = Image.open("test.jpg")
out = im.point(lambda i: i*1.2)

f, (ax1, ax2) = plt.subplots(1, 2, sharey=True)
ax1.imshow(im)
ax1.set_title('Original Figure')
ax2.imshow(out)
ax2.set_title('Point 1.2')

plt.imshow(out)
plt.show()




Processing Individual Bands

im = Image.open("test.jpg")
# 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 < 220 and i > 100)
plt.imshow(mask)

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

# 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)
# plt.imshow(im)
plt.show()




im = Image.open("point.jpg")
im_point = im.crop((0, 250, 1000, 1670))

# split the image into individual bands
source = im_point.split()
R, G, B = 0, 1, 2

f, ax = plt.subplots(1, 5, sharey=True)

# select regions where red is less than 100
mask1 = source[R].point(lambda i: i > 215 and i < 250)
# plt.imshow(mask)
ax[0].imshow(mask1)

# process the green band
mask
a1af
2 = source[G].point(lambda i: i > 200 and i < 204)
# plt.imshow(mask2)
ax[1].imshow(mask2)

mask3 = source[B].point(lambda i: i > 206 and i < 215)
# plt.imshow(mask3)
ax[2].imshow(mask3)

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

# build a new multiband image
mask_logic = (np.array(mask1).astype(bool) & np.array(mask2).astype(bool) & np.array(mask3).astype(bool))
ax[3].imshow(mask_logic)
ax[4].imshow(im_point)
plt.show()




Convert to JPEG Format

import os, sys
from PIL import Image
for infile in sy.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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: