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

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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章