PIL或Pillow学习2

news2025/2/22 19:27:59

接着学习下Pillow常用方法:

PIL_test1.py :
'''
9, Pillow图像降噪处理

由于成像设备、传输媒介等因素的影响,图像总会或多或少的存在一些不必要的干扰信息,我们将这些干扰信息统称为“噪声”,
比如数字图像中常见的“椒盐噪声”,指的是图像会随机出现的一些白、黑色的像素点。
图像噪声既影响了图像的质量,又妨碍人们的视觉观赏。因此,噪声处理是图像处理过程中必不可少的环节之一,
我们把处理图像噪声的过程称为“图像降噪”。

Pillow 通过 ImageFilter 类达到图像降噪的目的,该类中集成了不同种类的滤波器,
通过调用它们从而实现图像的平滑、锐化、边界增强等图像降噪操作。常见的降噪滤波器如下表所示:

图像降噪滤波器
名称    说明
ImageFilter.BLUR    模糊滤波,即均值滤波
ImageFilter.CONTOUR    轮廓滤波,寻找图像轮廓信息
ImageFilter.DETAIL    细节滤波,使得图像显示更加精细
ImageFilter.FIND_EDGES    寻找边界滤波(找寻图像的边界信息)
ImageFilter.EMBOSS    浮雕滤波,以浮雕图的形式显示图像
ImageFilter.EDGE_ENHANCE    边界增强滤波
ImageFilter.EDGE_ENHANCE_MORE    深度边缘增强滤波
ImageFilter.SMOOTH    平滑滤波
ImageFilter.SMOOTH_MORE    深度平滑滤波
ImageFilter.SHARPEN    锐化滤波
ImageFilter.GaussianBlur()    高斯模糊
ImageFilter.UnsharpMask()    反锐化掩码滤波
ImageFilter.Kernel()    卷积核滤波
ImageFilter.MinFilter(size)    最小值滤波器,从 size 参数指定的区域中选择最小像素值,然后将其存储至输出图像中。
ImageFilter.MedianFilter(size)    中值滤波器,从 size 参数指定的区域中选择中值像素值,然后将其存储至输出图像中。
ImageFilter.MaxFilter(size)    最大值滤波器
ImageFilter.ModeFilter()    模式滤波
'''
# 导入 ImageFilter类
from PIL import ImageFilter
# 1) 图像模糊处理
img_blur=img.filter(ImageFilter.BLUR)
#img_blur.show()
img_blur.save("C:/Users/86159/Desktop/py_workspace/myFlask/static/image/1_BLUR.png")
print('保存模糊处理后的图像')

# 2) 生成轮廓图
img_contour=img.filter(ImageFilter.CONTOUR)
#img_contour.show()
img_contour.save("C:/Users/86159/Desktop/py_workspace/myFlask/static/image/1_CONTOUR.png")
print('保存生成轮廓图后的图像')

# 3) 浮雕图
img_emboss=img.filter(ImageFilter.EMBOSS)
#img_emboss.show()
img_emboss.save("C:/Users/86159/Desktop/py_workspace/myFlask/static/image/1_EMBOSS.png")
print('保存生成浮雕图后的图像')

'''
10, Pillow图像颜色处理

Pillow 提供了颜色处理模块 ImageColor,该模块支持不同格式的颜色,
比如 RGB 格式的颜色三元组、十六进制的颜色名称(#ff0000)以及颜色英文单词("red")。
同时,它还可以将 CSS(层叠样式表,用来修饰网页)风格的颜色转换为 RGB 格式。

注意,在 ImageColor 模块对颜色的大小并不敏感,比如 "Red" 也可以写为 " red"。

颜色命名
ImageColor 支持多种颜色模式的的命名(即使用固定的格式对颜值进行表示),比如我们熟知的 RGB 色彩模式,
除此之外,还有 HSL (色调-饱和度-明度)、HSB (又称 HSV,色调-饱和度-亮度)色彩模式。下面对 HSL 做简单介绍:
H:即 Hue 色调,取值范围 0 -360,其中 0 表示“red”,120 表示 “green”,240 表示“blue”;
S:即 Saturation 饱和度,代表色彩的纯度,取值 0~100%,其中 0 代表灰色(gry),100% 表示色光最饱和;
L:即 Lightness 明度,取值为 0~100%,其中 0 表示“black”黑色,50% 表示正常颜色,100% 则表示白色。

下面使用 HSL 色彩模式表示红色,格式如下:
HSL(0,100%,50%)
此时的颜色为“纯红色”,等同于 RGB (255,0,0)。

ImageColor 模块比较简单,只提供了两个常用方法,分别是 getrgb() 和 getcolor() 函数。

1) getrgb()方法
顾名思义,该函数用来得到颜色的 RGB 值,语法格式如下:
PIL.ImageColor.getrgb(color)
'''
from PIL import ImageColor
# getrgb()方法
color1=ImageColor.getrgb("AliceBlue")
print(color1)
color2=ImageColor.getrgb('#FFEBCD')
print(color2)
#使用HSL模式红色
color3=ImageColor.getrgb('HSL(0,90%,60%)')
print(color3)

