python图像处理库(PILOpenCV)快速入门学习
文章目录
- PIL
- 基本操作
- 读取和创建
- 基本变换方法
- 图像处理
- 图像滤波
- 图像增强
- PIL与Numpy
- OpenCV-python库
- 读取操作
- 基本变换
- 图像处理
- 图像滤波
Python下可以进行图像处理的第三方库有很多:
最轻巧:PIL: https://pillow.readthedocs.io/en/latest/index.html
最全面:OpenCV: https://docs.opencv.org/4.x/d6/d00/tutorial_py_root.html
其他还有:matplotlib、scipy.misc、scikit-image等。
PIL
PIL库支持图像存储、显示和处理。几乎支持所有的图片格式 可以完成图像的缩放、裁剪、叠加以及向图像添加线条、图像和文字等操作。
PIL库中包含21个与图片相关的类:
最常用的有: Image,ImageEnhance,ImageFilter
基本操作
读取和创建
from PIL import Image
在PIL中,任何图像都可以用Image对象表示
方法 | 描述 |
---|---|
Image.open(filename,mode=‘r’) | 根据文件名读取图片 |
Image.new(mode,size color) | 根据给定参数创建一个新图像 |
Image.fromarray(obj, mode=None) | 从array数据创建图像 |
Image.show() | 显示图像 |
Image.save(fp,format=None) | 图像保存(可以完成格式转换) |
Image的属性
属性 | 描述 |
---|---|
Image.format | 图像格式 |
Image.filename | 图像的文件名或路径 |
Image.mode | 图像色彩模式,L为灰度,RGB为真彩 |
Image.size | 图像的宽和高,返回二元元组 |
读取序列图片(gif等):使用seek()和tell()方法
基本变换方法
方法 | 描述 | 参数解释 |
---|---|---|
Image.convert(mode) | 图像转换为新的模式 | mode=“L”或“RGB” 或“CMYK.” |
Image.thumbnail(size) | 创建缩略图 | szie-一个元组(长,宽) |
Image.rotate(angle) | 图像旋转 | angel-要旋转的角度 |
Image.resize(size) | 调整图像尺寸 | size-一个元组(长,宽) |
Image.crop(box) | 图像裁剪(ROI) | (left, upper, right, lower)-tuple |
Image.split() Image.merge(mode, bands) |
提取RGB每个颜色通道 合并通道 |
mode-图像色彩模式 band-通道(r,g,b) |
图像处理
图像处理(Image Processing)是指对图像进行分析、加工、和处理,使其满足视觉、心理或其他要求的技术。
图像滤波
图像滤波采用的是ImageFilter类,通过Image类的filter方法
def filter(self, filter):"""Filters this image using the given filter. For a list ofavailable filters, see the :py:mod:`~PIL.ImageFilter` module.:param filter: Filter kernel.:returns: An :py:class:`~PIL.Image.Image` object."""
imobj.filter(ImageFilter.xxx)
常用滤波函数:
方法 | 描述 |
---|---|
ImageFilter.BLUR | 模糊效果 |
ImageFilter.CONTOUR | 轮廓效果 |
ImageFilter.DETAL | 细节效果 |
ImageFilter.EDGE_ENHANCE | 边界加强效果 |
ImageFilter.SMOOTH | 平滑效果 |
ImageFilter.SHARPEN | 图像锐化 |
from PIL import ImageFilter,Image
imobj = Image.open("D:\image.jpg")
imobj.filter(ImageFilter.xxx)
图像增强
使用 ImageEhance 类,常用的方法有:
方法 | 描述 |
---|---|
ImageEhance.enhance(factor) | 对选择属性的数值增强factor倍 |
ImageEhanceColor(im) | 调整颜色平衡 |
ImageEhance.Contrast(im) | 调整对比度 |
ImageEhance.Brightness(im) | 调整亮度 |
ImageEhance.Sharpness(im) | 调整锐度 |
PIL与Numpy
PIL读取的图片是Image对象,不是Numpy矩阵,两者可以进行转化。
im=Image.open("D:\image.jpg") # 读取一张图片
print(im.shape) # 输出图片的尺寸
im_arr = np.array(im) # 将图片转化为numpy矩阵
print(im_arr.shape) # 输出此时的尺寸
(432,640)
(640,432,3)
注意图片转化为矩阵时,w和h通道会发生改变
OpenCV-python库
读取操作
读取图片:imread
cv2.imread(filename),读取的图像直接表示ndarray类型的三维矩阵,彩色图片的维度是(h,w,c)显示图片:imshow
cv2.imshow(window_name,img),需配合cv2.waitKey()才能显示
import cv2
im=cv2.imread("image.jpg")
cv2.imshow("win_image",im)
cv2.waitKey()
- 保存图片:imwriter
cv2.imwrite(filename,image) - 图像通道
用cv2打开的彩色三通道的通道顺序是BGR,而不是RGB。可以使用split()和merge()方法实现通道转换
im=cv2.imread('image.jpg')
b,g,r=cv2.split(im)
im2=cv2.merge((r,g,b))
cv2.imshow('ImWindow',im2)
cv2.waitKey()
基本变换
- 图像缩放:resize()
参数:
src: 输入图像对象
dsize:输出矩阵/图像的大小,为0时计算方式如下:dsize = Size(round(fxsrc.cols),round(fysrc.rows))
fx: 水平轴的缩放因子,为0时计算方式: (double)dsize.width/src.cols
fy: 垂直轴的缩放因子,为0时计算方式: (double)dsize.heigh/src.rows
interpolation:插值算法
cv2.INTER_NEAREST : 最近邻插值法
cv2.INTER_LINEAR 默认值,双线性插值法
cv2.INTER_AREA 基于局部像素的重采样(resampling using pixel area relation)。对于图像抽取(image decimation)来说,这可能是一个更好的方法。但如果是放大图像时,它和最近邻法的效果类似。
cv2.INTER_CUBIC 基于4x4像素邻域的3次插值法
cv2.INTER_LANCZOS4 基于8x8像素邻域的Lanczos插值
cv2.INTER_AREA 适合于图像缩小, cv2.INTER_CUBIC (slow) & cv2.INTER_LINEAR 适合于图像放大 - 颜色空间的转换:cv2.cvtColor()
参数: img: 图像对象
code:
cv2.COLOR_RGB2GRAY: RGB转换到灰度模式
cv2.COLOR_RGB2HSV: RGB转换到HSV模式(hue,saturation,Value)
cv2.COLOR_BGR2RGB:RGB通道转换
im=cv2.imread('image.jpg')
gray=cv2.cvtColor(im,COLOR_RGB2GRAY)
cv2.show('gray',gray)
cv2.waitKey()
- 图像阈值化:cv2.threshold()
有四个参数,第一个原图像,第二个进行分类的阈值,第三个是高于(低于)阈值时赋予的新值,第四个是一个方法选择参数,常用的有:
cv2.THRESH_BINARY(黑白二值)
cv2.THRESH_BINARY_INV(黑白二值反转)
cv2.THRESH_TRUNC (得到的图像为多像素值)
cv2.THRESH_TOZERO
cv2.THRESH_TOZERO_INV
返回两个值
ret:阈值
img:阈值化处理后的图像 - 旋转:cv2.getRotationMatrix2D()
参数:
center:旋转的中心点坐标
angle:旋转角度,单位为度数,证书表示逆时针旋转
scale:同方向的放大倍数
返回2*3的转变矩阵(浮点型) - 图像的矩阵变换:transpose()
OpenCV读入图片的矩阵格式是:(h, w, c)。 深度学习中,因为要对不同通道应用卷积,所以会采取另一种方式(c, h, w)
print(im.shape) # (326,220,3)
im=im.tanspose(2,0,1)
print(im.shape) # (3,326,222)
在深度学习搭建CNN时,往往要做相应的图像数据处理,比如图像要扩展维度,比如扩展成(batch_size,channels,height,width)
im=np.expand_dims(im,axis=0)
print(im.shape) #(1,3,326,220)
图像处理
图像滤波
参考链接:
http://c.biancheng.net/pillow/picture-format.html
https://www.cnblogs.com/silence-cho/p/10926248.html
https://blog.csdn.net/qq_36941368/article/details/82998296
python图像处理库(PILOpenCV)快速入门学习相关推荐
- Python图像处理库PIL从入门到精通
https://blog.csdn.net/column/details/pythonpil.html 示例: from PIL import Image import pytesseractpyte ...
- python多久能上手_小白学习Python,怎样能够快速入门上手
原标题:小白学习Python,怎样能够快速入门上手 时至今日,Python已经成为最受欢迎的编程语言之一,清晰易读,适用广泛.在TIOBE 排行榜中位居第四,成为名副其实的人工智能第一语言. 那么零基 ...
- Python图像处理库PIL -- 学习资源
Resources 官方指南PIL Handbook(建议看英文,翻译) pil下载 安装中文指南 from the PythonWare PIL home page 推荐先看Python Imagi ...
- python符号格式化设置区间_Python 数值区间处理_对interval 库的快速入门详解
使用 Python 进行数据处理的时候,常常会遇到判断一个数是否在一个区间内的操作.我们可以使用 if else 进行判断,但是,既然使用了 Python,那我们当然是想找一下有没有现成的轮子可以用. ...
- Python 快速入门学习
Python 快速入门学习 python的基本语法 1.1 变量 1.12 如何定义变量 1.13 输出一个变量 1.14 变量的数据类型 1.15 变量的运算 1.16 变量的输入 1.17 变量的 ...
- python编程基础语法-Python编程基础语法快速入门
1. 课程咨询加老师助理微信:助理1微信: chenjinglei88 ,助理2微信: omf6757 2. 决定购买并想得到陈敬雷老师亲自指导(课程或自己项目难题均可)加老师微信: chenjing ...
- pdf python 3.7编程快速入门 潘中强_无python基础,这些书籍可以帮您快速入门。
利用Python进行数据分析> 定 价:119 元 作者:韦斯·麦金尼(Wes McKinney)著;徐敬一译 ISBN:9787111603702 出 版 社:机械工业出版社 学习Python ...
- python基础教程:Python图像处理库PIL中图像格式转换的实现
这篇文章主要介绍了Python图像处理库PIL中图像格式转换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 在数字图像处理 ...
- python编程语法教程-Python编程基础语法快速入门
1. 课程咨询加老师助理微信:助理1微信: chenjinglei88 ,助理2微信: omf6757 2. 决定购买并想得到陈敬雷老师亲自指导(课程或自己项目难题均可)加老师微信: chenjing ...
- 跟我学Python图像处理丨带你入门OpenGL
摘要:介绍Python和OpenGL的入门知识,包括安装.语法.基本图形绘制等. 本文分享自华为云社区<[Python图像处理] 二十七.OpenGL入门及绘制基本图形(一)>,作者:ea ...
最新文章
- php如何添加超链接,如何使用phpcms添加超链接
- 他保送北大、读完博士选择回中学任教,“做科研太枯燥,自己更适合教书”...
- Prim算法生成迷宫
- java 实现HTTP连接(HTTPClient)
- python可以干什么工作-Python学完工作不好找?看看数据分析可视化都可以做什么...
- SpringBoot WebSocket Stomp
- PHP面试题:mysql_fetch_row() 和mysql_fetch_array之间有什么区别?
- 芋道 Spring Boot 自动配置原理
- thinkPHP 数据库操作和分页类
- 40个问题让你快速掌握Java多线程的精髓
- java移动接口发短信_天天都会写接口,但它的用途和好处有多少人能说得清楚?...
- uc浏览器手机模拟_UC、华为、OPPO等8款手机浏览器被重点集中整治!原因是.........
- 2019年安大计算机专业分数线,2019年安徽
- this与$(this)的区别
- Java 8 lambda初试
- js html实体编码转换,字符串js编码转换成实体html编码的方法(防范XSS攻击)
- 三菱PLC控制步进电机
- 启动Kettle时报错找不到文件javaw.exe
- Android Camera2 实现连拍
- 1991【19CSPS提高组】树的重心 信奥赛Kirito(本人)