本系列面向 Python 小白,从零开始实战解说 OpenCV 项目实战。
本节介绍图像的读取、保存和显示。除基本方法和例程外,还给出了从网络读取图像、读取/保存中文路径图像、按指定大小显示图像、组合显示多个图像、通过 matplotlib 显示彩色和灰度图像的例程。
函数 cv2.imread() 用于从指定的文件读取图像。
函数说明:
cv.imread(filename[, flags]) -> retval
参数说明:
注意事项:
基本例程:
# 1.1 图像的读取
imgFile = "../images/imgLena.tif" # 读取文件的路径
img1 = cv2.imread(imgFile, flags=1) # flags=1 读取彩色图像(BGR)
img2 = cv2.imread(imgFile, flags=0) # flags=0 读取为灰度图像
扩展例程:
# 1.2 从网络读取图像
import urllib.request as request
response = request.urlopen("https://profile.csdnimg.cn/8/E/F/0_youcans")
imgUrl = cv2.imdecode(np.array(bytearray(response.read()), dtype=np.uint8), -1)
# 1.3 读取中文路径的图像
imgFile = "../images/测试图01.png" # 带有中文的文件路径和文件名
# imread() 不支持中文路径和文件名,读取失败,但不会报错!
# img = cv2.imread(imgFile, flags=1)
# 使用 imdecode 可以读取带有中文的文件路径和文件名
img = cv2.imdecode(np.fromfile(imgFile, dtype=np.uint8), -1)
函数 cv2.imwrite() 用于将图像保存到指定的文件。
函数说明:
cv2.imwrite(filename, img [, flags])
参数说明:
注意事项:
基本例程:
# 1.4 图像的保存
imgFile = "../images/logoCV.png" # 读取文件的路径
img3 = cv2.imread(imgFile, flags=1) # flags=1 读取彩色图像(BGR)
saveFile = "../images/imgSave.png" # 保存文件的路径
# cv2.imwrite(saveFile, img3, [int(cv2.IMWRITE_PNG_COMPRESSION), 8]) # 保存图像文件, 设置压缩比为 8
cv2.imwrite(saveFile, img3) # 保存图像文件
扩展例程:
# 1.5 保存中文路径的图像
imgFile = "../images/logoCV.png" # 读取文件的路径
img3 = cv2.imread(imgFile, flags=1) # flags=1 读取彩色图像(BGR)
saveFile = "../images/测试图02.jpg" # 带有中文的保存文件路径
# cv2.imwrite(saveFile, img3) # imwrite 不支持中文路径和文件名,读取失败,但不会报错!
img_write = cv2.imencode(".jpg", img3)[1].tofile(saveFile)
函数 cv2.imshow() 用于在窗口中显示图像。
函数说明:
imshow(winname, img) -> None
参数说明:
注意事项:
基本例程:
# 1.6 图像的显示(cv2.imshow)
imgFile = "../images/imgLena.tif" # 读取文件的路径
img1 = cv2.imread(imgFile, flags=1) # flags=1 读取彩色图像(BGR)
img2 = cv2.imread(imgFile, flags=0) # flags=0 读取为灰度图像
cv2.imshow("Demo1", img1) # 在窗口 "Demo1" 显示图像 img1
cv2.imshow("Demo2", img2) # 在窗口 "Demo2" 显示图像 img2
key = cv2.waitKey(1000) # 等待按键命令, 1000ms 后自动关闭
扩展例程:
# 1.7 图像显示(按指定大小的窗口显示图像)
imgFile = "../images/imgLena.tif" # 读取文件的路径
img1 = cv2.imread(imgFile, flags=1) # flags=1 读取彩色图像(BGR)
cv2.namedWindow("Demo3", cv2.WINDOW_NORMAL)
cv2.resizeWindow("Demo3", 400, 300)
cv2.imshow("Demo3", img1) # 在窗口 "Demo3" 显示图像 img1
key = cv2.waitKey(0) # 等待按键命令
# 1.8 图像显示(多个图像组合显示)
imgFile1 = "../images/imgLena.tif" # 读取文件的路径
img1 = cv2.imread(imgFile1, flags=1) # flags=1 读取彩色图像(BGR)
imgFile2 = "../images/imgGaia.tif" # 读取文件的路径
img2 = cv2.imread(imgFile2, flags=1) # # flags=1 读取彩色图像(BGR)
imgStack = np.hstack((img1, img2)) # 相同大小图像水平拼接
cv2.imshow("Demo4", imgStack) # 在窗口 "Demo4" 显示图像 imgStack
key = cv2.waitKey(0) # 等待按键命令
函数 plt.imshow() 用于通过 matplotlib 库显示图像。
函数说明:
matplotlib.pyplot.imshow(img[, cmap])
OpenCV 使用 BGR 格式,matplotlib/PyQt 使用 RGB 格式。使用 matplotlib/PyQt 显示 openCV 图像,要将 BGR 格式转换为 RGB 格式:
# 图片格式转换:BGR(OpenCV) -> RGB(PyQt5)
imgRGB = cv2.cvtColor(imgBGR, cv2.COLOR_BGR2RGB)
参数说明:
注意事项:
基本例程:
# 1.10 图像显示(plt.imshow)
imgFile = "../images/imgLena.tif" # 读取文件的路径
img1 = cv2.imread(imgFile, flags=1) # flags=1 读取彩色图像(BGR)
imgRGB = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB) # 图片格式转换:BGR(OpenCV) -> RGB(PyQt5)
img2 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) # 图片格式转换:BGR(OpenCV) -> Gray
plt.rcParams['font.sans-serif'] = ['FangSong'] # 支持中文标签
plt.subplot(221), plt.title("1. RGB 格式(mpl)"), plt.axis('off')
plt.imshow(imgRGB) # matplotlib 显示彩色图像(RGB格式)
plt.subplot(222), plt.title("2. BGR 格式(OpenCV)"), plt.axis('off')
plt.imshow(img1) # matplotlib 显示彩色图像(BGR格式)
plt.subplot(223), plt.title("3. 设置 Gray 参数"), plt.axis('off')
plt.imshow(img2, cmap='gray') # matplotlib 显示灰度图像,设置 Gray 参数
plt.subplot(224), plt.title("4. 未设置 Gray 参数"), plt.axis('off')
plt.imshow(img2) # matplotlib 显示灰度图像,未设置 Gray 参数
plt.show()
程序说明:
图 1 中 OpenCV 的 BGR 彩色图像已转换为 RGB 格式,彩色图像的颜色显示正常;
图 2 中 OpenCV 的 BGR 彩色图像格式未做转换,彩色图像的颜色显示异常;
图 3 中 plt.imshow() 设置 cmap=‘gray’,灰度图像的颜色显示正常;
图 4 中 plt.imshow() 未设置 cmap=‘gray’,灰度图像的颜色显示异常。
【本节完】
版权声明:
欢迎关注『Python 小白从零开始 OpenCV 学习课 @ youcans』 原创作品
原创作品,转载必须标注原文链接:https://blog.csdn.net/youcans/article/details/121068773
Copyright 2021 youcans, XUPT
Crated:2021-11-01