使用python开发的闭运算调试器

使用python开发的开运算调试器

  • 简介
  • 效果
  • 代码

简介

用来调试闭运算效果的小工具,滑动条可以控制滤波核的大小,用来查看不同滤波核下的闭运算效果。

效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QFileDialog, QSlider
from PyQt5.QtGui import QPixmap, QImage
from PyQt5.QtCore import Qt
import cv2
import numpy as npclass ImageDisplayWidget(QWidget):def __init__(self):super().__init__()self.initUI()self.image = Nonedef initUI(self):self.main_layout = QVBoxLayout()self.resize(820, 620)self.open_button = self.create_button("打开图片", self.open_image)self.img_win = QWidget()img_win_layout = QHBoxLayout()self.img_win.setLayout(img_win_layout)self.orgin_img_label = QLabel()self.image_label = QLabel()self.add_image_view(img_win_layout, "原图", self.orgin_img_label)self.add_image_view(img_win_layout, "处理后的图", self.image_label)self.slider = self.create_slider(self.process_image)self.slider2 = self.create_slider(self.process_image)self.slider_value_label = QLabel("滤波核大小: 0x0")controls_layout = QHBoxLayout()self.add_control(controls_layout, "滤波核大小(ksize):", self.slider, self.slider_value_label)controls_layout2 = QHBoxLayout()self.main_layout.addWidget(self.open_button)self.main_layout.addWidget(self.img_win)self.main_layout.addLayout(controls_layout)self.main_layout.addLayout(controls_layout2)self.setLayout(self.main_layout)self.setWindowTitle('闭运算调试器')self.set_common_style(self.slider_value_label)# self.set_common_style()self.show()def add_image_view(self, layout, label_text, image_label):image_view_layout = QVBoxLayout()name_label = QLabel(label_text)name_label.setAlignment(Qt.AlignCenter)image_view_layout.addWidget(image_label, alignment=Qt.AlignCenter)image_view_layout.addWidget(name_label, alignment=Qt.AlignCenter)layout.addLayout(image_view_layout)self.set_common_style(name_label)def create_button(self, text, clicked_slot):button = QPushButton(text)button.clicked.connect(clicked_slot)self.set_common_style(button)return buttondef create_slider(self, value_changed_slot):slider = QSlider(Qt.Horizontal)slider.setMinimum(1)slider.setMaximum(100)slider.setSingleStep(2)slider.valueChanged.connect(value_changed_slot)self.set_slider_style(slider)return sliderdef add_control(self, layout, label_text, slider, value_label):control_label = QLabel(label_text)layout.addWidget(control_label)layout.addWidget(slider)layout.addWidget(value_label)self.set_common_style(control_label)def set_common_style(self, label):label.setStyleSheet("""  QLabel {  font-family: '微软雅黑';  font-size: 12pt;  color: red;  }QPushButton {  font-family: '微软雅黑';  font-size: 12pt;  color: red;  }  """)def set_slider_style(self, slider):slider.setStyleSheet("""  QSlider::groove:horizontal {  background: #999999;  height: 8px;  margin: 0;  border-radius: 4px;  }  QSlider::handle:horizontal {  background: red;  border: 1px solid #999999;  width: 16px;  height: 16px;  margin: -7px 0; /* handle is placed in the middle */  border-radius: 8px;  }  QSlider::add-page:horizontal {  background: #FF0000; /* This is the red color from your font color */  }  QSlider::sub-page:horizontal {  background: #555555; /* You can choose a different color for the filled part */  }  """)def open_image(self):self.filename, _ = QFileDialog.getOpenFileName(self, '打开图片', '.', '图片文件 (*.png *.jpg *.jpeg *.bmp)')if self.filename:self.image = cv2.imread(self.filename)or_img = cv2.cvtColor(self.image, cv2.COLOR_BGR2RGB)h, w, ch = or_img.shapebytes_per_line = ch * wq_img = QImage(or_img.data, w, h, bytes_per_line, QImage.Format_RGB888)pixmap = QPixmap.fromImage(q_img)if pixmap.width() > 600 or pixmap.height() > 600:pixmap = pixmap.scaled(600, 600, Qt.KeepAspectRatio, Qt.SmoothTransformation)self.orgin_img_label.setPixmap(pixmap)self.process_image()def process_image(self):if self.image is None:returnkernel_size = self.slider.value()if kernel_size %2 == 0:passelse:self.slider_value_label.setText(f"矩形核大小: {kernel_size}x{kernel_size}")kernel = np.ones((kernel_size, kernel_size), np.uint8)processed_image = cv2.morphologyEx(self.image, cv2.MORPH_CLOSE, kernel)processed_image = cv2.cvtColor(processed_image, cv2.COLOR_BGR2RGB)h, w, ch = processed_image.shapebytes_per_line = ch * wq_img = QImage(processed_image.data, w, h, bytes_per_line, QImage.Format_RGB888)pixmap = QPixmap.fromImage(q_img)if pixmap.width() > 600 or pixmap.height() > 600:pixmap = pixmap.scaled(600, 600, Qt.KeepAspectRatio, Qt.SmoothTransformation)self.image_label.setPixmap(pixmap)if __name__ == '__main__':app = QApplication(sys.argv)ex = ImageDisplayWidget()sys.exit(app.exec_())

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3032587.html

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

