python图像处理基本操作总结(PIL库、Matplotlib及Numpy)
作者:全部梭哈一夜暴富 发布时间:2022-01-26 00:28:50
标签:python,图像,处理
一、PIL库对图像的基本操作
1、读取图片
PIL网上有很多介绍,这里不再讲解。直接操作,读取一张图片,将其转换为灰度图像,并打印出来。
from PIL import Image
import matplotlib.pyplot as plt
pil_im = Image.open("empire.jpeg")
pil_image = pil_im.convert("L")
plt.gray()
plt.imshow(pil_image)
plt.show()
输出如下所示:
2、转换图片格式
PIL可以将图像保存为多种格式,下面将PNG格式文件保存为JPG格式:
from PIL import Image
import glob
import os
filelist = glob.glob("E:/pythonProject1/filelist/*.png")
for infile in filelist:
outfile = os.path.splitext(infile)[0]+'.jpg'
if infile != outfile:
try:
Image.open(infile).save(outfile)
except IOError:
print("cannot convert", infile)
输出结果如下所示:
3、输出文件夹中所有图片的文件名列表
import os
def get_imlist(path):
"""返回目录中所有JPG图像的文件名列表"""
return [os.path.join(path,f)for f in os.listdir(path) if f.endswith('.jpg')]
print(get_imlist("E:/pythonProject1/filelist/"))
输出为文件名列表
二、Matplotlib
1、绘制图像、点和线
from PIL import Image
from pylab import *
#读取图像到数组中
im = array(Image.open("empire.jpeg"))
#绘制图像
imshow(im)
#一些点
x = [100, 100, 400, 400]
y = [200, 500, 200, 500]
#使用红色星状标记绘制点
plot(x, y)#默认为蓝色实线
# plot(x, y, 'r*')#红色星状标记
# plot(x, y, 'go-')#带有圆圈标记的绿线
# plot(x, y, 'ks')#带有正方形标记的黑色虚线
#绘制连接前三个点的线
plot(x[:3], y[:3])
axis('off')
#添加标题,显示绘制的图像
titles = ['empire']
plt.title = titles
show()
上面的代码首先绘制出原始图像,然后在 x 和 y 列表中给定点的 x 坐标和 y 坐标上绘制出红色星状标记点,最后在两个列表表示的前两个点之间绘制一条线段。该例子的绘制结果下图:
2、图像轮廓和直方图
绘制轮廓需要对每个坐标 [x, y] 的像素值施加同一个阈值,所以首先需要将图像灰度化,这里用 PIL 的 convert()
方法将图像转换成灰度图像。图像的直方图用来表征该图像像素值的分布情况。
from PIL import Image
from pylab import *
# 读取图像到数组中
im = array(Image.open("empire.jpeg").convert('L'))
#创建一个图像
figure()
#不使用颜色信息
gray()
#在原点的左上角显示轮廓图像
contour(im, origin = 'image')#检测图像轮廓
axis('equal')
axis('off')
show()
#新建一个图像
figure
hist(im.flatten(), 128)#绘制图像直方图
show()
图像轮廓图输出如下所示:
输出图像直方图如下所示:
3、交互式标注
在一幅图像中标记一些点,或者标注一些训练数据。PyLab
库中的 ginput()
函数就可以实现交互式标注。在图像点击三次,则程序会自动将这3个点的坐标点[x, y]保存到x列表里。
from PIL import Image
from pylab import *
im = array(Image.open("empire.jpeg"))
imshow(im)
print("please click 3 points")
x = ginput(3)
print("you clicked",x)
show()
三、Numpy
1、图像数组表示
对于图像数据,下面的例子阐述了这一点
from PIL import Image
import numpy as np
im = np.array(Image.open("empire.jpeg"))
print(im.shape,im.dtype)
输出为:
(1024, 683, 3) uint8
每行的第一个元组表示图像数组的大小(行、列、颜色通道),紧接着的字符串表示数组元素的数据类型。因为图像通常被编码成无符号八位整数(uint8),载入图像并将其转换到数组中,数组的数据类型为“uint8”。
2、灰度变换
对图像进行灰度变换,如下所示:
from PIL import Image
import numpy as np
im = np.array(Image.open("empire.jpeg"))
print(im.shape,im.dtype)
from PIL import Image
from matplotlib.pylab import plt
from numpy import *
im1 = array(Image.open('empire.jpeg').convert('L'))
im2 = 255 - im1 #对图像进行反向处理
im3 = (100.0/255) * im1 + 100 #将图像值变换到100-200之间
im4 = 255.0 * (im1/255) ** 2 #对图像像素值求平方后得到的图像
images = [im1, im2, im3, im4]
titles = ["f(x) = x", "f(x) = 255 - x", "f(x) = (100/255)*x +100", "f(x) = 255*(x/255)^2"]
#输出图中的最大像素值和最小像素值
print(int(im1.min()),int(im1.max()))
print(int(im2.min()),int(im2.max()))
print(int(im3.min()),int(im3.max()))
print(int(im4.min()),int(im4.max()))
for i in range(4):
plt.subplot(2, 2, i+1)#2行2列,按编号顺序排列
plt.imshow(images[i])#显示图像
plt.title(titles[i])#显示标题
plt.gray()
# plt.xticks([])
# plt.yticks([])
plt.axis('equal')
plt.axis('off')
plt.show()
输出接入如下所示:
总结
来源:https://blog.csdn.net/AI_girl/article/details/117566254


