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实现socket客户端和服务端简单示例
Feb 24 Python
python实现斐波那契递归函数的方法
Sep 08 Python
Python的Flask开发框架简单上手笔记
Nov 16 Python
Python tkinter事件高级用法实例
Jan 31 Python
人生苦短我用python python如何快速入门?
Mar 12 Python
详谈套接字中SO_REUSEPORT和SO_REUSEADDR的区别
Apr 28 Python
基于python的socket实现单机五子棋到双人对战
Mar 24 Python
python3中eval函数用法使用简介
Aug 02 Python
Python 矩阵转置的几种方法小结
Dec 02 Python
Python 面向对象之类class和对象基本用法示例
Feb 02 Python
自定义实现 PyQt5 下拉复选框 ComboCheckBox的完整代码
Mar 30 Python
Python基于Serializer实现字段验证及序列化
Nov 04 Python
Python Pytorch查询图像的特征从集合或数据库中查找图像
Python实现科学占卜 让视频自动打码
Python自动化工具之实现Excel转Markdown表格
Python加密技术之RSA加密解密的实现
Apr 08 #Python
Python识别花卉种类鉴定网络热门植物并自动整理分类
请求模块urllib之PYTHON爬虫的基本使用
用Python仅20行代码编写一个简单的端口扫描器
You might like
收听困难?教您超简便短波广播抗干扰方法!
2021/03/01 无线电
安健A254立体声随身听的分析与打磨
2021/03/02 无线电
php面向对象全攻略 (四)构造方法与析构方法
2009/09/30 PHP
PHP cdata 处理(详细介绍)
2013/07/05 PHP
Yii框架视图、视图布局、视图数据块操作示例
2019/10/14 PHP
网页中的图片的处理方法与代码
2009/11/26 Javascript
jquery multiSelect 多选下拉框
2010/07/09 Javascript
js实现两个值相加alert出来精确到指定位
2013/09/25 Javascript
JS随机漂浮广告代码具体实例
2013/11/19 Javascript
无闪烁更新网页内容JS实现
2013/12/19 Javascript
原生js编写设为首页兼容ie、火狐和谷歌
2014/06/05 Javascript
vue动态禁用控件绑定disable的例子
2019/10/28 Javascript
Javascript中的this,bind和that使用实例
2019/12/05 Javascript
JavaScript图片旋转效果实现方法详解
2020/06/28 Javascript
[01:25]2015国际邀请赛最佳短片奖——斧王《拆塔英雄:天赋异禀》
2015/09/22 DOTA
[58:09]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第三场 6.2
2018/06/03 DOTA
python下调用pytesseract识别某网站验证码的实现方法
2016/06/06 Python
通过Python 接口使用OpenCV的方法
2018/04/02 Python
Flask框架URL管理操作示例【基于@app.route】
2018/07/23 Python
聊聊python里如何用Borg pattern实现的单例模式
2019/06/06 Python
python绘制已知点的坐标的直线实例
2019/07/04 Python
Python多线程及其基本使用方法实例分析
2019/10/29 Python
基于plt.title无法显示中文的快速解决
2020/05/16 Python
python怎么调用自己的函数
2020/07/01 Python
CSS3 滤镜 webkit-filter详细介绍及使用方法
2012/12/27 HTML / CSS
公司营业员的工作总结自我评价
2013/10/05 职场文书
小班幼儿评语大全
2014/04/30 职场文书
人民调解员先进事迹材料
2014/05/08 职场文书
校园标语大全
2014/06/19 职场文书
真诚的求职信
2014/07/04 职场文书
亲子运动会的活动方案
2014/08/17 职场文书
群众路线对照检查材料思想汇报怎么写
2014/09/18 职场文书
2015年先进个人自荐书
2015/03/24 职场文书
关于ObjectUtils.isEmpty() 和 null 的区别
2022/02/28 Java/Android
Python写情书? 10行代码展示如何把情书写在她的照片里
2022/04/21 Python