1、图像打开和显示
图像打开
打开图像用open(), 显示图像用show()
# 导入我们需要的包
from PIL import Image
# 图像路径 D:\work\第一阶段\week02\day05\123.jpg
path = r"D:\work\第一阶段\week02\day05\123.jpg"
# 使用open打开图像
img = Image.open(path)
# 显示图像
img.show()
# (240, 300)-->WH
print("图像大小", img.size)
图像新建
# mode:图片的模式,
# size:图片的大小,这里与上面一个图大小一致,WH
# color:图像的颜色,默认是黑色
img2 = Image.new(mode='RGB', size=(img.size), color='yellow') # 创建一个与img1同样大小的图片
2、对图像进行增强操作
调整图像大小
对图像大小的调整使用resize()。不过我们在resize的时候得看要求,最好是等比例改变大小
def resize_img(img, out_path, size):
"""
:param img: 原始的图像
:param out_path: 保存的地址
:param size: 需要改变的大小
:return:
"""
imgs = Image.open(img)
# 讲图像的mode转换为“RGB"
imgs.convert("RGB")
# size为一个元组,WH, BILINEAR表示双线性插值法,用于平滑的调整图像的大小
resized_img = imgs.resize(size, Image.BILINEAR)
# 保存图像
resized_img.save(out_path)
return resized_img
旋转图像
对图像进行旋转,见代码
from PIL import Image, ImageFont, ImageDraw
def image_rotate(image_path, out_path, angle):
"""
:param image_path: 图像路径
:param out_path: 保存路径
:param angle: 旋转得角度
:return:
"""
image = Image.open(image_path)
# BICUBIC:表示使用双三次插值方法
image_rotated = image.rotate(angle, Image.BICUBIC)
image_rotated.save(out_path)
return image_rotated
水平翻转
直接使用transpose()方法。Image可解
PIL.Image.FLIP_LEFT_RIGHT:左右镜像
PIL.Image.FLIP_TOP_BOTTOM :上下镜像
PIL.Image.ROTATE_90:旋转90
PlL.Image.ROTATE_180: 旋转180
PIL.Image.ROTATE_270: 旋转270
PIL.Image.TRANSPOSE :颠倒顺序
img_path = "123.jpg"
image = Image.open(img_path)
# Image.FLIP_TOP_BOTTOM 水平翻转
image_transpose = image.transpose(Image.FLIP_LEFT_RIGHT)
# Image.FLIP_TOP_BOTTOM 上下翻转
image_transpose = image.transpose(Image.FLIP_TOP_BOTTOM)
添加文字
需要导入ImageFont和ImageDraw
from PIL import Image, ImageFont, ImageDraw
img_path = "123.jpg
image = Image.open(img_path)
font = ImageFont.truetype(font=r"d:\Fonts\Times New Roman\times.ttf",size=3)
draw = ImageDraw.Draw(image)
draw.text((100, 200), text="study", fill=(255, 0, 0), font=font)
图像滤波操作
这里使用了三种滤波方式显示
# 滤波操作
from PIL import Image, ImageFilter
# 打开图像文件
input_image = Image.open("input_image.jpg")
# 应用高斯滤波
filtered_image = input_image.filter(ImageFilter.GaussianBlur(radius=2))
# 应用Sobel边缘检测滤波
# filtered_image = input_image.filter(ImageFilter.FIND_EDGES)
# 应用锐化滤波
# filtered_image = input_image.filter(ImageFilter.SHARPEN)
# 应用均值滤波
# filtered_image = input_image.filter(ImageFilter.MedianFilter(radius=3))
# 保存滤波后的图像
filtered_image.save("filtered_image.jpg")
# 关闭输入图像
input_image.close()
图像合并和遮罩混合
函数blend() 是讲两张图像进行合并,设置透明度来实现
函数composite()的功能是使用mask来混合图片img1和img2,并且要求mask、img1和img2三幅图片的尺寸相同
from PIL import Image
# 图像合成,使用blend方法
image1 = Image.open("123.jpg")
# 打开第二张图像
image2 = Image.open("input2.jpg")
# 使用 blend 方法合成两张图像 ,alpha表示透明度
blended_image = Image.blend(image1, image2, alpha=0.5)
img1 = Image.open('./poo/1.jpg')
img2 = Image.open('./poo/2.jpg')
img2.resize(img1.size) # 将img2的图片大小修改成与img1相同
r, g, b = img2.split() # 将img2的图片rgb通道切割
Image.composite(img1, img2, g).show() # 用img2中的g通道对img1进行遮罩
颜色增强
对颜色进行抖动
from PIL import Image, ImageFont, ImageDraw, ImageEnhance
import matplotlib.pyplot as plt
import numpy as np
def image_color(image_path, save_path):
"""
对图像进行颜色抖动
:param image_path:
:param save_path:
:return:
"""
image = Image.open(image_path)
print(type(image))
random_factor = np.random.randint(low=0, high=31) / 10.0 # 随机的扰动因子
color_image = ImageEnhance.Color(image).enhance(random_factor) # 调整图像的饱和度
random_factor = np.random.randint(low=10, high=21) / 10.0
bright_image = ImageEnhance.Brightness(color_image).enhance(random_factor) # 调整图像的亮度
random_factor = np.random.randint(low=10, high=21) / 10.0
contrast_image = ImageEnhance.Contrast(bright_image).enhance(random_factor) # 调整图像的对比度
random_factor = np.random.randint(low=0, high=31) / 10.0
sharp_image = ImageEnhance.Sharpness(contrast_image).enhance(random_factor) # 调整图像的锐度
sharp_image.save(save_path)
return sharp_image
分离和并和
分离: 使用函数split()可以将图片分割为多个通道列表。
合并: 使用函数merge()可以将一个通道的图像合并到更多通道图像中。语法格式如下所示:
Image.merge(mode,bands),
mode 是一个字符串,表示要创建的合并后图像的模式(mode)。通常,模式是一个字符,表示每个通道的数据类型和颜色模式。常见的模式包括 “RGB”(红绿蓝)、“RGBA”(红绿蓝透明度)等,
bands 是一个元组(tuple),包含要合并的图像通道。每个通道都是一个单通道的图像。
from PIL import Image
# 创建三个单通道的图像,代表红、绿、蓝通道
red_channel = Image.open("red_channel.jpg")
green_channel = Image.open("green_channel.jpg")
blue_channel = Image.open("blue_channel.jpg")
# 合并通道来创建一个RGB图像
rgb_image = Image.merge("RGB", (red_channel, green_channel, blue_channel))
# 保存合并后的RGB图像
rgb_image.save("merged_rgb_image.jpg")
# 关闭输入图像
red_channel.close()
green_channel.close()
blue_channel.close()