基于 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.xdnf.cn/news/142641.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言零基础入门篇 - 5】:探索C语言中丰富多样的选择和循环结构

文章目录 选择分支结构if选择结构if...else...选择结构if...else if...else 嵌套选择结构switch多分支结构 循环结构for 循环while 循环do … while 循环 跳转语句 选择分支结构 if选择结构 基本格式:if(表达式1)语句1; 功能:如果表达式1…

坚持的力量--完成向CSDN迁移500篇技术文章阶段小记-以此自勉

前言:本文为迁移前的博客中的文章《坚持的力量-写给第1000篇文章笔记》发表于 publish:May 14, 2021 -Friday,作为原个人博客中累计写满1000篇文章的总结和鼓励。因在向CSDN迁移文章的过程中进行了一些文章合并等调整,总文数大量下降&#xf…

【建设方案】固定资产信息系统建设方案(功能清单列表2024word原件)

固定资产管理系统需求要点: 1. 实现公司内部固定资产管理全生命周期管理,包括资产采购、资产入库、资产领用、资产借用、资产归还、资产报废、资产维修、资产调拨等全过程管理。 2. 可实现集团内部固定资产盘点管理,包括盘点计划、盘点查询等…

Python数据分析与可视化的全面指南

目录 引言 一、Python数据分析基础 1. 为什么选择Python进行数据分析? 2. 常用的数据分析库 二、环境配置 1. 安装Python 2. 安装Anaconda(可选) 3. 创建虚拟环境 4. 安装必要的库 三、数据分析流程 四、数据处理与分析 1. 导入库…

【PHP代码审计】PHP基础知识

🌝博客主页:菜鸟小羊 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 php简介 php是什么? php(全称:Hypertext Preprocessor,即超文本预处理器&…

圆环加载效果

效果预览 代码实现 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…

数据与结构算法平衡二叉树详解叉树--基本概念

平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。这个方案很好…

图解Redis 01 | 初识Redis

什么是 Redis? Redis 是一种基于内存的数据库,所有的数据读写操作都在内存中完成,因此读写速度非常快。它被广泛应用于缓存、消息队列、分布式锁等场景。 Redis 提供了多种数据类型来支持不同的业务需求,如 String、Hash、List、…

环形数组与单向链表的队列实现(Queue)

什么是队列 队列是一种重要的线性数据结构,具有先进先出(FIFO)的特性。元素的插入操作称为入队,删除操作称为出队。队列在许多计算机科学应用中非常常见,如任务调度和数据缓冲等。 在实现队列时,可…

路由策略PBR

文章目录 策略路由PBR概述本地流量接口策略 策略路由 策略路由和路由策略的区别: 策略路由可以不按照路由表进行转发路由策略主要控制路由信息的引入、发布和接受等,主要靠 RIB和FIB PBR概述 比路由策略耗资源,直接跳过路由表,数…

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

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

IP协议及相关特性

IP协议负责地址管理和路由选择。它的组成为: 接下来我们将对其中较重要的部分进行介绍。 4位版本:这里的四位版本只有两个取值 分别为IPv4和IPv6,这两个额分别为不同的IP协议,但是现在主流的还是IPv4但是近年来IPv6在中国的普及率…

linux系统如何通过进程PID号找到对应的程序在系统中的路径

linux系统如何通过进程PID号找到对应的程序在系统中的路径 首先我们用ps -aux​命令找到对应进程的PID号,比如我这里要得就是xmrig这个进程的PID号 ​​ 通过lsof命令查看对应进程的关联的文件,并找到可执行文件的路径 lsof -p 22785 | grep txt​​ 或…

棉花叶片病害检测数据集

【棉花叶片病害检测数据集】nc: 5 names: [blight, curl, healthy, wilt, wilt_png] 名称:【枯萎病, 卷叶病, 健康,萎蔫病,‘萎蔫病图像’】共3474张,8:1:1比例划分,(train;2888张,val&#xff…

MVCC机制解析:提升数据库并发性能的关键

MVCC机制解析:提升数据库并发性能的关键 MVCC(Multi-Version Concurrency Control) 多版本并发控制 。 MVCC只在事务隔离级别为读已提交(Read Committed)和可重复读(Repeated Read)下生效。 MVCC是做什么用的 MVCC是为了处理 可重复读 和…

C++ 带约束的Ceres形状拟合

C 带约束的Ceres形状拟合 一、Ceres Solver1.定义问题2. 添加残差AddResidualBlockAutoDiffCostFunction 3. 配置求解器4. 求解5. 检查结果 二、基于Ceres的最佳拟合残差结构体拟合主函数 三、带约束的Ceres拟合残差设计拟合区间限定 四、拟合结果bestminmax 五、完整代码 对Ce…

无法将ggplot图保存为PDF文件怎么办

即serif代表Times New Roman字体,sans代表Arial字体,mono代表Courier New字体。这种映射关系在基础绘图系统和ggplot2系统中均可使用。 既然字体找不到,那么就导入我们电脑的字体咯: # 这个代码只需运行一次 extrafont::font_im…

使用GitHub Actions实现前后端CI/CD到云服务器

一、静态站点部署(前端) 如果你要部署到github pages或者你不用SSR(服务端渲染),那就构建(SSG)静态站点 配置 nextjs配置SSG(静态站点)next.config.mjs,其…

跨域训练评估BEVal:自动驾驶 BEV 的跨数据集评估框架

跨域训练评估BEVal:自动驾驶 BEV 的跨数据集评估框架 Abstract 当前在自动驾驶中的鸟瞰图语义分割研究主要集中在使用单个数据集(通常是nuScenes数据集)优化神经网络模型。这种做法导致了高度专业化的模型,可能在面对不同环境或…

孙溟㠭浅析中国碑帖〈曹全碑〉

孙溟㠭浅析中国碑帖《曹全碑》 《曹全碑》 《曹全碑》亦称《郃阳令曹全碑》,东汉时期的碑刻。属于隶书体,东汉中平二年(公元158年)立碑。 《曹全碑》 于明代万历初年在陕西郃阳县莘里村被发现,碑文记载了东汉末年曹全…