PIl图像处理的常见操作

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()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值