使用PyQT和OpenCV开发的腐蚀效果调试器

使用PyQT和OpenCV开发的腐蚀效果调试器

腐蚀效果调试器

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

项目地址

项目链接: github项目链接

简介

本项目是一个基于Python和PyQt5的简单GUI应用,旨在为用户提供一个可视化的环境来调试和展示图像的腐蚀效果。用户可以通过调整参数来实时查看不同腐蚀程度对图像的影响。

安装说明

在运行本项目之前,请确保已安装以下依赖项:

  • Python
  • PyQt5
  • OpenCV

您可以使用pip命令来安装这些依赖项:

pip install PyQt5 opencv-python
pip install PyQt5 pyqt5

源码

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")
        self.slider_value_label2 = QLabel("腐蚀次数: 0")
        controls_layout = QHBoxLayout()
        self.add_control(controls_layout, "矩形核大小(kernel):", self.slider, self.slider_value_label)
        controls_layout2 = QHBoxLayout()
        self.add_control(controls_layout2, "腐蚀次数(iterations):", self.slider2, self.slider_value_label2)

        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.slider_value_label2)
        # 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.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()
        iterations = self.slider2.value()
        self.slider_value_label.setText(f"矩形核大小: {kernel_size}x{kernel_size}")
        self.slider_value_label2.setText(f"腐蚀次数: {iterations}")
        kernel = np.ones((kernel_size, kernel_size), dtype=np.uint8)
        processed_image = cv2.erode(self.image, kernel, iterations=iterations)
        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_())

相关推荐

  1. 快速学习PyQt5动画图形效果

    2024-04-05 18:34:01       34 阅读
  2. OpenCV开发:Mat单通道多通道使用

    2024-04-05 18:34:01       36 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-05 18:34:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-05 18:34:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-05 18:34:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-05 18:34:01       18 阅读

热门阅读

  1. 爬取高校专业信息的Python爬虫简介与实践

    2024-04-05 18:34:01       18 阅读
  2. nginx压缩文件gzip配置如何实现

    2024-04-05 18:34:01       15 阅读
  3. GPS工具箱导出数据2

    2024-04-05 18:34:01       13 阅读
  4. Zookeeper脑裂解决方案

    2024-04-05 18:34:01       15 阅读
  5. Zookeeper 中的 CAP

    2024-04-05 18:34:01       12 阅读
  6. tcp服务端,时刻在线

    2024-04-05 18:34:01       15 阅读
  7. ubuntu 安装配置samba服务器完整教程

    2024-04-05 18:34:01       12 阅读