相关文章

《新生向》什么是Python环境?

观前提醒:本文详细介绍了Python环境的结构,介绍了python虚拟环境基础用法,以及python中的环境&依赖管理 0.什么是Python环境 Python环境是指一个特定的设置,其中包含了运行Python代码所需的一系列软件工具和包。这个环境可以…

TiDB学习2:TiDB Sever

目录 1. TiDB Server架构 2. sql语句的解析和编译 2.1 Parse ​编辑 2.2 compile 3. 行转化为KV对(聚簇表) ​编辑4. SQL 读写相关模块 4.1 DistSQL(复杂查询) 4.2 KV(简单查询) 5. 在线DDL相关模块 6. GC机制与相关模块 7. TiDB Server的缓存 8. 热点小表缓存 9. …

【数据结构】图和基本算法

文章目录 1. 图的基本概念1.1 图本身的定义1.2 相关概念 2. 图的存储结构2.1 邻接矩阵2.2 邻接表 3. 图的遍历3.1 广度优先遍历(BFS)3.2 深度优先遍历(DFS) 4. 最小生成树4.1 Kruskal算法4.2 Prim算法 5. 最短路径5.1 单源最短路径…

【Linux】用户组、用户、文件权限(ugo权限),权限掩码,chmod,chown,suid,sgid,sticky,su,sudo

