抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

Hello World

人よ、幸福に生きろ!

python图像处理

详见文档Pillow:Python-Imaging-Library这里使用的是Image模块

图像属性

format属性

string or None

标识了图像格式,如果图像不是从文件读取它的值就是None

mode属性

string

注:如果一个图片的颜色格式为srgb,则说明这张图片存储的颜色值是encoder gamma之后的颜色值

sRGB标准

  1. 人眼对亮度的感知不是线性的, 其对较暗区域的变化更加敏感,参见 Computer Color is Broken

  2. 基于人眼该特点,sRGB标准要求图像(各通道为8bits,最多存储256个亮度值)使用encoder gamma,把更多的空间用来存储更多暗部区域,来最大化地利用表示亮度的数据位或带宽。

size属性

(width,height)

图像的尺寸,按照像素数计算

palette属性

palette or None

颜色调色板表格,只对模式为"P"的图像返回Image Palette

info属性

dictionary

存储图像相关数据的字典

1
2
3
4
5
6
7
8
from PIL import Image
im = Image.open("personal/1.png")
print(im.format)
print(im.mode)
print(im.size)
print(im.palette)
print(im.info)
im.show()
PNG
RGBA
(1920, 1200)
None
{'srgb': 0, 'gamma': 0.45455, 'dpi': (119.9896, 119.9896)}

构建图像

Image.open(fp,mode)

1
2
3
from PIL import Image 
im = Image.open("personal/21.jpg","r")
im.show()

需要知道的是在win的环境下im.show的方式为win自带的图像显示应用。打开并确认给定的图像文件。这个是一个懒操作;该函数只会读文件头,而真实的图像数据直到试图处理该数据才会从文件读取(调用load()方法将强行加载图像数据)。如果变量mode被设置,那必须是“r”。用户可以使用一个字符串(表示文件名称的字符串)或者文件对象作为变量file的值。文件对象必须实现read(),seek()和tell()方法,并且以二进制模式打开。

Image.new(mode,size,color=0)

1
2
3
from PIL import Image,ImageColor
im = Image.new('RGB',(200,200),color="red")
im.show()

Image.fromarray(obj,mode=None)

  • obj-数组接口对象
  • mode-不自动判断
1
2
3
4
5
6
from PIL import Image
import numpy as np

arr = (np.eye(300)*255) # 二维数组
im = Image.fromarray(arr) # 转换为图像
im.show()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from PIL import Image
import numpy as np

image = Image.open("personal/21.jpg")
image1 = image.resize((200,200)) # resize
data = image1.getdata() # 转换为数组序列
print(list(data)) # 查看具体数据需要使用 list() 转换
obj = []
for t in data:
obj.append([sum(t) / 3]) # 灰度方法:RGB三个分量的均值

# 变成 200 * 200 的二维数组
obj = np.array(obj).reshape((200,200))
print(obj)
im = Image.fromarray(obj)
im.show()
[[223.         222.66666667 222.         ... 240.66666667 240.66666667
  240.66666667]
 [222.66666667 222.66666667 221.66666667 ... 240.66666667 241.
  240.66666667]
 [222.33333333 221.66666667 221.33333333 ... 240.66666667 240.66666667
  240.33333333]
 ...
 [120.33333333 118.33333333 145.66666667 ... 216.66666667 189.
  189.33333333]
 [119.         133.33333333 166.         ... 205.         188.
  190.        ]
 [125.33333333 162.66666667 163.         ... 196.33333333 188.33333333
  190.        ]]    

输出如下:

图像处理

图像混合

透明度混合 Image.blend(im1,im2,alpha)

  • im1:Image对象,透明度为(1-alpha)
  • im2:Image对象,透明度为(alpha)
  • alpha:透明度(0~1).

注意:im1和im2的大小必须一样,且模式为RGB

1
2
3
4
5
6
from PIL import Image

im1 = Image.open('personal/10.jpg').convert(mode='RGB')
im2 = Image.new ('RGB',im1.size,'blue')
im1.show()
Image.blend(im1,im2,0.2).show()

效果如下图所示:

遮罩混合 Image.composite(im1,im2,mask)

  • 均为Image对象,使用mask来混合im1和im2
  • 这里三个Image对象的size和mode都必须相同
1
2
3
4
5
6
7
8
9
10
from PIL import Image

im1 = Image.open('personal/7.jpg')
im2 = Image.open('personal/14.jpg')
print(im1.mode)
print(im2.mode)
print(im1.size)
print(im3.size)
r, g, b = im2.split()
Image.composite(im1,im2,b).show()
RGB
RGB
(3840, 2160)
(3840, 2160)

效果如下图所示:

图像缩放

按像素缩放 Image.eval(im,fun)

  • 第一个为Image对象
  • 第二个为一个方法(函数),该函数传入一个参数,即像素点。
  • 该函数会对图片中每个像素点进行函数内的操作
1
2
3
4
5
6
7
8
9
10
11
from PIL import Image
im = Image.open("personal/hira.png")

# lambda 表达式
Image.eval(im,lambda x:x*2).show()

# func 表达式
def func(x):
return x*1.5

Image.eval(im,func).show()

效果如下图所示:(1倍/1.5倍/2倍)


按尺寸缩放 Image.thumbnail()

  • 不同于前面直接通过Image调用方法,而是使用Image的具体实例im调用thumbnail方法
  • 这里缩放图像并不会对图像进行变形,即显示效果是一样的。
1
2
3
4
5
6
7
8
9
10
from PIL import Image
im1 = Image.open("personal/11.jpg")
im2 = im1.copy()

# 将复制后的图像进行缩放,传入一个元组
im2.thumbnail((1024,1024))
im2.show()

print("im1的大小", im1.size)
print("im2的大小", im2.size)
im1的大小 (2156, 3291)
im2的大小 (671, 1024)

图像的剪切与粘贴

图像粘贴 Image.paste(im,box,mask=None)

  • Image的具体实例调用方法
  • im为Image对象,box为要粘贴的区域,mask为遮罩。
  • box参数有三种形式:
    1. (x1,y1):将im左上角对齐(x1,y1)点,其余部分粘贴,剩余部分抛弃
    2. (x1,y1,x2,y2):将im粘贴至此区域
    3. None:此时im必须与原图像大小一致

图像剪裁 Image.crop(box)

1
2
3
4
5
6
from PIL import Image
im1 = Image.open("personal/111.PNG")
im2 = Image.open("personal/image_6.png")
im1_crop = im1.crop((0, 0, 671, 1024))
im2.paste(im1_crop,(200,0))
im2.show()

效果如图所示:

其他

转换图像格式

将.png转换为.jpg,注意:不能将RGBA转化为.jpg

1
2
3
4
5
6
from PIL import Image
im = Image.open("personal/10.png","r")
print(im)
im.save("personal/10.jpg") # 将.png转化为.jpg
im = Image.open("personal/10.jpg","r")
print(im.format,im.size,im.mode)
<PIL.PngImagePlugin.PngImageFile image mode=RGB size=1920x1080 at 0x255C7FE22E0>
JPEG (1920, 1080) RGB

评论