python图像处理 PIL Image操作实例


Posted in Python onApril 09, 2022

1. 图片加载、灰度图、 显示和保存

from PIL import Image

img = Image.open('01.jpg')
imgGrey = img.convert('L')

img.show()
imgGrey.show()

img.save('img_copy.jpg')
imgGrey.save('img_gray.jpg')

2. 图片宽、高、通道模式、平均值获取

from PIL import Image
import numpy as np

img = Image.open('01.jpg')

width, height = img.size
channel_mode = img.mode
mean_value = np.mean(img)

print(width)
print(height)
print(channel_mode)
print(mean_value)

3. 创建指定大小,指定通道类型的空图像

from PIL import Image

width = 200
height = 100

img_white = Image.new('RGB', (width,height), (255,255,255))
img_black = Image.new('RGB', (width,height), (0,0,0))
img_L = Image.new('L', (width, height), (255))

img_white.show()
img_black.show()
img_L.show()

4. 访问和操作图像像素

from PIL import Image

img = Image.open('01.jpg')

width, height = img.size

# 获取指定坐标位置像素值
pixel_value = img.getpixel((width/2, height/2))
print(pixel_value)

# 或者使用load方法
pim = img.load()
pixel_value1 = pim[width/2, height/2]
print(pixel_value1)

# 设置指定坐标位置像素的值
pim[width/2, height/2] = (0, 0, 0)

