-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
97 lines (75 loc) · 3.54 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import sys
import cv2
import numpy as np
from pathlib import Path
from PyQt6 import QtCore, QtGui, QtWidgets
from PyQt6 import uic
from main_window import Ui_MainWindow
IMG_EXTENSIONS = [".png", ".bmp", ".tif", ".tiff", ".jpg", ".jpeg"]
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.ui.selectFolderButton.clicked.connect(self.open_dialog)
self.ui.listWidget.itemSelectionChanged.connect(self.select_image)
self.ui.RedChannelBox.clicked.connect(self.select_red_channel)
self.ui.GreenChannelBox.clicked.connect(self.select_green_channel)
self.ui.BlueChannelBox.clicked.connect(self.select_blue_channel)
self.scene = QtWidgets.QGraphicsScene(self)
self.current_image = None
self.original_image = None
self.red_channel_selected = self.ui.RedChannelBox.isChecked()
self.green_channel_selected = self.ui.GreenChannelBox.isChecked()
self.blue_channel_selected = self.ui.BlueChannelBox.isChecked()
@QtCore.pyqtSlot()
def open_dialog(self):
directory = str(QtWidgets.QFileDialog.getExistingDirectory(self, "Select Directory"))
path = Path(directory)
self.ui.listWidget.clear()
self.ui.lineEdit.setText(str(path))
for ext in IMG_EXTENSIONS:
for img_file in path.glob(f"*{ext}"):
self.ui.listWidget.addItem(img_file.name)
@QtCore.pyqtSlot()
def select_image(self):
if len(self.ui.listWidget.selectedItems()) == 0:
return
selected_image_name = self.ui.listWidget.selectedItems()[0].text()
selected_image_path = Path(self.ui.lineEdit.text()).joinpath(selected_image_name)
self.original_image = cv2.imread(str(selected_image_path))
self.original_image = cv2.cvtColor(self.original_image, cv2.COLOR_BGR2RGB)
self.current_image = self.original_image.copy()
self.update()
def select_red_channel(self):
self.red_channel_selected = self.ui.RedChannelBox.isChecked()
self.update()
def select_green_channel(self):
self.green_channel_selected = self.ui.GreenChannelBox.isChecked()
self.update()
def select_blue_channel(self):
self.blue_channel_selected = self.ui.BlueChannelBox.isChecked()
self.update()
def update(self):
if self.current_image is None or self.original_image is None:
return
self.current_image = self.original_image.copy()
for idx, selected_channel in enumerate([self.red_channel_selected, self.green_channel_selected, self.blue_channel_selected]):
if not selected_channel:
self.current_image[..., idx] = 0
self.scene.clear()
q_image = QtGui.QImage(self.current_image.data.tobytes(),
self.current_image.shape[1],
self.current_image.shape[0],
self.current_image.strides[0],
QtGui.QImage.Format.Format_RGB888)
pixmap = QtGui.QPixmap.fromImage(q_image)
self.scene.setSceneRect(0, 0, pixmap.width(), pixmap.height())
self.scene.addPixmap(pixmap)
self.ui.graphicsView.setAlignment(QtCore.Qt.AlignmentFlag.AlignTop | QtCore.Qt.AlignmentFlag.AlignLeft)
self.ui.graphicsView.setScene(self.scene)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()