#使用new()绘制新的图像
img_new= Image.new("RGB", (100, 100), ImageColor.getrgb("#FFF0F5"))
#img_new.show()
img_new.save("C:/Users/86159/Desktop/py_workspace/myFlask/static/image/1_ImageColor.jpg")

'''
2) getcolor()
该方法与 getrgb() 类似,用来获取颜色值,不过它多了一个mode参数,因此该函数可以获取指定色彩模式的颜色值。
语法格式如下:
PIL.ImageColor.getcolor(color, mode)

参数说明如下:
color:一个颜色名称,字符串格式,可以是颜色的英文单词,或者十六进制颜色名。
    如果是不支持的颜色,会报 ValueError 错误;
mode:指定色彩模式,如果是不支持的模式,会报 KeyError 错误。
'''
color4=ImageColor.getcolor('#FFE4E1','L')
print(color4)
color5=ImageColor.getcolor('Blue','RGBA')
print(color5)

'''
11, Pillow为图片添加水印
为图片添加水印能够在一定程度上避免其他人滥用您的图片,这是保护图片版权的一种有效方式。

Pillow 库提供了添加水印的方法,操作简单,易学、易用。

我们知道,水印是附着在原图片上一段文字信息,因此添加水印的过程中会涉及两个问题:
第一、如何使文字信息附着在图片上;
第二、如何绘制文字信息。

Pillow 提供的ImageDraw和ImageFont模块成功解决了上述问题。

1) ImageDraw
PIL.ImageDraw 模块提供了一系列的绘图方法,通过该模块可以创建一个新的图形,
    或者在现有的图像上再绘制一个图形,从而起到对原图注释和修饰的作用。

draw = ImageDraw.Draw(img)
上述方法会返回一个 ImageDraw 对象,参数 img 表示 Image 对象。
这里我们可以把 Image 对象理解成画布,通过调用 ImageDraw 对象的一些方法,实现了在画布上绘制出新的图形目的。
ImageDraw 对象的常用方法如下表所示:

方法    说明
text    在图像上绘制文字
line    绘制直线、线段
eclipse    绘制椭圆形
rectangle    绘制矩形
polygon    绘制多边形

绘制矩形图的语法格式如下:
draw.rectangle(xy, fill=None, outline=None)

参数说明如下:
xy:元组参数值,以图像的左上角为坐标原点,表示矩形图的位置、图形大小的坐标序列,形如 ((x1,y1,x2,y2));
fill:矩形图的背景填充色;
outline:矩形图的边框线条颜色。
'''
from PIL import ImageDraw
#创建 Image 对象,当做背景图
img = Image.new('RGB',(200,200),color='GhostWhite')
#创建 ImageDraw 对象
draw = ImageDraw.Draw(img)
#以左上角为原点,绘制矩形。元组坐标序列表示矩形的位置、大小;fill设置填充色为红色,outline设置边框线为黑色
draw.rectangle((80,150,130,200),fill=(155,50,0,0),outline=(0,0,0,0))
#查看原图片
#img.show()
#保存图片
img.save("C:/Users/86159/Desktop/py_workspace/myFlask/static/image/1_rectangle.jpg")

