You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
4.7 KiB
106 lines
4.7 KiB
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_())
|