基础学习笔记python图像处理基础学习笔记————可视化工具合集
三种图像
每一副图像都可以用一个矩阵表示,三种图像的差别是需要的矩阵的数量的差别
- 单通道图:需要1个矩阵,每个像素点用1个值表示
- 三通道图:需要3个矩阵,每个像素点用3个值表示,分别代表红绿蓝(RGB)
- 三通道图:需要4个矩阵,每个像素点用4个值表示,除RGB外还有透明度(alpha)进行表示
图片读取展示和写出(OpenCV方式)
import numpy as np
from PIL import Image
import cv2
import matplotlib.pyplot as plt
img=cv2.imread("lena.jpg",cv2.IMREAD_GRAYSCALE)
print(img)
height,width=img.shape
channels=1
print('{},{},{}'.format(height,width,channels))
cv2.imshow("IMG",img)
while(cv2.waitKey(0)=="P"):
pass
cv2.imread函数解释
使用cv2.imread()函数读取图像.图像应该当前路径下,或者给出完整的图像路径。第二个参数是一个标识,它用来指定图像的读取方式
第二个参数如下(找个参数可以省略):
- cv2.IMREAD_COLOR : 默认使用该种标识.加载一张彩色图片,忽视它的透明度。
- cv2.IMREAD_GRAYSCALE : 加载一张灰度图
- cv2.IMREAD_UNCHANGED : 加载图像,包括它的Alpha通道
cv2.imshow函数解释
cv2.imshow()函数需要两个输入,一个是图像窗口的名字即title,一个是所展示图片的像素值矩阵
cv2.waitkey()函数解释
waitKey(delay=None)函数的功能是不断刷新图像,频率时间为delay,单位为ms,返回值为当前键盘按键值,当delay=0时则代表无限时间
cv2.imwrite函数解释
retval = cv2.imwrite(filename, img [, paras])
参数说明:
-
filename:要保存的文件的路径和名称,包括文件扩展名
-
img:要保存的 OpenCV 图像,nparray 多维数组
-
paras:不同编码格式的参数,可选项
- cv2.CV_IMWRITE_JPEG_QUALITY:设置 .jpeg/.jpg 格式的图片质量,取值为 0-100(默认值 95),数值越大则图片质量越高;
- cv2.CV_IMWRITE_WEBP_QUALITY:设置 .webp 格式的图片质量,取值为 0-100;
- cv2.CV_IMWRITE_PNG_COMPRESSION:设置 .png 格式图片的压缩比,取值为 0-9(默认值 3),数值越大则压缩比越大。
-
retval:返回值,保存成功返回 True,否则返回 False
matplotlib.pyplot画图
基础用法
import matplotlib.pyplot as plt
import numpy as np
xpoints = np.array([0, 6])
ypoints = np.array([0, 100])
plt.plot(xpoints, ypoints)
plt.show()
格式
# 画单条线
plot([x], y, [fmt], *, data=None, **kwargs)
# 画多条线
plot([x], y, [fmt], [x2], y2, [fmt2], ..., **kwargs)
fmt(是一个字符串)解释:
- 颜色字符:‘b’ 蓝色,‘m’ 洋红色,‘g’ 绿色,‘y’ 黄色,‘r’ 红色,‘k’ 黑色,‘w’ 白色,‘c’ 青绿色,‘#008000’ RGB 颜色符串。多条曲线不指定颜色时,会自动选择不同颜色。
- 线型参数:‘‐’ 实线,‘‐‐’ 破折线,‘‐.’ 点划线,‘:’ 虚线。
- 标记字符:‘.’ 点标记,‘,’ 像素标记(极小点),‘o’ 实心圈标记,‘v’ 倒三角标记,‘^’ 上三角标记,‘>’ 右三角标记,‘<’ 左三角标记…
绘图标记
maker范例
import matplotlib.pyplot as plt
import numpy as np
ypoints = np.array([1,3,4,5,8,9,6,1,3,4,5,2,4])
plt.plot(ypoints, marker = 'o')
plt.show()
fmt
fmt 参数定义了基本格式,如标记、线条样式和颜色
fmt = '[marker][line][color]'
标记大小与颜色
- markersize,简写为 ms:定义标记的大小。
- markerfacecolor,简写为 mfc:定义标记内部的颜色。
- markeredgecolor,简写为 mec:定义标记边框的颜色。
绘图线
范例:
import matplotlib.pyplot as plt
import numpy as np
ypoints = np.array([6, 2, 13, 10])
plt.plot(ypoints, linestyle = 'dotted')
plt.show()
轴标签
import numpy as np
import matplotlib.pyplot as plt
x = np.array([1, 2, 3, 4])
y = np.array([1, 4, 9, 16])
plt.plot(x, y)
plt.xlabel("x - label")
plt.ylabel("y - label")
plt.show()
标题
import numpy as np
import matplotlib.pyplot as plt
x = np.array([1, 2, 3, 4])
y = np.array([1, 4, 9, 16])
plt.plot(x, y)
plt.title("RUNOOB TEST TITLE")
plt.xlabel("x - label")
plt.ylabel("y - label")
plt.show()
网格线
import numpy as np
import matplotlib.pyplot as plt
x = np.array([1, 2, 3, 4])
y = np.array([1, 4, 9, 16])
plt.title("RUNOOB grid() Test")
plt.xlabel("x - label")
plt.ylabel("y - label")
plt.plot(x, y)
plt.grid()
plt.show()
绘制多图
subplot介绍
subplot(nrows, ncols, index, **kwargs)
subplot(pos, **kwargs)
subplot(**kwargs)
subplot(ax)
以上函数将整个绘图区域分成nrows行和ncols列,然后从左到右,从上到下的顺序对每个子区域进行编号1…N,左上的子区域的编号为1,右下的区域编号为N,编号可以通过参数index来设置
范例
import matplotlib.pyplot as plt
import numpy as np
#plot 1:
x = np.array([0, 6])
y = np.array([0, 100])
plt.subplot(2, 2, 1)
plt.plot(x,y)
plt.title("plot 1")
#plot 2:
x = np.array([1, 2, 3, 4])
y = np.array([1, 4, 9, 16])
plt.subplot(2, 2, 2)
plt.plot(x,y)
plt.title("plot 2")
#plot 3:
x = np.array([1, 2, 3, 4])
y = np.array([3, 5, 7, 9])
plt.subplot(2, 2, 3)
plt.plot(x,y)
plt.title("plot 3")
#plot 4:
x = np.array([1, 2, 3, 4])
y = np.array([4, 5, 6, 7])
plt.subplot(2, 2, 4)
plt.plot(x,y)
plt.title("plot 4")
plt.suptitle("RUNOOB subplot Test")
plt.show()
散点图柱形图饼图
scatter
bar
pie
具体语句参考网站
visdom
开启visdom命令
python3 -m visdom.server
visdom基础范例(text,image)
import visdom
import numpy as np
vis = visdom.Visdom(env='test')
# 设置环境窗口的名称,如果不设置名称就默认为main
vis.text('test', win='test1')
# 使用文本输出
vis.image(np.ones((3, 100, 100)))
# 绘制一幅尺寸为3 * 100 * 100的图片,图片的像素值全部为1
visdom.Visdom(env=‘命名新环境’)
vis.text(‘文本’, win=‘窗口名’)
vis.image(‘图片’,win=‘窗口名’)
visdom画线(line)
1条线
import visdom
import numpy as np
vis = visdom.Visdom(env='my_windows')
x = list(range(10))
y = list(range(10))
# 使用line函数绘制直线 并选择显示坐标轴
vis.line(X=np.array(x), Y=np.array(y), opts=dict(showlegend=True))
vis.line([x], [y], opts=dict(showlegend=True))
2条线
import visdom
import numpy as np
vis = visdom.Visdom(env='my_windows')
x = list(range(10))
y = list(range(10))
z = list(range(1,11))
vis.line(X=np.array(x), Y=np.column_stack((np.array(y), np.array(z))), opts=dict(showlegend=True))
vis.line([x], [y=np.column_stack((np.array(y),np.array(z),np.array(还可以增加)))])
np.column_stack(a,b), 表示两个矩阵按列合并
sinx曲线
import visdom
import torch
vis = visdom.Visdom(env='sin')
x = torch.arange(0, 100, 0.1)
y = torch.sin(x)
vis.line(X=x,Y=y,win='sin(x)',opts=dict(showlegend=True))
持续更新图表
import visdom
import numpy as np
vis = visdom.Visdom(env='my_windows')
# 利用update更新图像
x = 0
y = 0
my_win = vis.line(X=np.array([x]), Y=np.array([y]), opts=dict(title='Update'))
for i in range(10):
x += 1
y += i
vis.line(X=np.array([x]), Y=np.array([y]), win=my_win, update='append')
append:追加数据
replace:替换数据
remove:移除更新
绘制图像(images)
import visdom
import torch
# 新建一个连接客户端
vis = visdom.Visdom(env='test1')
# 绘制正弦函数
x = torch.arange(1, 100, 0.01)
y = torch.sin(x)
vis.line(X=x,Y=y, win='sinx',opts={'title':'y=sin(x)'})
# 绘制36张图片随机的彩色图片
vis.images(torch.randn(36,3,64,64).numpy(),nrow=6, win='imgs',opts={'title':'imgs'})
实例:绘制loss函数的变化趋势
# 绘制loss变化趋势
# 参数一为Y轴的值,参数二为X轴的值,参数三为窗体名称,参数四为表格名称,参数五为更新选项
# 从第二个点开始可以更新
vis.line(Y=np.array([totalloss.item()]), X=np.array([traintime]),
win=('train_loss'),
opts=dict(title='train_loss'),
update=None if traintime == 0 else 'append'
)