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.
139 lines
5.1 KiB
139 lines
5.1 KiB
2 years ago
|
import sys
|
||
|
from cv2 import cvtColor,calcHist,imread,COLOR_GRAY2BGR
|
||
|
import matplotlib.pyplot as plt
|
||
|
from PyQt5.QtCore import Qt
|
||
|
from PyQt5.QtGui import QIcon
|
||
|
from PyQt5.QtWidgets import QAction, QMainWindow, QApplication, QDockWidget, QLabel
|
||
|
|
||
|
from custom.stackedWidget import StackedWidget
|
||
|
from custom.treeView import FileSystemTreeView
|
||
|
from custom.listWidgets import FuncListWidget, UsedListWidget
|
||
|
from custom.graphicsView import GraphicsView
|
||
|
from function.GeometricTrans.Ratate import ratate
|
||
|
|
||
|
|
||
|
class MyApp(QMainWindow):
|
||
|
def __init__(self):
|
||
|
super(MyApp, self).__init__()
|
||
|
QApplication.processEvents()
|
||
|
self.childArea = childWindow()
|
||
|
self.tool_bar = self.addToolBar('工具栏')
|
||
|
self.action_right_rotate = QAction(QIcon("icons/右旋转.png"), "向右旋转90", self)
|
||
|
self.action_left_rotate = QAction(QIcon("icons/左旋转.png"), "向左旋转90°", self)
|
||
|
self.action_histogram = QAction(QIcon("icons/直方图.png"), "直方图", self)
|
||
|
self.action_right_rotate.triggered.connect(self.right_rotate)
|
||
|
self.action_left_rotate.triggered.connect(self.left_rotate)
|
||
|
self.action_histogram.triggered.connect(self.histogram)
|
||
|
# 将上述动作关联到某一个菜单项里面
|
||
|
self.tool_bar.addActions((self.action_left_rotate, self.action_right_rotate, self.action_histogram))
|
||
|
|
||
|
self.useListWidget = UsedListWidget(self)
|
||
|
self.funcListWidget = FuncListWidget(self)
|
||
|
self.stackedWidget = StackedWidget(self)
|
||
|
self.fileSystemTreeView = FileSystemTreeView(self)
|
||
|
self.graphicsView = GraphicsView(self)
|
||
|
|
||
|
self.dock_file = QDockWidget(self)
|
||
|
self.dock_file.setWidget(self.fileSystemTreeView)
|
||
|
self.dock_file.setTitleBarWidget(QLabel('目录'))
|
||
|
self.dock_file.setFeatures(QDockWidget.NoDockWidgetFeatures)
|
||
|
|
||
|
self.dock_func = QDockWidget(self)
|
||
|
self.dock_func.setWidget(self.funcListWidget)
|
||
|
self.dock_func.setTitleBarWidget(QLabel('图像操作'))
|
||
|
self.dock_func.setFeatures(QDockWidget.NoDockWidgetFeatures)
|
||
|
|
||
|
self.dock_used = QDockWidget(self)
|
||
|
self.dock_used.setWidget(self.useListWidget)
|
||
|
self.dock_used.setTitleBarWidget(QLabel('已选操作'))
|
||
|
self.dock_used.setFeatures(QDockWidget.NoDockWidgetFeatures)
|
||
|
self.dock_used.setFeatures(QDockWidget.NoDockWidgetFeatures)
|
||
|
|
||
|
self.dock_attr = QDockWidget(self)
|
||
|
self.dock_attr.setWidget(self.stackedWidget)
|
||
|
self.dock_attr.setTitleBarWidget(QLabel('属性'))
|
||
|
self.dock_attr.setFeatures(QDockWidget.NoDockWidgetFeatures)
|
||
|
self.dock_attr.close()
|
||
|
|
||
|
self.setCentralWidget(self.graphicsView)
|
||
|
self.addDockWidget(Qt.LeftDockWidgetArea, self.dock_file)
|
||
|
self.dock_file.setMinimumWidth(400)
|
||
|
self.dock_file.showMinimized()
|
||
|
self.addDockWidget(Qt.TopDockWidgetArea, self.dock_func)
|
||
|
self.addDockWidget(Qt.RightDockWidgetArea, self.dock_used)
|
||
|
self.dock_used.setMinimumWidth(400)
|
||
|
self.dock_used.showMinimized()
|
||
|
self.addDockWidget(Qt.RightDockWidgetArea, self.dock_attr)
|
||
|
self.dock_attr.setMinimumHeight(500)
|
||
|
|
||
|
self.setWindowTitle('数字图像处理')
|
||
|
self.setWindowIcon(QIcon('icons/main.png'))
|
||
|
self.src_img = None
|
||
|
self.cur_img = None
|
||
|
|
||
|
def update_image(self):
|
||
|
if self.src_img is None:
|
||
|
return
|
||
|
img = self.process_image()
|
||
|
self.cur_img = img
|
||
|
self.graphicsView.update_image(img)
|
||
|
|
||
|
def change_image(self, img):
|
||
|
self.src_img = img
|
||
|
img = self.process_image()
|
||
|
self.cur_img = img
|
||
|
self.graphicsView.change_image(img)
|
||
|
|
||
|
def process_image(self):
|
||
|
img = self.src_img.copy()
|
||
|
for i in range(self.useListWidget.count()):
|
||
|
img = self.useListWidget.item(i)(img)
|
||
|
return img
|
||
|
|
||
|
def right_rotate(self):
|
||
|
self.cur_img = ratate(self.cur_img,90)
|
||
|
self.graphicsView.rotate(90)
|
||
|
|
||
|
def left_rotate(self):
|
||
|
self.cur_img = ratate(self.cur_img, -90)
|
||
|
self.graphicsView.rotate(-90)
|
||
|
|
||
|
def histogram(self):
|
||
|
color = ('b', 'g', 'r')
|
||
|
img = self.cur_img
|
||
|
shape = img.shape
|
||
|
if len(shape) != 3:
|
||
|
img = cvtColor(self.cur_img,COLOR_GRAY2BGR)
|
||
|
for i, col in enumerate(color):
|
||
|
histr = calcHist([img], [i], None, [256], [0, 256])
|
||
|
histr = histr.flatten()
|
||
|
plt.plot(range(256), histr, color=col)
|
||
|
plt.xlim([0, 256])
|
||
|
plt.savefig('histogram.png')
|
||
|
plt.close()
|
||
|
self.img = imread('./histogram.png')
|
||
|
self.childArea.display(self.img)
|
||
|
self.childArea.show()
|
||
|
|
||
|
|
||
|
class childWindow(QMainWindow):
|
||
|
def __init__(self,parent=None):
|
||
|
super(childWindow, self).__init__(parent)
|
||
|
self.setWindowTitle('图像的直方图')
|
||
|
self.graphicsView1 = GraphicsView(self)
|
||
|
self.setCentralWidget(self.graphicsView1)
|
||
|
def display(self,img):
|
||
|
self.graphicsView1.change_image(img)
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
app = QApplication(sys.argv)
|
||
|
app.setStyleSheet(open('styleSheet.qss', encoding='utf-8').read())
|
||
|
window = MyApp()
|
||
|
window.show()
|
||
|
sys.exit(app.exec_())
|