Python记7(Pillow数字图像处理

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.figure之后
plt.imshow(img)
plt.show()

请添加图片描述

3、转化色彩模式: 图像.convert(色彩模式)

取值色彩模式
1二值图像
L灰度图像
P8位彩色图像
RGB24位彩色图像
RGBA32位彩色图像
CMYKCMYK彩色图像
YCbCrYCbCr彩色图像
I32位整型灰度图像
F32位浮点灰度图像
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))  #图像缩放,注意是有2个括号
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),          #逆时针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()

请添加图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值