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

为了实现一个基于 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.rhkb.cn/news/425564.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PyQt5-loading-圆环加载效果

效果预览 代码实现 from PyQt5.QtCore import QSize, pyqtProperty, QTimer, Qt, QThread, pyqtSignal from PyQt5.QtGui import QColor, QPainter from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QPushButton, QVBoxLayout, QLabel, QGridLayoutclass Cir…

Spring IOC的应用

目录 一、IOC基础 1、maven导入spring的 jar包 和 单测包 2、bean的配置 2.1 纯xml模式 2.1.1 xml文件头 2.1.2 实例化Bean的三种方式 2.1.3 Bean的生命周期 2.1.4 Bean标签属性 2.1.5 DI依赖注入的xml配置 2.1.5.1 构造函数注入 2.1.5.2 set方法注入 2.1.5.3 复杂数据类型注入…

【QT】常用控件-下

欢迎来到Cefler的博客😁 🕌博客主页:折纸花满衣 🏠个人专栏:QT 目录 👉🏻QComboBox👉🏻 QSpinBox👉🏻QDateTimeEdit👉🏻QD…

二叉树OJ题——二叉树的最大深度

文章目录 一、题目链接二、解题思路三、解题代码 一、题目链接 二叉树的最大深度 二、解题思路 三、解题代码

API - String 和 ArrayList

01 API是什么 答:API 全称 Application Programming Interfaace 应用程序编程接口。就是别人写好的一些程序,我们可以使用它们去解决相关问题。 02 为什么要学API 答:不要重复造轮子。Java已经有20多年的历史了,在这20多年里Ja…

【电路笔记】-差分运算放大器

差分运算放大器 文章目录 差分运算放大器1、概述2、差分运算放大器表示2.1 差分模式2.2 减法器模式3、差分放大器示例3.1 相关电阻3.2 惠斯通桥3.3 光/温度检测4、仪表放大器5、总结1、概述 在之前的文章中,我们讨论了反相运算放大器和同相运算放大器,我们考虑了在运算放大器…

android 删除系统原有的debug.keystore,系统运行的时候,重新生成新的debug.keystore,来完成App的运行。

1、先上一个图:这个是keystore无效的原因 之前在安装这个旧版本android studio的时候呢,安装过一版最新的android studio,然后通过模拟器跑过测试的demo。 2、运行旧的项目到模拟器的时候,就报错了: Execution failed…

初探全同态加密1 —— FHE的定义与历史回顾

文章目录 一、加密体系1、什么是加密体系2、加密体系的属性 Properties 二、同态加密:偶然的特殊性质三、同态加密体系的分类四、部分同态加密 Partially Homomorphic Encryption1、加法同态加密算法 —— ElGamal 加密算法1.1、ElGamal 的大致步骤1.2、ElGamal 的加…

7-ZIP工具的功能分享:合并分卷压缩文件

在日常工作中,有些大文件无法单独传输,我们通常会通过压缩拆分成多个分卷文件来完成传输。 当完成传输后,不想要这么多分卷文件的时候,就可以通过7-ZIP工具的合并功能来解决这个问题。下面一起来看看,具体如何操作。 …

Cortex-A7的GIC(通用中断控制器):边沿触发和电平触发中断处理流程

0 资料 ARM Generic Interrupt Controller Architecture version 2.0 Architecture Specification1 边沿触发和电平触发中断处理流程 1.0 边沿触发和电平触发的区别 边沿触发(Edge-triggered) This is an interrupt that is asserted on detection of…

学习笔记(一)

前言 一、对象 1、由类建模而成,是消息、数据和行为的组合 2、可以接收和发送消息,并利用消息进行彼此的交互。消息要包含传送给对象接收的信息 3、类的实例化:把类转换为对象的过程叫类的实例化。 4、对象的特性 (1) 对象有状态&#…

node.js+Koa框架+MySQL实现注册登录

完整视频展示:https://item.taobao.com/item.htm?ftt&id831092436619&spma21dvs.23580594.0.0.52de2c1bg9gTfM 效果展示: 一、项目介绍 本项目是基于node.jsKoamysql的注册登录的项目,主要是给才学习node.js和Koa框架的萌新才写的。 二、项目…

Datawhale------Tiny-universe学习笔记——Qwen(1)

1. Qwen整体介绍 对于一个完全没接触过大模型的小白来说,猛一听这个名字首先会一懵:Qwen是啥。这里首先解答一下这个问题。下面是官网给出介绍:Qwen是阿里巴巴集团Qwen团队研发的大语言模型和大型多模态模型系列。其实随着大模型领域的发展&a…

Pytorch详解-模型模块(RNN,CNN,FNN,LSTM,GRU,TCN,Transformer)

Pytorch详解-模型模块 Module & parameterModule初认识forward函数 ParameterPytorch中的权重、参数和超参数 Module容器-ContainersSequentialModuleListModuleDictParameterList & ParameterDict 常用网络层LSTM输入和输出 GRUConvolutional Layers卷积层的基本概念常…

第十七节:学习Hutool上传文件(自学Spring boot 3.x的第四天)

这节记录下如何使用Hutool库上传本地的文件到服务器端(因为是练习,所以是本地端)。 第一步:引入Hutool库最新版本,通过maven方式。(最新版本需去maven仓库查询) 第二步:编写一个post…

sqlgun新闻管理系统

一,打开主页 1.输入框测试回显点 -1union select 1,2,3# 出现回显点2 2.查看数据库表名 -1union select 1,database(),3# 3.查看表名 -1union select 1,2,group_concat(table_name) from information_schema.tables where table_schemasqlgunnews# 4.查看admin中…

【IP协议】解决 IP 地址不够用的问题(IP地址管理:动态分配、NAT、Ipv6)

文章目录 方案一、动态分配 IP 地址方案二、NATNAT 机制的缺点 方案三、IPv6 方案一、动态分配 IP 地址 一个设备上网就分配 IP,不上网就先不分配(权宜之计) 方案二、NAT 网络地址转换 以一当千,使用一个 IP,代表一大…

【探索数据结构与算法】希尔排序原理、实现与分析(图文详解)

目录 一、 引言 二、算法思想 三、算法步骤 四、代码实现 五、复杂度 💓 博客主页:C-SDN花园GGbond ⏩ 文章专栏:探索数据结构与算法 一、 引言 希尔排序(Shell Sort)是插入排序的一种更高效的改进版本&#x…

oracle 使用 PL/SQL Developer创建表并插入单条、多条数据

第一步:使用工具创建表(前提是库已经创建好了):在当前用户下找到Tables 然后点击并右键,点击新建 写上表名,写上表名的注释 第二步添加字段:点击列,然后分别写上你自己需要的字段及名…

LDR6020,单C口OTG,充放一体新潮流!

PD(Power Delivery)芯片实现单Type-C接口输入和输出OTG(On-The-Go)功能,主要是通过支持USB Power Delivery规范和OTG功能的特定硬件和软件设计来实现的。以下是对这一过程的具体解释: 一、PD芯片基础功能 …