Python PIL实现图片特效:黑白、流年、旧电影
119 浏览量
更新于2024-08-29
收藏 234KB PDF 举报
本文介绍了如何使用Python的PIL(Python Imaging Library)库和numpy库来实现一些基本的图片特效,包括彩色转黑白、流年效果以及旧电影效果。通过将图片转换为RGB矩阵,可以对每个像素的红绿蓝通道进行单独操作,从而实现各种图像处理效果。
在Python中,PIL库用于处理图像,而numpy库则用于进行高效的矩阵运算。首先,我们需要导入这两个库:
```python
import numpy as np
from PIL import Image
```
接着,我们可以读取图片并将其转换为RGB模式:
```python
im = Image.open(imagename).convert('RGB')
arr = np.array(im)
```
`arr`现在是一个三维数组,其形状为`(长, 宽, 3)`,其中长和宽分别代表图片的像素长度和宽度,而3表示RGB三个颜色通道。
每个像素由一个包含R、G、B三个值的元组表示,这些值都是0到255之间的无符号整数。例如:
```python
print(arr[0][0])
```
这将输出一个形如`array([R, G, B], dtype=uint8)`的结果,表示第一个像素的RGB值。
接下来,我们介绍三种图片特效的实现:
1. 彩色转黑白:根据YUV色彩空间中的公式,将每个像素的R、G、B值转换为灰度值,即`Y = 0.299R + 0.587G + 0.114B`。这个转换可以通过numpy的矩阵乘法完成:
```python
def blackWhite(imagename):
im = np.asarray(Image.open(imagename).convert('RGB'))
trans = np.array([[0.299, 0.587, 0.114], [0.299, 0.587, 0.114], [0.299, 0.587, 0.114]]).transpose()
im = np.dot(im, trans)
return Image.fromarray(np.array(im).astype('uint8'))
```
2. 流年效果:此效果是通过对R通道的值进行平方根运算,然后乘以一个参数,模拟图像老化的感觉:
```python
def fleeting(imagename, params=12):
im = np.asarray(Image.open(imagename).convert('RGB'))
im1 = np.sqrt(im * [1.0, 0.0, 0.0]) * params
im2 = im * [0.0, 1.0, 1.0]
im = im1 + im2
return Image.fromarray(np.array(im).astype('uint8'))
```
3. 旧电影效果:模拟旧照片的效果,通过调整R、G、B通道的权重,使得某些像素的总和超过255时,将其设为255:
```python
def oldFilm(imagename):
im = np.asarray(Image.open(imagename).convert('RGB'))
params = [1.1, 0.9, 1.2] # 可以调整这些参数来改变效果
im = (im * np.array(params)).sum(axis=2)
im[im > 255] = 255
return Image.fromarray(np.array(im).astype('uint8'))
```
以上代码实现了三种不同的图片特效,每种效果都是通过对图片像素的RGB值进行操作来实现的。通过调整参数,可以创造出更多变的视觉效果。
2022-03-09 上传
2022-07-26 上传
点击了解资源详情
点击了解资源详情
2013-01-23 上传
2023-03-14 上传
2018-03-05 上传
2023-09-22 上传
2021-12-01 上传
weixin_38556394
- 粉丝: 7
- 资源: 896
最新资源
- 火炬连体网络在MNIST的2D嵌入实现示例
- Angular插件增强Application Insights JavaScript SDK功能
- 实时三维重建:InfiniTAM的ros驱动应用
- Spring与Mybatis整合的配置与实践
- Vozy前端技术测试深入体验与模板参考
- React应用实现语音转文字功能介绍
- PHPMailer-6.6.4: PHP邮件收发类库的详细介绍
- Felineboard:为猫主人设计的交互式仪表板
- PGRFileManager:功能强大的开源Ajax文件管理器
- Pytest-Html定制测试报告与源代码封装教程
- Angular开发与部署指南:从创建到测试
- BASIC-BINARY-IPC系统:进程间通信的非阻塞接口
- LTK3D: Common Lisp中的基础3D图形实现
- Timer-Counter-Lister:官方源代码及更新发布
- Galaxia REST API:面向地球问题的解决方案
- Node.js模块:随机动物实例教程与源码解析