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

来源:互联网 发布:淘宝流量提升软件 编辑:程序博客网 时间:2024/06/08 10:50

用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, QtWidgetsclass 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_Formfrom PyQt5 import QtWidgets, QtGuifrom PyQt5.QtWidgets import QFileDialogimport sysimport numpy as npimport PIL.Image as imagefrom sklearn.cluster import KMeansimport osclass 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())

这里写图片描述

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

原创粉丝点击