基于 PyQt5 和 OpenCV 进行图像处理操作的GUI工具初版

ops/2024/9/24 20:43:34/

为了实现一个基于 PyQt5 和 OpenCV 的图形用户界面(GUI),要求如下:

左边显示加载的图片。
中间提供各种对图片进行处理的操作方法(如灰度化、模糊处理等)。
右边显示处理后的效果图。
接下来我将详细讲解如何实现这个界面。

1. 环境配置

确保你已经安装了 PyQt5 和 OpenCV:

pip install PyQt5
pip install opencv-python

2. 实现代码

以下是完整的代码实现,基于 PyQt5 创建 GUI,使用 OpenCV 进行图像处理操作:

import sys
import cv2
from PyQt5.QtWidgets import QApplication, QLabel, QPushButton, QVBoxLayout, QHBoxLayout, QWidget, QFileDialog
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtCore import Qtclass ImageProcessorApp(QWidget):def __init__(self):super().__init__()# 初始化UIself.setWindowTitle("OpenCV Image Processing Tool")self.setGeometry(100, 100, 1200, 600)# 布局self.layout = QHBoxLayout()# 左侧:原始图片显示self.original_label = QLabel("Original Image")self.original_label.setAlignment(Qt.AlignCenter)self.layout.addWidget(self.original_label)# 中间:按钮操作self.button_layout = QVBoxLayout()self.open_button = QPushButton("Open Image")self.open_button.clicked.connect(self.open_image)self.button_layout.addWidget(self.open_button)self.gray_button = QPushButton("Grayscale")self.gray_button.clicked.connect(self.apply_grayscale)self.button_layout.addWidget(self.gray_button)self.blur_button = QPushButton("Blur Image")self.blur_button.clicked.connect(self.apply_blur)self.button_layout.addWidget(self.blur_button)self.reset_button = QPushButton("Reset Image")self.reset_button.clicked.connect(self.reset_image)self.button_layout.addWidget(self.reset_button)self.button_layout.addStretch()  # 中间空白拉伸self.layout.addLayout(self.button_layout)# 右侧:处理后的图像显示self.processed_label = QLabel("Processed Image")self.processed_label.setAlignment(Qt.AlignCenter)self.layout.addWidget(self.processed_label)# 设置主窗口布局self.setLayout(self.layout)# 变量用于存储加载和处理的图像self.original_image = Noneself.processed_image = Nonedef open_image(self):# 打开文件对话框选择图片image_path = QFileDialog.getOpenFileName(self, "Open Image", "", "Image Files (*.png *.jpg *.jpeg *.bmp)")[0]if image_path:self.original_image = cv2.imread(image_path)self.processed_image = self.original_image.copy()self.display_image(self.original_image, self.original_label)def display_image(self, img, label):# 将 OpenCV BGR 图像转换为 RGB 图像rgb_image = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)# 获取图像的尺寸h, w, ch = rgb_image.shapebytes_per_line = ch * w# 将 OpenCV 图像转换为 QImageqimg = QImage(rgb_image.data, w, h, bytes_per_line, QImage.Format_RGB888)# 将 QImage 转换为 QPixmappixmap = QPixmap.fromImage(qimg)# 将图像设置为 QLabellabel.setPixmap(pixmap.scaled(label.size(), Qt.KeepAspectRatio))def apply_grayscale(self):# 对图像应用灰度化处理if self.processed_image is not None:gray_image = cv2.cvtColor(self.processed_image, cv2.COLOR_BGR2GRAY)# 将单通道图像转回三通道以显示gray_3channel = cv2.cvtColor(gray_image, cv2.COLOR_GRAY2BGR)self.display_image(gray_3channel, self.processed_label)def apply_blur(self):# 对图像应用模糊处理if self.processed_image is not None:blurred_image = cv2.GaussianBlur(self.processed_image, (15, 15), 0)self.display_image(blurred_image, self.processed_label)def reset_image(self):# 恢复原始图像if self.original_image is not None:self.processed_image = self.original_image.copy()self.display_image(self.processed_image, self.processed_label)if __name__ == '__main__':app = QApplication(sys.argv)window = ImageProcessorApp()window.show()sys.exit(app.exec_())

3. 代码详解

主窗口布局

QHBoxLayout 被用作主布局,分为三部分:
左侧:显示加载的原始图片。
中间:包含各类图像处理的按钮,比如打开图片、应用灰度化、模糊处理、重置图像。
右侧:显示处理后的效果图。