'''
2) ImageFont
PIL.ImagreFont 模块通过加载不同格式的字体文件,从而在图像上绘制出不同类型的文字,
    比如 TrueType 和 OpenType 类型的字体。

创建字体对象的语法格式如下:
font = ImageFont.truetype(font='字体文件路径', size=字体大小)
如果想要在图片上添加文本,还需要使用 ImageDraw.text() 方法,语法格式如下:
d.text((x,y), "text", font, fill)
参数说明如下:
(x,y):图像左上角为坐标原点,(x,y) 表示添加文本的起始坐标位置;
text:字符串格式,要添加的文本内容;
font:ImageFont 对象;
fill:文本填充颜色。
'''
from PIL import ImageFont
#创建画布对象
draw = ImageDraw.Draw(img)
#加载计算机本地字体文件
font = ImageFont.truetype('C:/Windows/Fonts/Gabriola.ttf',size=48)
#在原图像上添加文本
draw.text(xy=(50,50),text='PandaCode',fill=(255,0,0),font=font)
#img.show()
img.save("C:/Users/86159/Desktop/py_workspace/myFlask/static/image/1_ImageFont.jpg")

'''
3) 添加图片水印
通过上述知识的学习,我们对ImageDraw和ImageFont模块有了大体的认识,并且也解决了如何给图片添加水印的两个关键问题。
'''
#字体
font=ImageFont.truetype('C:/Windows/Fonts/Gabriola.ttf',size=36)
#添加水印方法
def creating_watermark(img,text,font=font):
    #给水印添加透明度,因此需要转换图片的格式
    img_rgba=img.convert('RGBA')
    img_text_canvas=Image.new('RGBA',img_rgba.size,(255,255,255,0))
    print(img_rgba.size[0])
    draw = ImageDraw.Draw(img_text_canvas)
    #设置文本文字大小,并获取文字高宽值
    text_x_width,text_y_height = draw.textsize(text,font=font)
    print(text_x_width,text_y_height)
    #计算文字图层在原图坐标值(x,y)
    text_xy = (img_rgba.size[0] - text_x_width, img_rgba.size[1] - text_y_height)
    print('text_xy : ', text_xy)
    #设置文本颜色
    draw.text(text_xy,text,font=font,fill=(255,0,0))
    #将原图片与文字复合
    img_text=Image.alpha_composite(img_rgba,img_text_canvas)
    return  img_text

image = Image.open("C:/Users/86159/Desktop/py_workspace/myFlask/static/image/1.jpg")
#image.show()
image_water = creating_watermark(image,'PandaCode')
#image_water.show()
image_water.save("C:/Users/86159/Desktop/py_workspace/myFlask/static/image/1_PandaCode.png")

'''
12,  Pillow和ndarray数组
NumPy 是 Python 科学计算的基础数据包,它被大量的应用于机器学习领域,比如图像识别、自然语言处理、数据挖掘等。
ndarray 是 NumPy 中的数组类型,也称为 ndarray 数组,该数组可以与 Pillow 的 PIL.Image 对象实现相互转化。
'''
#使用numpy之前需要提前安装
import numpy as np

#1) ndarray 数组创建图像
#创建 300*300的图像,3个颜色通道
ndarray = np.zeros([300,300,3],dtype=np.uint8)
#rgb色彩模式
ndarray[:,:150]=[255,0,0]
ndarray[:,150:]=[255,255,0]
img_np = Image.fromarray(ndarray)
#img_np.show()
img_np.save("C:/Users/86159/Desktop/py_workspace/myFlask/static/image/1_ndarray_img.png")

#2) 图像转化为 ndarray 数组
# Image 图像转换为 ndarray 数组
img_ndarray = np.array(image)
print(img_ndarray)
# ndarray 转换为 Image 图像
ndarray_img = Image.fromarray(img_ndarray)
#显示图片
#ndarray_img.show()
#保存图片
ndarray_img.save("C:/Users/86159/Desktop/py_workspace/myFlask/static/image/1_image_ndarray_img.png")

