图像可视化
matplotlib
官网地址 :点击跳转
1、折线图
import numpy as np
import matplotlib.pyplot as pltx = np.arange(-10, 10, 0.5)
y1 = np.sin(x)
y2 = np.cos(x)plt.plot(x, y1, label='y1', color='r', marker='*', linestyle='-')
plt.plot(x, y2, label='y2', color='b', marker='o', linestyle='--')
plt.legend(loc='upper left') # 添加图例,放在左上角位置
plt.show()
color、marker、linestyle、legend 可选值 见本文最后 附
2、散点图
import matplotlib.pyplot as plt# 数据
x = [1, 2, 3, 4, 5]
y = [2, 3, 5, 7, 11]# 绘制散点图
plt.scatter(x, y)# 添加标题和坐标轴标签
plt.title('Scatter Plot Example')
plt.xlabel('X')
plt.ylabel('Y')# 显示网格线
plt.grid(True)# 显示图像
plt.show()
3、绘制矩形框
matplotlib.patches.Rectangle
是 Matplotlib 提供的一个用于绘制矩形的类,它可以在图表中绘制一个矩形形状的对象。
matplotlib.patches.Rectangle(xy, width, height, angle=0.0, **kwargs)
参数:
-
(x, y)
: 矩形的左下角的坐标。这个坐标表示矩形左下角的位置。 -
width
: 矩形的宽度。 -
height
: 矩形的高度。 -
angle
: 矩形的旋转角度。默认值为0,表示矩形不旋转。 -
linewidth
: 矩形边框线的宽度。 -
edgecolor
: 矩形边框线的颜色。 -
facecolor
: 矩形填充的颜色。如果设置为'none'
或None
,则表示矩形不填充。 -
alpha
: 矩形的透明度,取值范围为 0 到 1。 -
linestyle
: 矩形边框线的样式。默认值为'solid'
。
import matplotlib.pyplot as plt
import matplotlib.patches as patches# 创建一个矩形对象
rectangle = patches.Rectangle((0.2, 0.3), 0.5, 0.4, linewidth=2, edgecolor='r', facecolor='none')# 显示图形
fig, ax = plt.subplots()
ax.add_patch(rectangle)
plt.xlim(0, 1)
plt.ylim(0, 1)
plt.show()
3、图像读取与可视化
-
matplotlib 使用
plt.imshow(image)
进行可视化时,image 的格式需为 [H、W、C] -
三通道的顺序需为 :RGB
1)使用 matplotlib 读取图像,并使用 matplotlib 可视化图像
import matplotlib.image as mpimg
import matplotlib.pyplot as plt# 读取图像
image = mpimg.imread("example_image.jpg")# 获取图像尺寸
height, width, channels = image.shape
print(width, height, channels) # 640 426 3# 可视化图像
plt.imshow(image)
plt.axis('off') # 关闭坐标轴
plt.show()
2)或者,我们一般也使用 PIL 读取图像,并使用 matplotlib 可视化图像
from PIL import Image
import matplotlib.pyplot as pltimage = Image.open("example_image.jpg")print(image.width, image.height) # 640 426plt.axis('off')
plt.imshow(image)
plt.show()
4、可视化多张图像
-
plt.subplot(223)
:参数中的 223 分别表示,图像展示格局为 2行 2列,当这个图像放在第3个位置(即第2行第1列的位置)
import PIL.Image as Image
import matplotlib.pyplot as pltimg1 = Image.open('./COCO2017/train2017/000000000025.jpg')
img2 = Image.open('./COCO2017/train2017/000000000030.jpg')
img3 = Image.open('./COCO2017/train2017/000000000034.jpg')plt.subplot(221)
plt.axis('off')
plt.imshow(img1)plt.subplot(222)
plt.axis('off')
plt.imshow(img2)plt.subplot(223)
plt.axis('off')
plt.imshow(img3)plt.show()
5、在图像上绘制散点
import matplotlib.pyplot as plt
import PIL.Image as Image
import numpy as np# 读取图像
image = Image.open('example_image')
width, height = image.size[:2]
# 绘制图像
plt.imshow(image)# 生成一些随机的散点数据
num_points = 50
x = np.random.randint(0, width, 20)
y = np.random.randint(0, height, 20)# 绘制散点
plt.scatter(x, y, color='red', marker='o')# 显示图像
plt.axis('off')
plt.show()
6、在图像上绘制矩形 并标注文字
需要注意的是,对于图像来说,图像左上角点是原点,这时 patches.Rectangle
参数指定的是 矩形左上角点的坐标,和 图像的宽、高
from PIL import Image
import requests
import matplotlib.pyplot as plt
import matplotlib.patches as patches
import numpy as np# 读取一张图像
url = 'https://farm4.staticflickr.com/3120/2862048068_0cf5eed770_z.jpg'
image = Image.open(requests.get(url, stream=True).raw)# 绘制图像
plt.axis('off')
plt.imshow(image)# 创建一个矩形对象并添加到图像中,(66, 110) 是左上角点的 x 和 y
rectangle = patches.Rectangle((66, 110), 85, 133, linewidth=2, edgecolor='r', facecolor='none')
plt.gca().add_patch(rectangle)# 标注文字
plt.text(66, 110, 'cow: 86%', color='r', fontsize=9, verticalalignment='bottom',bbox=dict(facecolor='yellow', edgecolor='r'))# 显示图像
plt.show()
附
1)color 的可选值
查看官网
2)marker 可选值
查看官网
3)inestyle 可选值
查看官网
4)Legend 参数 loc 位置可选值
查看官网
Python关于%matplotlib inline 标红底报错
import numpy
import matplotlib.pyplot as plt
%matplotlib inline
当你copy 别人的代码的时候,其中最后一句 %matplotlib inline
总是红底下划线,显示是 invalid syntax(无效语法)。为啥别人用就行,你用就不行呢?
原因是:在使用 jupyter notebook 或者 jupyter qtconsole的时候,才会经常用到 %matplotlib,也就是说,那一份代码可能就是别人使用 jupyter notebook 或者 jupyter qtconsole 进行编辑的。 而你如果使用的是 spyder 或者pycharm,你就用不着那句代码
当我们在spyder或者pycharm实际运行代码的时候,可以直接注释掉这一句,也是可以运行成功的。
cv2
1、图片读取 cv2.imread()
img = cv2.imread(filename, flags)
-
filename:指定图像的路径
-
flags:用来控制读取文件的类型,flages的参数值如下表。表中第一列参数与第三列是等价的,在设置参数时,既可以使用第一列的参数值,也可以使用第三列的参数值。即
img = cv2.imread('image.bmp', cv2.IMREAD_UNCHANGED)
与img = cv2.imread('image.bmp', -1)
效果是一样的
2、图片展示
1)cv2. imshow()
cv2.imshow()
用于创建一个指定名称的窗口,并在窗口中展示图像
cv2.imshow(winname, mat)
-
winname: 窗口的名称
-
mat:要显示的图像
举例
import cv2img = cv2.imread('./lena.png', -1)
cv2.imshow('lena', img)
cv2.waitKey()
cv2.destroyWindow('lena')
说明
-
函数 cv2.imshow() 之后要用 cv2.waitKey() 函数设定图像窗口的显示时长,否则不会显示图像窗口。
-
图像窗口将在 waitKey() 函数所设定的时长(毫秒)后自动关闭,waitKey(0) 表示窗口显示时长为无限,不填写的话参数值默认为0。
-
显示图片时,可以创建多个不同的显示窗口,每个窗口必须有不同的名称。
2、cv2.waitKey()
cv2.waitKey(delay)
-
delay 表示等待键盘触发的时间,单位为ms;该值默认为0
-
当该值是负数或0时,表示无限等待,直到用户在键盘上点击任意一个键后,图片消失;
-
如果设置改值为1000,则1000ms后,图片自动消失
-
3、cv2. destroyWindow()
-
函数
cv2.destroyWindow()
用来释放(销毁)指定窗口
import cv2 img = cv2.imread('./lena.png', cv2.IMREAD_UNCHANGED)
cv2.imshow('lena', img)
cv2.waitKey()
cv2.destroyWindow('lena')
运行如上程序,首先会在一个名为 'lena' 的窗口内显示 lena.png 图像。当按下键盘上的任意一个按键后,名称为 'lena' 的窗口会被释放。
4、cv2. destroyAllWindows()
-
函数
cv2.destroyAllWindows()
用来释放(销毁)所有窗口
import cv2 img = cv2.imread('./lena.png', cv2.IMREAD_UNCHANGED)
cv2.imshow('lena1', img)
cv2.imshow('lena2', img)
cv2.waitKey()
cv2.destroyAllWindows()
运行如上程序,会分别出现名称为 'lena1' 和 'lena2' 的窗口,在两个窗口中显示的都是 lena.png 图像。当按下键盘上的任意一个按键后,两个窗口都会被释放。
3、常见错误
1)常见错误一:图片路径错误
若错误提示为 :
`error: (-215:Assertion failed)size.width>0&& size.height>0 in function 'cv::imshow'`
这通常是由于在读取文件时没有找到图像文件造成的。
2)常见错误二:点击任意键,图像没有消失
用 jupyter 运行的时候,可能会出现一个情况就是: 图片展示出来了,但是点击任意键,图像不会消失,而是光标在转圈。
解决方案是,在destroyAllWindows 之后,再加一个 cv2.waitKey(1)
import cv2img = cv2.imread('./images/LenaRGB.bmp', -1)
cv2.imshow('lena', img)
cv2.waitKey()
cv2.destroyAllWindows()
cv2.waitKey(1)
PIL
1、读取本地图片
PIL.Image.open
读取进来的图像,没有shape属性(有 size属性),可以通过 size 查看图像尺寸
通过size获取到的尺寸,没有channel信息,只有 width 和 height (注意 width 和 height 的顺序)
from PIL import Image# 打开图像文件
image = Image.open("example_image.jpg")# 获取图像尺寸
width, height = image.size
print(width, height) # 640 426
2、读取网络图片
from PIL import Image
import requests
import matplotlib.pyplot as plturl = 'https://farm4.staticflickr.com/3120/2862048068_0cf5eed770_z.jpg'
image = Image.open(requests.get(url, stream=True).raw)print(image.width, image.height) # 640 426plt.axis('off')
plt.imshow(image)
plt.show()
注意:
-
cv2 可视化图像,要求图像格式为 :BGR
-
matplotlib 可视化图像,要求图像格式为 :RGB
使用 cv2 读取图像,使用 matplotlib 可视化图像,需要将图像从 BGR 格式转换为 RGB 格式
import cv2
import matplotlib.pyplot as plt# 读取图像
image = cv2.imread("example_image.jpg")# 将 BGR 格式转换为 RGB 格式
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)# 可视化图像
plt.imshow(image_rgb)
plt.axis('off') # 关闭坐标轴
plt.show()