参考文档
pillow中文文档
pillow官方
- 打开图片
区别于opencv的打开方式,Image.open读取的图像PIL格式的,需要转成Numpy及tensor进行使用,图像的通道顺序为RGB;cv2.imread读取的图像直接就是Numpy,图像的通道顺序是BGR,cv2.imshow显示的BGR的图像,如果是RGB图像,需要转成BGR进行显示。
from PIL import Image, ImageFilter
import os
import cv2
import matplotlib.pyplot as plt
print(os.getcwd()) #获取当前工作目录路径
os.chdir('D:\CVPython')
print(os.getcwd())
im=Image.open('church.jpg')
print(im.format,im.size,im.mode)
#im.show()
plt.imshow(im)
plt.title("Image Processing@CUC")
plt.axis('off')
plt.show()
- 改变图片格式
(将jpg格式的图片转换为png格式,注意文件路径)
from PIL import Image
import os
os.chdir("d:\CVPython")
filelist=os.listdir(os.getcwd())
#依次读取文件列表里的文件
for infile in filelist:
filename=str(infile)
isimg=filename.find('.jpg')#找到文件后缀为.jpg的
if isimg>=0:
outfile=infile[0:isimg]+".png"#将后缀修改为png
if infile!=outfile:
try:
Image.open(infile).save(outfile)
except IOError:
print("Cannot convert",infile)
#其他图片格式转换方法
from PIL import Image
im = Image.open("3d.jpg")
print(im)
im.save("3d.png") ## 将"3d.jpg"保存为3d.png"
im = Image.open("3d.png") ##打开新的png图片
#print(im.format, im.size, im.mode)
- 图像内部变化的基本操作
【模糊滤镜】
#转成灰度图# 应用模糊滤镜:
im = Image.open('./image/1.jpg').convert("L")
im2 = im.filter(ImageFilter.BLUR)
#模糊(还有其他:BLUR/CONTOUR/DETAIL/EDGE_ENHANCE/EDGE_ENHANCE_MORE/
#(EMBOSS/FIND_EDGES/SMOOTH/SMOOTH_MORE/SHARPEN)
im2.save('blur.jpg', 'jpeg')
【复制粘贴】
#复制粘贴
box=(100,100,200,200)
region=im.crop(box)#复制一块
region=region.transpose(Image.ROTATE_180)#旋转180°
im.paste(region,box)#粘贴
(拓展延伸:与人脸识别相结合进行局部换脸)
image = face_recognition.load_image_file("D:\Python 32\Lib\site-packages\cv2\data\img\old.jpg")
face_locations=face_recognition.face_locations(image)
face_num2=len(face_locations)
print(face_num2) # The number of faces
org = cv2.imread("D:\Python 32\Lib\site-packages\cv2\data\img\old.jpg")
box={}
for i in range(0,face_num2):
top = face_locations[i][0]
right = face_locations[i][1]
bottom = face_locations[i][2]
left = face_locations[i][3]
length = bottom-top
height = right-left
box[i] =left, top, left+length, top+height
print(box[0])
pil_im = Image.open('D:\Python 32\Lib\site-packages\cv2\data\img\old.jpg')
region = pil_im.crop(box[1])
pil_im.paste(region, box[0])
#subplot(233)
#title(u'复制粘贴区域', fontproperties=font)
axis('off')
imshow(pil_im)
【旋转翻转】
反转利用Image.FLIP_
旋转利用region.transpose()
Image.FLIP_LEFT_RIGHT #图片左右翻转
Image.FLIP_TOP_BOTTOM #图片上下翻转
region = region.transpose(Image.ROTATE_180)
# region = region.transpose(Image.FLIP_TOP_BOTTOM)
# region = region.transpose(Image.FLIP_LEFT_RIGHT)
# region = region.transpose(Image.ROTATE_90)
#region = region.transpose(Image.ROTATE_270)
#以上方式画布均跟随旋转
【图片轮廓与直方图】
from PIL import Image
from pylab import *
im=array(Image.open('1.jpg').convert('L'))
#图片1
figure()
gray()
contour(im,origin='image')
#直方图
axis('equal')
#与原图片同等大小
axis('off')
#图片2
figure()
hist(im.flatten(),128)#图像轮廓
show()
from PIL import Image
from PIL import ImageEnhance
#原始图像
image = Image.open('lena.jpg')
image.show()
#亮度增强
enh_bri = ImageEnhance.Brightness(image)
brightness = 1.5
image_brightened = enh_bri.enhance(brightness)
image_brightened.show()
#色度增强
enh_col = ImageEnhance.Color(image)
color = 1.5
image_colored = enh_col.enhance(color)
image_colored.show()
#对比度增强
enh_con = ImageEnhance.Contrast(image)
contrast = 1.5
image_contrasted = enh_con.enhance(contrast)
image_contrasted.show()
#锐度增强
enh_sha = ImageEnhance.Sharpness(image)
sharpness = 3.0
image_sharped = enh_sha.enhance(sharpness)
image_sharped.show()
【拉伸、分割、填充、混合】
#拉伸
#im=array(Image.open('1.jpg').convert('L'))
im=Image.open('1.jpg')
print(im.size)
x,y=im.size
img=im.resize((x,y*2))
img.show()
#为png填充颜色背景
im1 = Image.open('gs.png')
x1,y1 = im1.size
print(im1.size)
try:
# 使用白色来填充背景
# (alpha band as paste mask).
p = Image.new('RGBA', im1.size, (255,0,255))
p.paste(im1, (0, 0, x1, y1), im1)
p.save('pic_out.png')
except:
pass
#切分九宫格
filename = r'1.jpg'
img = Image.open(filename)
size = img.sizeprint(size)
# 准备将图片切割成9张小图片
weight = int(size[0] // 3)
height = int(size[1] // 3)# 切割后的小图的宽度和高度print(weight, height)
for j in range(3):
for i in range(3):
box = (weight * i, height * j, weight * (i + 1), height * (j + 1))
region = img.crop(box)
region.save('{}{}.png'.format(j, i))
#混合
background = Image.open('b.jpg')
w,h=background.size
img = Image.open('1.png')
img = img.resize((w, h), Image.ANTIALIAS)#大小需要相同
background = background.convert('RGBA') # 两个图片的格式需要相同
img = Image.blend(background, img, 0.7)
img.save('out_.png')