PIL 图像处理基础

1、图像基本知识

1.1常见图像

• 灰度图像:L = R * 299/1000 + G * 587/1000 + B * 114/1000。
• RGB 图像:真彩色图像,由 RGB 三原色调制而成。
• RGBA:带阿尔法通道的彩色图像,用于 mask 运算,常用语 ico 图片。
• JPEG 格式:目前最常见的图片格式,它诞生于 1992 年,是一个很古老的格
式。它只支持有损压缩,其压缩算法可以精确控制压缩比,以图像质量换
得存储空间。由于它太过常见,以至于许多移动设备的 CPU 都支持针对它
的硬编码与硬解码。
• PNG:PNG 只支持无损压缩,所以它的压缩比是有上限的。相对于 JPEG 和
GIF 来说,它最大的优势在于支持完整的透明通道。

1.2图像格式

2、几何变换

Ø 原图
在这里插入图片描述
Ø 单通道
在这里插入图片描述
Ø RGB 某一个通道空白
在这里插入图片描述
Ø HSV 空间
在这里插入图片描述

2.1图像坐标系

像素取值范围在 0-255 之间的无符号整数
在这里插入图片描述

2.2仿射变换

图像处理中,可应用仿射变换对二维图像进行平移、缩放、旋转等操作。实例如
下:
在这里插入图片描述
经仿射变换后,图像关键点依然构成三角形,但三角形形状已经发生变化。
以旋转为例
在这里插入图片描述在这里插入图片描述仿射变换通过一系列原子变换复合实现,具体包括:平移(Translation)、缩放
(Scale)、旋转(Rotation)、翻转(Flip)和错切(Shear)。
a) 平移
在这里插入图片描述b) 缩放
在这里插入图片描述
c) 旋转
在这里插入图片描述
d) 翻转
在这里插入图片描述

e) 错切
在这里插入图片描述

3、PIL 图像处理

4、代码实例

4.1 改变大小

from PIL import Image
im = Image.open("./data/Lenna.png")
region = im.resize((1024, 1024))     ##重新设定大小
region.show()

#im.thumbnail((100,100))
#im.show()

box = (100, 100, 300, 300)              ##确定拷贝区域大小
region = im.crop(box)                   ##将im表示的图片对象拷贝到region中,大小为box
region.show()

im1 = im.rotate(90) #旋转90度
print(im.mode, im.size)
im2 = Image.blend(im1, im, 0.2)#
im2.show()

4.2 灰度图

from PIL import Image
im = Image.open("./data/Lenna.png")
print(im.format, im.size, im.mode)
im = im.convert('L') #RGB转为灰度图,其他值如下图
print(im.mode)
im.save('./data/Lenna.jpg')# 灰度图
im.show()

在这里插入图片描述
mode为1(如下图)
在这里插入图片描述
4.3旋转

from PIL import Image
im = Image.open("./data/Lenna.png")
im_45 = im.rotate(45)#不补全
im_30 = im.rotate(30, Image.NEAREST,1)#参数1,表示放大图片,根据近邻点补全(如下图补黑色的部分)
print(im_45.size,im_30.size)
im_45.show()
im_30.show()

 在这里插入图片描述
4.4缓存

import io
from PIL import Image
import base64
#Base64编码
im = Image.open("./data/Lenna.png")
buffer = io.BytesIO()# io通道
im.save(buffer, 'JPEG')
binary_data = buffer.getvalue()
base64_data = base64.b64encode(binary_data)
print(base64_data)#b'/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGB...
#解码显示
byte_data = base64.b64decode(base64_data)
image_data = io.BytesIO(byte_data)
img = Image.open(image_data)
img.show()

4.5通道Channel

from PIL import Image
im = Image.open("./data/Lenna.png")
r,g,b = im.split()
print(r.mode)# L
print(r.size)# (512,512)
# print(r)
print(im.size)# (512,512)

im_merge = Image.merge("RGB", [r,g,b])# 合并
im_merge.show()

sequ = im.getdata()
sequ0 = list(sequ)
print(sequ0[0])
print(sequ0[1])
print(len(sequ0))# 

print(im.getpixel((0,0)))#某一点的像素
print(im.getpixel((0,1)))
print(b.getpixel((0,0)))#二维的
发布了89 篇原创文章 · 获赞 42 · 访问量 3648

猜你喜欢

转载自blog.csdn.net/weixin_43673156/article/details/105356280