(原文:https://blog.iyatt.com/?p=13222 )
1 测试环境
Python 3.12.1
numpy 1.26.3
opencv-python 4.9.0.80
pillow 10.2.0
matplotlib 3.8.2
注:
- 基于 2022.1.16 和 2022.4.9 的三篇博文再次验证并重写,原文已删除
- 测试使用的图片文件为 AI 绘制
2 图像数据结构
2.1 OpenCV 打开图片并显示
Python 版 OpenCV 中图像数据是用的 NumPy 数组存储,通道顺序为 BGRA(蓝 绿 红 透明度),三通道则为 BGR。
import cv2
image_path = 'demo.png' # 图片路径
img = cv2.imread(image_path) # 打开图片文件
cv2.imshow('my image', # 窗口标题
img) # 图像数据
cv2.waitKey(0) # 阻塞窗口,按任意键继续
cv2.destroyAllWindows() # 关闭所有窗口
2.2 Matplotlib 打开图片并显示
Matplotlib 和 OpenCV 一样都是采用的 NumPy 数组存储图像数据,只是通道顺序为 RGB。
import matplotlib.pyplot as plt
image_path = 'demo.png'
image = plt.imread(image_path)
plt.axis('off') # 不显示坐标轴
plt.imshow(image)
plt.show()
2.3 Pillow 打开图片用 OpenCV 显示
Pillow 是 Python 中较为常用的图像库。
from PIL import Image
import cv2
import numpy as np
image_path = 'demo.png'
pillow_image = Image.open(image_path)
opencv_image = cv2.cvtColor(
np.array(pillow_image), # Pillow 图像数据结构转 NumPy
cv2.COLOR_RGB2BGR # 通道顺序由 RGB 转为 BGR
)
cv2.imshow('Pillow Image To OpenCV Image', opencv_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.4 OpenCV 打开图片用 Tkinter 显示(OpenCV 转 Pillow)
Tkinter 是 Python 的官方 GUI 库,Pillow 的图像数据支持直接在 Tkinter 中显示,因此这里把 OpenCV 图像转为 Pillow 再到 Tkinter 中显示。
import cv2
import tkinter as tk
from PIL import Image, ImageTk
image_path = 'demo.png'
class Application(tk.Frame):
def __init__(self, master):
super().__init__(master)
self.master = master
def interface(self):
global pillow_image # 注意 Tkinter 显示的图片要使用全局变量
opencv_image = cv2.imread(image_path)
pillow_image = ImageTk.PhotoImage(
Image.fromarray(
cv2.cvtColor(
opencv_image,
cv2.COLOR_BGR2RGB
)
)
)
tk.Label(self.master, image=pillow_image).pack()
if __name__ == '__main__':
root = tk.Tk()
root.title('OpenCV 打开图片并在 Tkinter 中显示') # 窗口标题
app = Application(root)
app.interface()
root.mainloop()
2.5 Pillow 打开图片并使用 Tkinter 显示
import tkinter as tk
from PIL import Image, ImageTk
image_path = 'demo.png'
class Application(tk.Frame):
def __init__(self, master):
super()