PIL库的Image、OpenCV的np.ndarray、QtGui.QPixmap

本文介绍了如何在PIL、OpenCV和PyQt之间进行图像数据的转换。从PIL的RGB图像转换为OpenCV的BGR格式,再到PyQt的QPixmap显示,详细展示了每个步骤的代码实现。同时,提供了判断图像数据是否为OpenCV格式的方法,并总结了各种转换方式的对比。
摘要由CSDN通过智能技术生成

PIL.Image转换成OpenCV格式
PIL.Image颜色通道顺序RGB
OpenCV图像颜色通道顺序BGR

import cv2
from PIL import Image
import numpy
 
image = Image.open("input.jpg")
image.show()
img = cv2.cvtColor(numpy.asarray(image),cv2.COLOR_RGB2BGR)
cv2.imshow("OpenCV",img)
cv2.waitKey()

OpenCV转换成PIL.Image格式

import cv2
from PIL import Image
import numpy
 
img = cv2.imread("input.jpg")
cv2.imshow("OpenCV",img)
image = Image.fromarray(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))
image.show()
cv2.waitKey()

OpenCV转换成Pyqt-Qpixmap

 import cv2
 from PyQt5 import  QtGui
from PIL import Image
cv2_img=cv2.imread('input.jpg')
#第一种方式
img_RGB = cv2.cvtColor(cv2_img, cv2.COLOR_BGR2RGB)
qimage = QtGui.QImage(img_RGB[:], img_RGB.shape[1], img_RGB.shape[0], img_RGB.shape[1] * 3,
                        QtGui.QImage.Format_RGB888)
 img_pix = QtGui.QPixmap.fromImage(qimage)
#第二种方式
 # qimage=Image.fromarray(cv2.cvtColor(cv2_img, cv2.COLOR_BGR2RGB))
 #qtimage = ImageQt.ImageQt(qimage)
# img_pix = QtGui.QPixmap.fromImage(qtimage)

PIL.Image转换成Pyqt-Qpixmap

 import cv2
 from PyQt5 import  QtGui
from PIL import Image,ImageQt
img = Image.open("input.jpg")
qimage = ImageQt.ImageQt(img)
img_pix = QtGui.QPixmap.fromImage(qimage)

判断图像数据是否是OpenCV格式

isinstance(img, np.ndarray)

各种转换总结对比

#PIL.Image->OpenCV
img = cv2.cvtColor(numpy.asarray(image),cv2.COLOR_RGB2BGR)
#OpenCV->PIL.Image
image = Image.fromarray(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))
#OpenCV->Pyqt-Qpixmap第一种方式
img_RGB = cv2.cvtColor(cv2_img, cv2.COLOR_BGR2RGB)
qimage = QtGui.QImage(img_RGB[:], img_RGB.shape[1], img_RGB.shape[0], img_RGB.shape[1] * 3,
                        QtGui.QImage.Format_RGB888)
img_pix = QtGui.QPixmap.fromImage(qimage)
#img_pix =QtGui.QPixmap(qimage)
#OpenCV->Pyqt-Qpixmap第二种方式
qimage=Image.fromarray(cv2.cvtColor(cv2_img, cv2.COLOR_BGR2RGB))
qtimage = ImageQt.ImageQt(qimage)
img_pix = QtGui.QPixmap.fromImage(qtimage)
#PIL.Image转换成Pyqt-Qpixmap
img = Image.open("input.jpg")
qimage = ImageQt.ImageQt(img)
img_pix = QtGui.QPixmap.fromImage(qimage)

实现这个功能需要用到以下几个模块: 1. PyQt5:用于构建 GUI 界面; 2. OpenCV:用于读取动图并分解成逐帧图片; 3. Pillow:用于将图片转换成 PyQt5 可以显示的格式。 下面是实现步骤: 1. 安装 PyQt5、OpenCVPillow 模块。 ```python pip install PyQt5 opencv-python pillow ``` 2. 创建一个 PyQT5 窗口,包含一个 QLabel 和一个 QSlider。 ```python from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QSlider, QVBoxLayout class MainWindow(QWidget): def __init__(self): super().__init__() self.setWindowTitle('动图播放器') self.setGeometry(100, 100, 600, 600) self.label = QLabel(self) self.slider = QSlider(self) vbox = QVBoxLayout() vbox.addWidget(self.label) vbox.addWidget(self.slider) self.setLayout(vbox) ``` 3. 读取动图并分解成逐帧图片,将图片存储在一个列表中。 ```python import cv2 class MainWindow(QWidget): def __init__(self): # ... self.frames = [] cap = cv2.VideoCapture('动图.gif') while True: ret, frame = cap.read() if not ret: break self.frames.append(frame) cap.release() ``` 4. 将逐帧图片转换成 PyQt5 可以显示的格式,并将第一帧图片显示在 QLabel 中。 ```python from PIL import Image from PyQt5.QtGui import QPixmap, QImage class MainWindow(QWidget): def __init__(self): # ... self.images = [] for frame in self.frames: image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) image = Image.fromarray(image) self.images.append(image) self.current_frame = 0 self.update_image() def update_image(self): image = self.images[self.current_frame] image = image.resize((self.label.width(), self.label.height())) qimage = QImage(image.tobytes(), image.width, image.height, QImage.Format_RGB888) pixmap = QPixmap.fromImage(qimage) self.label.setPixmap(pixmap) ``` 5. 使用 QSlider 控制当前显示的帧数。 ```python from PyQt5.QtCore import Qt class MainWindow(QWidget): def __init__(self): # ... self.slider.setRange(0, len(self.frames)-1) self.slider.setOrientation(Qt.Horizontal) self.slider.valueChanged.connect(self.slider_changed) def slider_changed(self, value): self.current_frame = value self.update_image() ``` 完整代码如下:
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值