用户组 注意:普通用户只能查看有哪些组,不能创建/修改/删除,会提示:用户名 is not in the sudoers file.This incident will be reported. groupadd 用户组名新建用户组cat /etc/group查看有哪些组(普通用户可以操作…

关于DOCKER启动后如何添加新的端口映射

前段时间在用docker部署服务的时候发现,容器已经启动,但是需要新的端口映射(即容器在启动的时候只进行了部分的端口映射),经过查询资料后发现现在网上有2种方法,一中是修改json文件。另一种是将已经运行的容…

FreeRtos内核源码分析(九)——协程

目录 一、协程简介 二、协程工作机制 2.1 协程控制块结构 2.2 协程管理方式 2.3 协程调度方式 2.4 协程通信机制 三、协程状态及状态切换 3.1 协程状态 3.2 状态切换 四、协程创建 五、协程调度分析 5.1 源码分析 5.2 逻辑图分析 六、协程通信 6.1 协程发送消息…

Centos7 配置 DNS服务器

Centos 7 配置DNS服务器 环境描述: 一台服务器和一台用于测试的客户机 服务器IP:192.168.200.132 客户机IP:192.168.200.143 服务器配置 yum install bind bind-utils -y #安装软件包vim /etc/named.conf //编辑named主配置文件listen-on p…

【Redis】Redis键值存储

大家好,我是白晨,一个不是很能熬夜,但是也想日更的人。如果喜欢这篇文章,点个赞👍,关注一下👀白晨吧!你的支持就是我最大的动力!💪💪&#x1f4aa…

从新手到高手,教你如何改造你的广告思维方式!

想要广告震撼人心又让人长时间记住?答案肯定是“创意”二字。广告创意,说白了就是脑洞大开,想法新颖。那些很流行的广告,都是因为背后的想法特别、新颖。做广告啊,就得不停地思考,创新思维是关键。 广告思…

短视频赛道有哪些:成都鼎茂宏升文化传媒公司

短视频赛道有哪些:探索多元化的内容领域 随着科技的飞速发展和人们生活节奏的加快,短视频已成为现代人生活中不可或缺的一部分。它以其简短、直观、易于分享的特点,迅速占领了各个年龄层和社会群体的心智。然而,短视频的赛道并非…

Franz Electron + React 源码启动运行填坑指南

环境要求 安装miniconda python 环境electron/rebuild用得着,miniconda 默认自带的 python 是 3.11 版本,比较新; 安装virsual studio 2019 要把C桌面相关的都安装了,大概需要20G,不要安装到 C 盘,都安装到…

C++系统编程篇——Linux初识(系统安装、权限管理,权限设置)

(1)linux系统的安装 双系统---不推荐虚拟机centos镜像(可以使用)云服务器/轻量级云服务器(强烈推荐) ①云服务器(用xshell连接) ssh root公网IP 然后输入password ①添加用户: addus…

web前端框架设计第十课-自定义指令

web前端框架设计第十课-自定义指令 一.预习笔记 1.注册全局指令(先注册在使用) 2.注册局部指令(要找标签有的属性) 3.钩子函数 4.binding对象参数 二.课堂笔记 三.课后回顾 –行动是治愈恐惧的良药,犹豫拖延将不断滋…

在大型项目上,Python 是个烂语言吗?

在开始前我有一些资料,是我根据网友给的问题精心整理了一份「Python的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!! python项目超过5万行&#x…

巩固学习6

正则表达式 又称规则表达式,Regular Expression,在代码中常简写为regex、regexp或RE),是一种文本模式,包括普通字符(例如,a到z之间的字母)和特殊字符(称为“元字符”&…

3SRB2508-ASEMI三相整流桥3SRB2508

编辑:ll 3SRB2508-ASEMI三相整流桥3SRB2508 型号:3SRB2508 品牌:ASEMI 封装:SGBJ-5 最大重复峰值反向电压:800V 最大正向平均整流电流(Vdss):25A 功率(Pd):大功率 芯片个数:…

MySQL性能优化:MySQL中的隐式转换造成的索引失效

目录 前言数据准备SQL测试分析和总结 前言 数据库优化是一个任重而道远的任务,想要做优化必须深入理解数据库的各种特性。在开发过程中我们经常会遇到一些原因很简单但造成的后果却很严重的疑难杂症,这类问题往往还不容易定位,排查费时费力最…

NGINX SPRING HTTPS证书

服务器:xxx.xxx.xxx.56 客户端器:xxx.xxx.xxx.94##生成服务器证书和密钥容器 keytool -genkey -alias tas-server -keypass 250250 -keyalg RSA -keysize 2048 -validity 3650 -keystore D:\https证书\tas-server.jks -storepass 250250 -dname "C…

【电子学会】2023年12月图形化一级 -- 遇见春天

遇见春天 1. 准备工作 (1)选择背景Flowers; (2)删除默认角色小猫,选择角色蝴蝶Butterfly 2、小狗Dot; (3)角色小狗只保留三个造型:dot-a、dot-b、dot-c&a…

AI应用之智能体介绍

AI应用之智能体介绍 一、LLM介绍二、智能客服应用1,阿里智能能话机器人2,华为对话机器人3,公司基于讯飞知识库和讯飞大模型的智能客服 三、大模型应用平台介绍1,fastgpt2,毕昇3, 字节海外版(科学…