'''
13, Pillow生成GIF动态图
GIF(Graphics Interchange Format,图形交换格式)是一种“位图”图像格式,它以.gif作为图像的扩展名。
GIF 图片非常适合在互联网中使用,这是因为它采用了图像预压缩技术,该技术的应用,
在一定程度上减少了图像传播、加载所消耗的时间。

与其他格式的图片相比,GIF 还有一项非常重要的应用,那就是生成动态图。
我们知道,Pillow 能够处理多种图像格式,包括 GIF 格式,它可以将静态格式图片(png、jpg)合成为 GIF 动态图。 
注意:Pillow 总是以灰度模式(L)或调色板模式(P)来读取 GIF 文件。
'''
#根据文件夹里的png图片生成gif动态图方法
def png_to_gif(png_path,gif_name):
    """png合成gif图像"""
    frames = []
    # 返回文件夹内的所有静态图的列表
    png_files = os.listdir(png_path)
    # 打印返回的列表
    print(png_files)
    # 读取文件内的静态图
    for pngf in png_files:
        if 'png' in pngf:
            frame = Image.open(os.path.join(png_path, pngf))
            frames.append(frame)
    # 以第一张图片作为开始,将后续n张图片合并成 gif 动态图
    # 参数说明:
    # save_all 保存图像;transparency 设置透明背景色;duration 单位毫秒,动画持续时间,
    # loop=0 无限循环;disposal=2 恢复原背景颜色。参数详细说明,请参阅官方文档,网址见文章末尾处。
    frames[0].save(gif_name,save_all=True,append_images=frames[1:],transparency=0,duration=1000,loop=0,disposal=2)
#调用函数,传入对应的参数
png_to_gif("C:/Users/86159/Desktop/py_workspace/myFlask/static/image","C:/Users/86159/Desktop/py_workspace/myFlask/static/image/1_PIL.gif")
image_gif = Image.open("C:/Users/86159/Desktop/py_workspace/myFlask/static/image/1_PIL.gif")
image_gif.show()

    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1031656.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

聊一聊Twitter的雪花算法

什么是Twitter的雪花算法方法? 这是一种在分布式系统中生成唯一ID的解决方案。Twitter在推文、私信、列表等方面使用这种方法。 •ID是唯一且可排序的•ID包含时间信息(按日期排序)•ID适用于64位无符号整数•仅包含数字值 符号位&#xff08…

芋道商城,基于 Vue + Uniapp 实现,支持分销、拼团、砍价、秒杀、优惠券、积分、会员等级、小程序直播、页面 DIY 等功能

商城简介 芋道商城,基于 芋道开发平台 构建,以开发者为中心,打造中国第一流的 Java 开源商城系统,全部开源,个人与企业可 100% 免费使用。 有任何问题,或者想要的功能,可以在 Issues 中提给艿艿…

【从0学习Solidity】 10. 控制流,用solidity实现插入排序

【从0学习Solidity】10. 控制流,用solidity实现插入排序 博主简介:不写代码没饭吃,一名全栈领域的创作者,专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构,分享一些项目实战经验以及前沿技术的见解。关…

python中的NaN在质量控制中怎么处理?

一、数据中的缺省值 气象数据中经常存在缺省值,比如未入库的站点数据、比如海温格点实况数据中的陆地区域。这些缺省值往往被赋予NaN(Not a Number,非数)。NaN是计算机科学中数值数据类型的一类值,表示未定义或不可表…

远程端点管理和安全性

当今的企业网络环境是一个分布式动态环境,其中有许多需要管理、验证和保护的移动部件,而不会对最终用户的生产力产生任何威慑力。提供有效的端点管理安全性,同时仍提供无缝最终用户体验的解决方案至关重要。 Endpoint Central 执行的活动可确…

Linux高性能服务器编程 学习笔记 第六章 高级IO函数

pipe函数用于创建一个管道,以实现进程间通信: fd参数是一个包含两个int的数组。该函数成功时返回0,并将一对打开的文件描述符填入其参数指向的数组,如果失败,则返回-1并设置errno。 pipe函数创建的这两个文件描述符f…

用Python爬取短视频列表

短视频是一款备受欢迎的短视频分享平台,每天都有大量精彩的视频内容等待我们去探索。在本文中,我们将分享如何使用Python爬取短视频的视频列表,让您能够发现更多有趣的视频。 一、安装必要的库 在开始之前,确保已安装以下库&…

Unity——对象池

对象池是一种朴素的优化思想。在遇到需要大量创建和销毁同类物体的情景时,可以考虑使用对象池技术优化游戏性能。 一、为什么要使用对象池 在很多类型的游戏中都会创建和销毁大量同样类型的物体。例如,飞行射击游戏中有大量子弹,某些动作游戏…

java用easyexcel按模版导出