打开图片功能

点击 “Open Image” 按钮,打开文件对话框,用户选择一张图片后,将其加载并在左侧显示。
通过 OpenCV 读取图像后,使用 cv2.cvtColor 将 BGR 格式转换为 RGB 格式,并使用 QImage 和 QPixmap 将图像显示在 QLabel 上。
图像处理功能

Grayscale 按钮:应用灰度化处理,将图像从彩色转换为灰度图,并在右侧显示。
Blur Image 按钮:应用高斯模糊处理(cv2.GaussianBlur),并在右侧显示模糊后的图像。
Reset Image 按钮:恢复原始图像,重置所有处理效果。

图像显示

通过 display_image 函数,将 OpenCV 处理后的图像转换为 QImage,再通过 QLabel 显示在界面上。图像在 QLabel 中保持适当的缩放比例,保证图片内容不会失真。

4. 界面示例

左侧:加载的原始图像。
中间:有四个按钮,分别用于打开图片、灰度处理、模糊处理、重置。
右侧:显示经过处理的效果图。

5. 功能扩展

可以进一步扩展此应用,增加更多图像处理方法,例如:

边缘检测(Canny 算法)。
图像旋转、缩放。
图像滤镜(锐化、浮雕等效果)。
保存处理后的图像功能。

运行效果

在这里插入图片描述
灰度示例在这里插入图片描述

可以在这个基础上继续添加更多的opencv 的方法


http://www.ppmy.cn/ops/115452.html

相关文章

【JPCS出版】第二届应用统计、建模与先进算法国际学术会议(ASMA2024,9月27日-29)

第二届应用统计、建模与先进算法国际学术会议 2024 2nd International Conference on Applied Statistics, Modeling and Advanced Algorithms(ASMA2024) 会议官方 会议官网:www.icasma.org 2024 2nd International Conference on Applied …

ftdi_sio驱动学习笔记 2 - probe

目录 1. ftdi_quirk 2. id的特殊性 3. 将特殊操作赋值给串口的私有数据 .probe ftdi_probe, 这个接口函数是FTDI设备插入时调用的函数。程序ftdi_probe里面主要是根据不同的VID和PID设备做了不同的probe函数。这一步最大的作用是probe特殊的一些应用,对于普通…

何时提取ReID特征:一种改进多目标跟踪的选择性方法

摘要 https://arxiv.org/pdf/2409.06617 提取和匹配重识别(Re-ID)特征被许多最先进的(SOTA)多目标跟踪(MOT)方法所使用,特别是在频繁和长期遮挡的情况下特别有效。尽管端到端的目标检测和跟踪一…

【C++】C++中如何处理多返回值

十四、C中如何处理多返回值 本部分也是碎碎念,因为这些点都是很小的点,构不成一篇文章,所以本篇就是想到哪个点就写哪个点。 1、C中如何处理多个返回值 写过python的同学都知道,当你写一个函数的返回时,那是你想返回…

Redis数据结构之哈希表

这里的哈希表说的是value的类型是哈希表 一.相关命令 1.hset key field value 一次可以设置多个 返回值是设置成功的个数 注意,哈希表中的键值对,键是唯一的而值可以重复 所以有下面的结果: key中原来已经有了f1,所以再使用hse…

J Transl Med结肠癌分子分型+简单实验

目录 技术路线 实验设计(药物敏感性) 亮点 方法 从 TCGA 和 GEO 数据库下载大量和单细胞 RNA 测序以及 CRC 的临床数据。HRGs 和 LMRGs 来自分子特征数据库。使用 R 软件包 DESeq2 进行差异表达分析。使用无监督聚类进行分子亚型。使用单变量 Cox 回…

Laravel邮件发送:从配置到发邮件的指南!

Laravel邮件发送功能如何实现?怎么使用Laravel发信? Laravel作为一款流行的PHP框架,提供了强大且易用的邮件发送功能。AokSend将详细介绍如何从配置到实际发送邮件的全过程,帮助你快速掌握Laravel邮件发送的技巧。 Laravel邮件发…

【MySQL】表的操作

目录 一、增加表 二、查看表 2.1 查看当前数据库中的表 2.2 查看指定表的结构 2.3 查看创建表时的详细信息 2.4 查看表中所有数据 三、修改表 3.1 修改表名 3.2 插入数据 3.3 添加列 3.4 修改列类型 3.5 删除列 3.6 修改列名 四、删除表 一、增加表 增加表的语法…