猜你喜欢
- 目录1 matplot入门指南2 安装与导入3 图的构成3 总结1 matplot入门指南matplotlib是Python科学计算中使用最
- 这篇文章主要介绍了python next()和iter()函数原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学
- 一、安装apt-get install mysql-server 需要设置账号密码apt-get isntall mysql-clienta
- 目录简述:实战案例:简述:关于敏感词过滤可以看成是一种文本反垃圾算法,例如 题目:敏感词文本文件 filtered_words.t
- 相信很多人都跟小编一样不管是什么账号,如果很久不用就会忘记登录密码,像数据库SQL Server2008也一样有用户名和登录密码,下面小编就
- 1 、据说python3就没有这个问题了2 、u'字符串' 代表是unicode格式的数据,路径最好写成这个格式,别直接跟字
- 1.确保系统中有依赖的libaio 软件,如果没有: yum -y
- 本文实例讲述了mysql索引基数概念与用法。分享给大家供大家参考,具体如下:Cardinality(索引基数)是mysql索引很重要的一个概
- 会用到的功能的简单介绍1、from bs4 import BeautifulSoup#导入库2、请求头herdersheaders={
- mitmproxy是一个支持HTTP和HTTPS的抓包程序,类似Fiddler、Charles的功能,只不过它通过控制台的形式操作。此外,m
- mysql脏页由于WAL机制,InnoDB在更新语句的时候,制作了写日志这一个磁盘操作,就是redo log,在内存写完redo log后,
- SQL 事件探查器数据列 SQL &
- 1、吃金币源码分享:import osimport cfgimport sysimport pygameimport randomfrom
- 这是LeetCode的第1668题:最大重复子字符串最大重复子字符串给你一个字符串 sequence ,如果字符串 wo
- 一些小技巧1. 如何查出效率低的语句?在MySQL下,在启动参数中设置 --log-slow-queries=[文件名],就可以在指定的日志
- 简单的‘Hello World!'Python命令行假设你已经安装好了Python, 那么在Linux命令行输入:$python将直
- useSSL=false和true的区别SSL(Secure Sockets Layer 安全套接字协议),在mysql进行连接的时候,如果
- 前言:今天就开始讲Python中的模块篇了,模块是Python的重要组成部分,Python之所以可以写出多种多样的程序,其实跟模块的灵活运用
- 对于商业数据库而言,数据库升级是一个优先级很高的事情,有版本升级路线图,有相应的补丁,而且对于方案还有一系列的演练,显然是一场硬仗。而在My
- 用的昨天刚接触到的库,在windows下通过paramiko来登录linux系统并执行了几个命令,基本算是初试成功,后面会接着学习的。代码: