diff --git a/sketch.py b/sketch.py new file mode 100644 index 0000000..9ba5a94 --- /dev/null +++ b/sketch.py @@ -0,0 +1,105 @@ +import sys +import cv2 +import numpy as np +from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QPushButton, QGraphicsView, QGraphicsScene, QGraphicsPixmapItem, QFileDialog, QMenuBar, QStatusBar +from PyQt5.QtCore import QRect, QCoreApplication, QMetaObject +from PyQt5.QtGui import QPixmap, QImage + +class Ui_MainWindow: + def setupUi(self, MainWindow): + if not MainWindow.objectName(): + MainWindow.setObjectName("MainWindow") + MainWindow.resize(950, 750) + self.centralwidget = QWidget(MainWindow) + self.centralwidget.setObjectName("centralwidget") + + self.pushButton_1 = QPushButton(self.centralwidget) + self.pushButton_1.setObjectName("pushButton_1") + self.pushButton_1.setGeometry(QRect(100, 550, 240, 71)) + + self.pushButton_2 = QPushButton(self.centralwidget) + self.pushButton_2.setObjectName("pushButton_2") + self.pushButton_2.setGeometry(QRect(370, 550, 220, 71)) + + self.pushButton_3 = QPushButton(self.centralwidget) + self.pushButton_3.setObjectName("pushButton_3") + self.pushButton_3.setGeometry(QRect(620, 550, 230, 71)) + + self.graphicsView = QGraphicsView(self.centralwidget) + self.graphicsView.setObjectName("graphicsView") + self.graphicsView.setGeometry(QRect(70, 60, 400, 450)) + + self.graphicsView_2 = QGraphicsView(self.centralwidget) + self.graphicsView_2.setObjectName("graphicsView_2") + self.graphicsView_2.setGeometry(QRect(500, 60, 400, 450)) + + MainWindow.setCentralWidget(self.centralwidget) + self.menubar = QMenuBar(MainWindow) + self.menubar.setObjectName("menubar") + self.menubar.setGeometry(QRect(0, 0, 800, 23)) + MainWindow.setMenuBar(self.menubar) + self.statusbar = QStatusBar(MainWindow) + self.statusbar.setObjectName("statusbar") + MainWindow.setStatusBar(self.statusbar) + + self.retranslateUi(MainWindow) + QMetaObject.connectSlotsByName(MainWindow) + + def retranslateUi(self, MainWindow): + MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", "素描风格转换系统", None)) + self.pushButton_2.setText(QCoreApplication.translate("MainWindow", "转换至素描风格", None)) + self.pushButton_1.setText(QCoreApplication.translate("MainWindow", "选择图片", None)) + self.pushButton_3.setText(QCoreApplication.translate("MainWindow", "保存图片", None)) + +class MainWindow(QMainWindow, Ui_MainWindow): + def __init__(self): + super().__init__() + self.setupUi(self) + self.pushButton_1.clicked.connect(self.select_image) + self.pushButton_2.clicked.connect(self.convert_to_sketch) + self.pushButton_3.clicked.connect(self.save_image) + self.src_image = None + self.dst_image = None + + def select_image(self): + options = QFileDialog.Options() + file_name, _ = QFileDialog.getOpenFileName(self, "选择图片", "", "Images (*.png *.xpm *.jpg *.bmp *.gif)", options=options) + if file_name: + self.src_image = cv2.imread(file_name) + self.display_image(self.src_image, self.graphicsView) + + def convert_to_sketch(self): + if self.src_image is not None: + #1.将图片转为灰度图 + gray = cv2.cvtColor(self.src_image, cv2.COLOR_BGR2GRAY) + #2.将灰度图取反 + gray_inverse = cv2.bitwise_not(gray) + #3. 对取反后的图像进行高斯模糊操作,指定了一个15x15的高斯内核 + gray_inverse = cv2.GaussianBlur(gray_inverse, (15, 15), 50) + #4. 颜色减淡混合 + self.dst_image = cv2.divide(gray, 255 - gray_inverse, scale=256) + self.display_image(self.dst_image, self.graphicsView_2) + + def save_image(self): + if self.dst_image is not None: + options = QFileDialog.Options() + file_name, _ = QFileDialog.getSaveFileName(self, "保存图片", "", "Images (*.png *.xpm *.jpg *.bmp *.gif)", options=options) + if file_name: + cv2.imwrite(file_name, self.dst_image) + + def display_image(self, image, view): + image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) + h, w, ch = image.shape + bytes_per_line = ch * w + q_image = QImage(image.data, w, h, bytes_per_line, QImage.Format_RGB888) + pixmap = QPixmap.fromImage(q_image) + scene = QGraphicsScene() + scene.addItem(QGraphicsPixmapItem(pixmap)) + view.setScene(scene) + view.fitInView(scene.itemsBoundingRect(), mode=1) + +if __name__ == "__main__": + app = QApplication(sys.argv) + window = MainWindow() + window.show() + sys.exit(app.exec_())