首先在项目的resources下面建一个template包,之后在下面创建一个模版,模版格式如下: 名称为 financeReportBillStandardTemplateExcel.xlsx: {.fee}类型的属性值,是下面实体类的属性,要注意这里面的格式&a…

iPhone15拉胯,国产手机用折叠屏大反攻!

文 | 智能相对论 作者 | K星 iPhone偷懒式的15代机型发布,让市场大跌眼镜,虽然在莫名的宗教虔诚下依旧卖得很好,但苹果走下神坛之巅已经板上钉钉。 但是,苹果从最高处摔落,却依旧在神坛之上,iPhone15拉胯…

【STM32笔记】HAL库定时器捕获配置、操作及通用函数定义

【STM32笔记】HAL库定时器捕获配置、操作及通用函数定义 文章目录 定时器捕获设置输入捕获滤波器设置输入捕获极性设置输入捕获映射关系设置输入捕获分频器 定时器配置定时器捕获函数全局变量定时器回调和定时器捕获回调频率计算 附录:Cortex-M架构的SysTick系统定…

css自学框架之二级下拉菜单

下拉菜单是我们开发中最常见,最常用的,今天我们就自学二级下来菜单。首先看一下最终效果: 一、css代码 .arrow-down::before {content: ""; width: 10px;height: 10px;border: solid ;border-width: 2px 2px 0 0;border-color: …

BIGEMAP在土地规划中的应用

工具 Bigemap gis office地图软件 BIGEMAP GIS Office-全能版 Bigemap APP_卫星地图APP_高清卫星地图APP 1.使用软件一般都用于套坐标,比如我们常见的(kml shp CAD等土建规划图纸)以及一些项目厂区红线,方便于项目选址和居民建…

软考复习 -- 计算机网络

1 网络互连设备 物理层:中继器和集线器(多路中继器)数据链路层:网桥和交换机(多端口网桥)网络层:路由器应用层:网关 2 广播域和冲突域 3 协议簇 4 网际层协议 4 TCP和UDP 4.1 TC…

零基础学前端(五)HTML+CSS实战:模仿百度网站首页

1. 该篇适用于从零基础学习前端的小白 2. 初学者不懂代码得含义也要坚持模仿逐行敲代码,以身体感悟带动头脑去理解新知识 一、实战:将百度网站首页补全 上一篇零基础学前端(三)重点讲解 HTML-CSDN博客我们已经将顶部两侧内容已经…

人机交互——对话管理

​人机交互中的对话管理主要是指在人机交互过程中,对交互的对话内容和流程进行管理,以实现自然、流畅、高效的交互效果。对话管理包括对话状态追踪、对话策略优化等多个方面。 对话状态追踪是指对当前对话的状态进行跟踪,例如对用户输入的语…

Observability:检测 OpenTelemetry 的推荐指南

作者:Bahubali Shetti OpenTelemetry (OTel) 正在稳步获得广泛的行业采用。 作为主要的云原生计算基金会 (CNCF) 项目之一,其提交数量与 Kubernetes 一样多,它正在获得主要 ISV 和云提供商的支持,为该框架提供支持。 许多来自金融…

ChatGLM GPT原理介绍

图解GPT 除了BERT以外,另一个预训练模型GPT也给NLP领域带来了不少轰动,本节也对GPT做一个详细的讲解。 OpenAI提出的GPT-2模型(https://openai.com/blog/better-language-models/) 能够写出连贯并且高质量的文章,比之前语言模型效果好很多。GPT-2是基于Transformer搭建的,相…

【校招VIP】前端JS之深拷贝和浅拷贝

考点介绍 js中的浅拷贝和深拷贝,只是针对复杂数据类型(Objcet,Array)的复制问题。简单来讲浅拷贝和深拷贝都可以实现在原有对象的基础上再生成一份的作用。但是根据新生成的对象能否影响到原对象可以分为浅拷贝和深拷贝。 前端JS之深拷贝和浅拷贝-相关题…

ArcGIS 10.3软件安装包下载及安装教程!

【软件名称】:ArcGIS 10.3 【安装环境】:Windows 【下载链接 】: 链接:https://pan.baidu.com/s/1K5ab7IHMYa23HpmuPkFa1A 提取码:oxbb 复制这段内容后打开百度网盘手机App,操作更方便哦 软件解压码点击原文…