目录
- 1、位图、色彩深度/类型、图像类型等
- 2、用PIL导入图片:
- 3、转化色彩模式: 图像.convert(色彩模式)
- 4、色彩通道的分离split与合并merge:
- 5、转化为数组: np.array(图像)
- 6、颜色反向:
- 7、缩放resize、thumbnail:
- 8、旋转、镜像:图像.transpose(旋转方式)
- 9、裁剪: 图像.crop((x0,y0,x1,y1)) #x0,y0左下角,x1,y1右上角,返回值图像对象
1、位图、色彩深度/类型、图像类型等
- 位图(bitmap):通过记录每一个像素点来存储和表达图像(BMP是Windows系统的标准位图格式
- 色彩深度/位深度:每个像素点用多少个二进制位表示
- 色彩类型:二值图像、24位RGB、RGBA、256色:
- 二值图像:每像素点2种颜色,位深度为1的图像
- 24位真彩色红绿蓝RGB三个分量,位深度为24位(一个像素用3字节),可表示256^3种颜色
- RGBA图像(也叫32位真彩色,位深度32)=RGB图像共3个通道(就是RGB)+8位透明度信息Alpha (Alpha=0完全透明)
- 256色彩色图像:8位二进制表示,256个数字与调色板中的索引值一一对应(而不是用RGB)
- 还有灰度图像(二值图像升级版)、CMYK(印刷四分色:Cyan青色,Magenta洋红色,Yellow黄色,Black黑色)、YCbCr、HSI
- 图像类型:
序列图像:时间上有一定顺序和间隔、内容相关(如视频,其中每幅图像称为帧图像)
深度图像:类似灰度图像,像素的取值(颜色的深浅)不表示实物颜色,而表示距离摄像机的距离
图片格式
JPEG格式:有损压缩,压缩率高,对图像质量影响小,适用色彩丰富、细节清晰细腻的大图像;不适于颜色较少、相近的、亮度差异明显的简单图片,会出现明显分块,而且每次保存图像都会降低图像质量
PNG格式:无损压缩,适于有规律渐变色彩的图像
GIF格式:静态和动态图片。静态和JPEG类似,动态是将多幅图片保存为一个图片,循环显示。只支持256色。
TIFF格式:又定义了4种:TIFF-B二值图像、TIFF-G黑白灰度图像、TIFF-P带调色板的彩色图像、TIFF-R RGB真彩图像
- 拓展性、方便性、可改性:印刷业最常用的格式(但Web浏览器不支持)
各种库:matplotlib.image仅支持PNG格式、PIL(Python Imaging Library)仅支持Python2.x且停止更新了、Pillow(PIL基础发展而来,支持Python3)
2、用PIL导入图片:
from PIL import Image
- 打开文件:Image.open(路径) 返回image对象
- 保存图像:save() 改变文件名的后缀可以转换图像格式(不删除原图像)
- 显示图像:plt.imshow(image对象/Numpy数组)
- imshow负责对图像进行处理并显示它的格式,还需要show()显示图像
属性 |
说明 |
图像.format |
图像格式 |
图像.size |
图像尺寸 |
图像.mode |
色彩模式 |
print("format={},size={},mode={}" .format(img.format,img.size,img.mode))
format=JPEG,size=(512, 512),mode=RGB
from PIL import Image
import matplotlib.pyplot as plt
img=Image.open('lena.jpg')
plt.figure(figsize=(5,5))
plt.axis('off')
plt.imshow(img)
plt.show()
3、转化色彩模式: 图像.convert(色彩模式)
取值 |
色彩模式 |
1 |
二值图像 |
L |
灰度图像 |
P |
8位彩色图像 |
RGB |
24位彩色图像 |
RGBA |
32位彩色图像 |
CMYK |
CMYK彩色图像 |
YCbCr |
YCbCr彩色图像 |
I |
32位整型灰度图像 |
F |
32位浮点灰度图像 |
img=Image.open('lena.jpg')
img_gray=img.convert("L")
plt.figure(figsize=(5,5))
plt.axis('off')
plt.imshow(img_gray)
plt.show()
4、色彩通道的分离split与合并merge:
分离:图像.split()
合并:Image.merge(色彩模式,图像列表)
from PIL import Image
import matplotlib.pyplot as plt
img=Image.open('lena.jpg')
img_r,img_g,img_b=img.split()
img_rgb=Image.merge("RGB",[img_r,img_g,img_b])
plt.figure(figsize=(10,10))
img_RGB=[img_r,img_g,img_b,img_rgb]
img_name=['R','G','B','RGB']
ii=1
for i in range(4):
plt.subplot(2,2,i+1)
plt.axis("off")
plt.imshow(img_RGB[i])
plt.title(img_name[i],fontsize=20)
plt.show()
5、转化为数组: np.array(图像)
img=Image.open('lena.jpg')
img_gray=img.convert("L")
arr_img_gray=np.array(img_gray)
print("\nshape:",arr_img_gray.shape)
print(arr_img_gray)
shape: (512, 512)
[[163 162 161 ... 170 154 130]
[162 162 162 ... 173 155 126]
[161 162 163 ... 170 155 128]
...
[ 43 42 51 ... 103 101 99]
[ 41 42 55 ... 103 105 106]
[ 42 44 57 ... 102 106 109]]
6、颜色反向:
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
img=Image.open('lena.jpg')
img_gray=img.convert("L")
arr_img_gray=np.array(img_gray)
arr_img_colorReverse=255-arr_img_gray
plt.axis("off")
plt.imshow(arr_img_colorReverse,cmap="gray")
plt.show()
7、缩放resize、thumbnail:
- 创建新图:图像.resize((width,height)) #注意2个括号
- 原图修改:图像.thumbnail((width,height))
img=Image.open('lena.jpg')
plt.figure(figsize=(5,5))
img_small=img.resize((64,64))
plt.axis("off")
plt.imshow(img_small,cmap="gray")
plt.show()
8、旋转、镜像:图像.transpose(旋转方式)
旋转方式 |
描述 |
Image.FLIP_LEFT_RIGHT |
水平翻转 |
Image.FLIP_TOP_BOTTOM |
上下翻转 |
Image.ROTATE_90 |
逆时针90° |
Image.ROTATE_180 |
逆时针180° |
Image.ROTATE_270 |
逆时针270° |
Image.TRANSPOSE |
将图像转置 |
Image.TRANSVERSE |
将图像转置,再水平翻转 |
from PIL import Image
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"]="SimHei"
img=Image.open('lena.jpg')
plt.figure(figsize=(10,10))
str_title=['原图','左右转置','逆时针90°','转置']
img_kinds=[img,img.transpose(Image.FLIP_LEFT_RIGHT),
img.transpose(Image.ROTATE_90),
img.transpose(Image.TRANSPOSE)]
for i in range(4):
plt.subplot(2,2,i+1)
plt.axis("off")
plt.imshow(img_kinds[i])
plt.title(str_title[i],fontsize=20)
plt.show()
9、裁剪: 图像.crop((x0,y0,x1,y1)) #x0,y0左下角,x1,y1右上角,返回值图像对象
img_region=img.crop((100,100,400,400))
plt.axis("off")
plt.imshow(img_region)
plt.show()