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
mask2 = 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)