# 或使用putpixel方法
img.putpixel((w//2, h//2), (255,255,255))

# 设置指定区域像素的值
for w in range(int(width/2) - 40, int(width/2) + 40):
for h in range(int(height/2) - 20, int(height/2) + 20):
pim[w, h] = (255, 0, 0)
# img.putpixel((w, h), (255,255,255))
img.show()

5. 图像通道分离和合并

from PIL import Image

img = Image.open('01.jpg')

# 通道分离
R, G, B = img.split()

R.show)
G.show()
B.show()

# 通道合并
img_RGB = Image.merge('RGB', (R, G, B))
img_BGR = Image.merge('RGB', (B, G, R))
img_RGB.show()
img_BGR.show()

6. 在图像上输出文字

from PIL import Image, ImageDraw, ImageFont

img = Image.open('01.jpg')

# 创建Draw对象:
draw = ImageDraw.Draw(img)
# 字体颜色
fillColor = (255, 0, 0)

text = 'print text on PIL Image'
position = (200,100)

draw.text(position, text, fill=fillColor)
img.show()

7. 图像缩放

from PIL import Image

img = Image.open('01.jpg')

width, height = img.size

img_NEARESET = img.resize((width//2, height//2)) # 缩放默认模式是NEARESET(最近邻插值)
img_BILINEAR = img.resize((width//2, height//2), Image.BILINEAR) # BILINEAR 2x2区域的双线性插值
img_BICUBIC = img.resize((width//2, height//2), Image.BICUBIC) # BICUBIC 4x4区域的双三次插值
img_ANTIALIAS = img.resize((width//2, height//2), Image.ANTIALIAS) # ANTIALIAS 高质量下采样滤波

8. 图像遍历操作

from PIL import Image

img = Image.open('01.jpg').convert('L')

width, height = img.size

pim = img.load()

for w in range(width):
for h in range(height):
if pim[w, h] > 100:
img.putpixel((w, h), 255)
# pim[w, h] = 255
else:
img.putpixel((w, h), 0)
# pim[w, h] = 0

img.show()

9. 图像阈值分割、 二值化

from PIL import Image

img = Image.open('01.jpg').convert('L')

width, height = img.size

threshold = 125

for w in range(width):
for h in range(height):
if img.getpixel((w, h)) > threshold:
img.putpixel((w, h), 255)
else:
img.putpixel((w, h), 0)

img.save('binary.jpg')

10. 图像裁剪

from PIL import Image

img = Image.open('01.jpg')

width, height = img.size

# 前两个坐标点是左上角坐标
# 后两个坐标点是右下角坐标
# width在前, height在后
box = (100, 100, 550, 350)

region = img.crop(box)

region.save('crop.jpg')

11. 图像边界扩展

# 边界扩展
from PIL import Image

img = Image.open('test.png')

width, height = img.size
channel_mode = img.mode

img_makeBorder_full = Image.new(channel_mode, (2*width, height))
img_makeBorder_part = Image.new(channel_mode, (width+200, height))

# 图像水平扩展整个图像
img_makeBorder_full.paste(img, (0, 0, width, height))
img_makeBorder_full.paste(img, (width, 0, 2*width, height))

# 前两个坐标点是左上角坐标
# 后两个坐标点是右下角坐标
# width在前, height在后
box = (width-200, 0, width, height)
region = img.crop(box)

# 图像水平右侧扩展一个ROI
img_makeBorder_part.paste(img, (0, 0, width, height))
img_makeBorder_part.paste(region, (width, 0, width+200, height))
img_makeBorder_part.show()
img_makeBorder_full.show()

12. PIL.Image 和 numpy 格式相互转换

from PIL import Image
import numpy as np

img = Image.open('01.jpg')

array = np.array(img) # PIL.Image 转 numpy

img1 = Image.fromarray(array) # numpy转 PIL.Image
img1 = Image.fromarray(array.astype('uint8'))

img1.save('from_array.jpg')
Python 相关文章推荐
python字典序问题实例
Sep 26 Python
在Docker上部署Python的Flask框架的教程
Apr 08 Python
Python中类的定义、继承及使用对象实例详解
Apr 30 Python
python压缩文件夹内所有文件为zip文件的方法
Jun 20 Python
Python math库 ln(x)运算的实现及原理
Jul 17 Python
Python3从零开始搭建一个语音对话机器人的实现
Aug 23 Python
Python 私有化操作实例分析
Nov 21 Python
python实现超市商品销售管理系统
Nov 22 Python
python系统指定文件的查找只输出目录下所有文件及文件夹
Jan 19 Python
python实现手势识别的示例(入门)
Apr 15 Python
python 实现图像快速替换某种颜色
Jun 04 Python
浅谈Python列表嵌套字典转化的问题
Apr 07 Python
Python Pytorch查询图像的特征从集合或数据库中查找图像
Python实现科学占卜 让视频自动打码
Python自动化工具之实现Excel转Markdown表格
Python加密技术之RSA加密解密的实现
Apr 08 #Python
Python识别花卉种类鉴定网络热门植物并自动整理分类
请求模块urllib之PYTHON爬虫的基本使用
用Python仅20行代码编写一个简单的端口扫描器
You might like
CI框架开发新浪微博登录接口源码完整版
2014/05/28 PHP
tbody元素支持嵌套的注意方法
2007/03/24 Javascript
jQuery 注意事项 与原因分析
2009/04/24 Javascript
用JQUERY增删元素的代码
2012/02/14 Javascript
css transform 3D幻灯片特效实现步骤解读
2013/03/27 Javascript
JavaScript获取并更改input标签name属性的方法
2015/07/02 Javascript
js实现的二级横向菜单条实例
2015/08/22 Javascript
AngularJS入门教程之Scope(作用域)
2016/07/27 Javascript
Js 获取、判断浏览器版本信息的简单方法
2016/08/08 Javascript
js 模仿锚点定位的实现方法
2016/11/19 Javascript
图解Javascript——作用域、作用域链、闭包
2017/03/21 Javascript
Vue2.0实现将页面中表格数据导出excel的实例
2017/08/09 Javascript
jQuery中extend函数简单用法示例
2017/10/11 jQuery
详解vue组件中使用路由方法
2019/02/12 Javascript
深入理解JavaScript 箭头函数
2019/05/30 Javascript
Vue编程式跳转的实例代码详解
2019/07/10 Javascript
深入学习Vue nextTick的用法及原理
2019/10/08 Javascript
JavaScript实现指定数量的并发限制的示例代码
2020/03/10 Javascript
使用python编写脚本获取手机当前应用apk的信息
2014/07/21 Python
virtualenv实现多个版本Python共存
2017/08/21 Python
python 将md5转为16字节的方法
2018/05/29 Python
Django之Mode的外键自关联和引用未定义的Model方法
2018/12/15 Python
Python操作redis实例小结【String、Hash、List、Set等】
2019/05/16 Python
关于Python内存分配时的小秘密分享
2019/09/05 Python
基于YUV 数据格式详解及python实现方式
2019/12/09 Python
python操作cfg配置文件方式
2019/12/22 Python
快速查找Python安装路径方法
2020/02/06 Python
Tensorflow 定义变量,函数,数值计算等名字的更新方式
2020/02/10 Python
Python3标准库glob文件名模式匹配的问题
2020/03/13 Python
Python 连接 MySQL 的几种方法
2020/09/09 Python
linux mint中搜狗输入法导致pycharm卡死的问题
2020/10/28 Python
selenium+headless chrome爬虫的实现示例
2021/01/08 Python
美国嘻哈首饰购物网站:Hip Hop Bling
2016/12/30 全球购物
物理系毕业生自荐信
2013/11/01 职场文书
文明美德伴我成长演讲稿
2014/05/12 职场文书
Java图书管理系统,课程设计必用(源码+文档)
2021/06/30 Java/Android