PIL笔记

图片颜色的类型

1 (1-bit pixels, black and white, stored with one pixel per byte)
L (8-bit pixels, black and white)
P (8-bit pixels, mapped to any other mode using a color palette)
RGB (3x8-bit pixels, true color)
RGBA (4x8-bit pixels, true color with transparency mask)
CMYK (4x8-bit pixels, color separation)
YCbCr (3x8-bit pixels, color video format)
I (32-bit signed integer pixels)
F (32-bit floating point pixels)

从数组产生图片

从数组产生彩色图片

numpy天然就是处理图像数据的好工具,skimage库大量的使用numpy,实现了部分opencv的功能,非常值得研究。

from PIL import Image
import numpy as np

data = -np.ones((100, 3)).reshape(10, 10, 3).astype('byte')
data[:5, :5, 2] = 0  # 只保留RG两色,即为黄色
data[5:, 5:, 1] = 0
data[:5, 5:, 0] = 0
img = Image.fromarray(data, "RGB")
img.show()

从数组产生灰度图片

from PIL import Image
import numpy as np
"""
当使用fromarray产生图片时,图片的类型(1,L,P之类的)跟数组每个元素的大小必须匹配!
"""
img = Image.fromarray(np.array([255]*100).astype(np.byte).reshape(10,10), 'L')
print(list(img.getdata()))
img.show()

PIL中的柱状图

from PIL import  Image
img=Image.open("haha.jpg")
res=img.histogram()
print(len(res))

使用调色板

from PIL import Image
import numpy as np

"""
如果mode=1,不管数组的实际长度,总是取其中的前width*height位,mode=1是黑白图
mode=L是灰度图
mode=P是调色板图,可以容纳256种颜色,它可以是彩图
"""
# 首先创建一个灰度图,其中每个像素都是122灰度
img = Image.fromarray((122 * np.ones((20, 20))).astype(np.byte), "P")


def method1():
    # 创建一个pallete,注意pallete只能用于mode=L和mode=P的情况,用于将灰度图彩色化
    pallete = np.zeros(256 * 3).astype(np.byte)  # 与pallete数组的形状无关,只取前768个byte
    # 将灰度为122的元素置为红色
    pallete[122 * 3] = 255
    img.putpalette(pallete)


def method2():
    # 创建一个pallete,注意pallete只能用于mode=L和mode=P的情况,用于将灰度图彩色化
    pallete = np.zeros(256 * 3).astype(np.byte)  # 与pallete数组的形状无关,只取前768个byte
    # 将灰度为122的元素置为红色
    pallete[122 * 3] = 255
    img.putpalette(pallete)


def method3():
    pallete = [0] * 768
    pallete[122 * 3] = 255
    img.putpalette(pallete)


method2()
img.show()
# 灰度122映射为RGB应为(122,122,122),RGB三色相同必然是灰色

使用图片的info

"""
能否保留文件info信息取决于图片类型
"""
img = Image.fromarray((128 * np.ones((20, 20))).astype(np.byte), "L")
img.info['user'] = "weidiao"
print(img.info)
img.save("haha.pdf")
img = Image.open("haha.pdf")
print(img.info)

不论何时,总是想着全部掌握一个库都是一种愚蠢的思想。一方面是没有必要,另一方面是不太可能。
不论何时,浏览一下库的全部内容都是一种智慧,一遍记不住浏览两遍,浏览的次数多了,不仅有助于知道库的功能,还有助于了解一些好的设计。

原文地址:https://www.cnblogs.com/weiyinfu/p/8051334.html