PyQt + sklearn 图像聚类 +图形界面 小软件

用qt designer设计图形界面
以下是界面部分

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'untitled3.ui'
#
# Created by: PyQt5 UI code generator 5.6
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Form(object):
    path_temp=""
    classnum=2
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(711, 471)
        self.setWindowIcon(QtGui.QIcon("test.png"))
        self.graphicsView = QtWidgets.QGraphicsView(Form)
        self.graphicsView.setGeometry(QtCore.QRect(20, 90, 261, 191))
        self.graphicsView.setObjectName("graphicsView")
        self.graphicsView_2 = QtWidgets.QGraphicsView(Form)
        self.graphicsView_2.setGeometry(QtCore.QRect(300, 30, 391, 301))
        self.graphicsView_2.setObjectName("graphicsView_2")
        self.pushButton = QtWidgets.QPushButton(Form)
        self.pushButton.setGeometry(QtCore.QRect(550, 390, 75, 23))
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(Form)
        self.pushButton_2.setGeometry(QtCore.QRect(70, 380, 161, 31))
        self.pushButton_2.setObjectName("pushButton_2")
        self.label = QtWidgets.QLabel(Form)
        self.label.setGeometry(QtCore.QRect(380, 390, 71, 20))
        self.label.setContextMenuPolicy(QtCore.Qt.NoContextMenu)
        self.label.setLineWidth(3)
        self.label.setTextFormat(QtCore.Qt.RichText)
        self.label.setIndent(-1)
        self.label.setObjectName("label")
        self.spinBox = QtWidgets.QSpinBox(Form)
        self.spinBox.setGeometry(QtCore.QRect(470, 390, 71, 22))
        self.spinBox.setCursor(QtGui.QCursor(QtCore.Qt.IBeamCursor))
        self.spinBox.setMinimum(1)
        self.spinBox.setProperty("value", 2)
        self.spinBox.setObjectName("spinBox")
        self.label_2 = QtWidgets.QLabel(Form)
        self.label_2.setGeometry(QtCore.QRect(20, 90, 261, 191))
        self.label_2.setObjectName("label_2")
        self.imagelabel = QtWidgets.QLabel(Form)
        self.imagelabel.setGeometry(QtCore.QRect(300, 30, 391, 301))
        self.imagelabel.setObjectName("imagelabel")

        self.retranslateUi(Form)
        self.pushButton_2.clicked.connect(Form.openimage)
        self.spinBox.valueChanged['int'].connect(Form.getvalue)
        self.pushButton.clicked.connect(Form.createimage)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "图像分割"))
        self.pushButton.setText(_translate("Form", "确认"))
        self.pushButton_2.setText(_translate("Form", "选择图片来源"))
        self.label.setText(_translate("Form", "选择分类数"))
        self.label_2.setText(_translate("Form", "原来的图片位置"))
        self.imagelabel.setText(_translate("Form", "处理后的图片的位置"))

注意,以下是逻辑部分。其中按钮确定的槽函数绑定的图像处理和显示图像!!

from untitled3 import Ui_Form
from PyQt5 import QtWidgets, QtGui
from PyQt5.QtWidgets import QFileDialog
import sys
import numpy as np
import PIL.Image as image
from sklearn.cluster import KMeans
import os
class mydesignershow(QtWidgets.QWidget,Ui_Form):
    def __init__(self):
        super(mydesignershow, self).__init__()
        self.setupUi(self)

    def openimage(self):
        file_path, imgType = QFileDialog.getOpenFileName(self,
                                                         "打开图片",
                                                         r"C:\Users\Administrator\Desktop\Python\sexyimage",
                                                         " *.jpg;;*.png;;*.jpeg;;*.bmp;;All Files (*)")
        png = QtGui.QPixmap(file_path).scaled(self.label_2.width(), self.label_2.height())

        self.path_temp=file_path

        self.label_2.setPixmap(png)

    def getvalue(self):
        self.classnum = self.spinBox.text()


    def createimage(self):

        def load_data(file_path):
            f = open(file_path, 'rb')  # 二进制打开
            data = []
            img = image.open(f)  # 以列表形式返回图片像素值

            m, n = img.size  # 活的图片大小
            for i in range(m):
                for j in range(n):  # 将每个像素点RGB颜色处理到0-1范围内并存放data
                    x, y, z = img.getpixel((i, j))
                    data.append([x / 256.0, y / 256.0, z / 256.0])
            f.close()
            return np.mat(data), m, n  # 以矩阵型式返回data,图片大小

        img_data, row, col = load_data(file_path=self.path_temp)
        num=self.classnum

        label = KMeans(n_clusters=int(num), init='k-means++', tol=1e-6).fit_predict(img_data)  # 聚类中心的个数为num个
        label = label.reshape([row, col])  # 聚类获得每个像素所属的类别
        pic_new = image.new("L", (row, col))  # 创建一张新的灰度图保存聚类后的结果
        for i in range(row):  # 根据所属类别向图片中添加灰度值
            for j in range(col):
                pic_new.putpixel((i, j), int(256 / (label[i][j] + 1)))

        pic_new.save("a.jpg")

        # 利用qlabel显示图片

        png = QtGui.QPixmap("a.jpg").scaled(self.imagelabel.width(), self.imagelabel.height())

        self.imagelabel.setPixmap(png)
        os.remove("a.jpg")


if __name__=="__main__":
    app=QtWidgets.QApplication(sys.argv)
    myshow=mydesignershow()
    myshow.show()
    sys.exit(app.exec())

PyQt + sklearn 图像聚类 +图形界面 小软件_第1张图片

最后感谢知乎萌新的学习日记,里面有很多有意思的小题目,这里参考了其中的聚类文章!

你可能感兴趣的:(Python3)