使用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 np


class ImageDisplayWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
        self.image = None

    def 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 button

    def 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 slider

    def 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.shape
            bytes_per_line = ch * w
            q_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:
            return
        kernel_size = self.slider.value()

        if kernel_size %2 == 0:
            pass
        else:
            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.shape
            bytes_per_line = ch * w
            q_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_())



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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis缓存的概念

缓存回顾 什么是缓存? 缓存就是内存中的数据,常常来自对数据库查询结果的保存。使用缓存可以避免频繁与数据库交互,进而提高 响应速度 。 MyBatis 对缓存的支持 MyBatis 也提供了对缓存的支持,分为 一级缓存 和 二级缓存。可以…

您的文件和驱动器上的“密码保护”有多安全?

某些行业(例如医疗保健、法律和公司)的人们在通过电子邮件发送文件时通常依赖密码保护,认为它可以提供足够的安全性来防止窥探。然而,对 PDF 或 Excel 文件进行简单的密码保护并不像看起来那样万无一失。 使用密码保护文件而不加…

稳态大面积光伏组件IV测试太阳光模拟器

稳态大面积光伏组件IV测试太阳光模拟器是太阳能光伏组件质量检测和评价的重要步骤之一。本文将介绍光伏组件IV测试的原理及标准板选择。 I. 光伏组件IV测试原理 光伏组件IV测试即电流电压特性测试,是评估光伏组件性能的重要手段。其测量的主要参数为组件的电流和电…

快速学习SpringAi

Spring AI是AI工程师的一个应用框架,它提供了一个友好的API和开发AI应用的抽象,旨在简化AI应用的开发工序,例如开发一款基于ChatGPT的对话应用程序。通过使用Spring Ai使我们更简单直接使用chatgpt 1.创建项目 jdk17 引入依赖 2.依赖配置 …

LeetCode394字符串解码

题目描述 给定一个经过编码的字符串,返回它解码后的字符串。编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格&#xf…

优选算法——双指针1

双指针 常⻅的双指针有两种形式,⼀种是对撞指针,⼀种是左右指针。 对撞指针:⼀般⽤于顺序结构中,也称左右指针。 对撞指针从两端向中间移动。⼀个指针从最左端开始,另⼀个从最右端开始,然后逐渐往中间逼 近…

品鉴中的品鉴笔记:如何记录和分享自己的品鉴心得

品鉴云仓酒庄雷盛红酒的过程,不仅是品尝美酒,更是一次与葡萄酒深度对话的旅程。为了更好地记录和分享自己的品鉴心得,养成写品鉴笔记的习惯是十分必要的。 首先,选择一个适合的记录工具。可以是传统的笔记本,也可以是…

linux性能监控之free

free:linux系统自带命令,显示内存状态,命令查询来源于/proc/meminfo 文件 [rootk8s-master ~]# free --helpUsage:free [options]Options:-b, --bytes show output in bytes-k, --kilo show output in kilobytes-m, --mega…

一文掌握gRPC

文章目录 1. gRPC简介2. Http2.0协议3. 序列化-Protobuf4. gRPC开发实战环境搭建5. gRPC的四种通信方式(重点)6. gRPC的代理方式7. SprintBoot整合gRPC 1. gRPC简介 gRPC是由google开源的高性能的RPC框架。它是由google的Stubby这样一个内部的RPC框架演…

HCIA和HCIP区别大吗?小白请看这

华为认证以其专业性和实用性受到了业界的广泛认可。 HCIA、HCIP、HCIP这三个级别,你会选哪个?IE含金量不用多说,IA还是IP,你会纠结吗。 但面对这两个级别的认证,初学者或者“小白”们可能会感到困惑:两者…

智能体Agent笔记

智能体的定义: 1. 可以感受环境中的动态条件 2. 能采取动作影响环境 3. 能运用推理能力理解信息,解决问题,产生推断,决定动作。 我个人觉得智能体是个饼,最核心的问题是,你如何解决大模型的幻觉问题&…

Kafka官方文档中文版+Kafka面试题详解!

你了解kafka吗?目前它在一线互联网公司以迅雷不及掩耳之势得到了广泛的应用。但究竟是什么呢?Kafka最初于2011年在LinkedIn开发,自那时起经历了很多改进。如今它是一个完整的平台,允许您冗余地存储荒谬的数据量,拥有一…

AD原理图设置:如何在编译工程时,报未连接线或引脚错误

如下图,AD默认在编译原理图时,如果出现未连接的引脚或线时,并不会报相关的错误,这样做其实很危险 所以,我们应该让它提示错误 具体配置方法: 1、找到工程选项 2、切换到第二个选项“Connection Matrix”&a…

RedisTemplate操作Redis详解之连接Redis及自定义序列化

连接到Redis 使用Redis和Spring时的首要任务之一是通过IoC容器连接到Redis。为此,需要java连接器(或绑定)。无论选择哪种库,你都只需要使用一组Spring Data Redis API(在所有连接器中行为一致):…

游戏中的设计模式一

游戏开发是一个快速迭代的过程,代码复杂度也很高,借助于设计模式,可以帮助我们降低复杂度,降低系统间的耦合,从而高效高质的做出交付。 最近读了这本书:《游戏编程模式》[1],很受启发&#xff…

探索Playwright:Python下的Web自动化测试革命

在如今这个互联网技术迅速发展的时代,web应用的质量直接关系着企业的声誉和用户的体验。因此,自动化测试成为了保障软件质量的重要手段之一。今天,我将带大家详细了解一款在测试领域大放异彩的神器——Playwright,并通过Python语言…

【搬砖实战】2024年了,还有人不会搭建内网穿透吗?

😊你好,我是小航,一个正在变秃、变强的文艺倾年。 🔔本文讲解动手自己搭建内网穿透,期待与你一同探索、学习、进步,一起卷起来叭! 目录 一、前言内网穿透是什么?frp介绍&#xff1a…

Golang SDK安装

windows环境安装 1.链接: 下载地址 2.安装SDK 检查环境变量: 3.开启go modules,命令行执行一下命令: go env -w GO111MODULEon4.设置国内代理,命令行执行一下命令: go env -w GOPROXYhttps://proxy.golang.com.cn,https:/…

【Linux】进程信号(2万字)

目录 前言 一、生活角度的信号 1.1、我们来见一见信号: 1.2、模拟一下 kill 指令 二、信号的处理 三、产生信号的5种方法 3.1、kill命令 3.2、键盘可以产生信号 3.3、3种系统调用 3.4、软件条件 3.5、异常 四、比较 core 和 Term 五、键盘信号产生 六…

AI绘画如何变现?stablediffusion小白上手指南:2个工具+4个渠道

公司一计算机大佬,用AI画画一个月搞钱1w,画着画着都快超过本职工资了。费了点小心思整理出这篇文章,把搜刮来的一手经验全盘托出,觉得有用的友友记得点赞收藏哦! 我有个朋友学设计的,今年找了大半年工作&a…