diff --git a/src/helpers/gui/main.ui b/src/helpers/gui/main.ui index 6936046..27b05d0 100644 --- a/src/helpers/gui/main.ui +++ b/src/helpers/gui/main.ui @@ -197,7 +197,7 @@ 2 1 - 0 + 10 7 1 @@ -284,6 +284,28 @@ + + + Export ID for entire dataset + + + 1 + 2 + 30 + 8 + + + + + + TkIconFont + Powered by ARNweb.nl & TomSelier.com + + 0 + 8 + + + diff --git a/src/suite.py b/src/suite.py index 2367bef..cc27040 100644 --- a/src/suite.py +++ b/src/suite.py @@ -12,6 +12,7 @@ import json from helpers.statistics import imgStats import datetime import os +import copy ## UI config load PROJECT_PATH = pathlib.Path(__file__).parent @@ -40,6 +41,7 @@ class MainApp: # Keep track of images in dataset self.img_current = 0 + self.img_old = -1 self.img_max = 0 # Plots @@ -50,12 +52,14 @@ class MainApp: self.canny_thr2 = None self.img_path = None self.contrast = None + self.img_size = None + self.img_size_old = 0 ## Check if the rendering size has changed, if it has the analysis has to be run + self.sobel_select = None self.export_id = None self.brightness = None builder.import_variables(self,['canny_thr1','canny_thr2','img_path','contrast','img_size','sobel_select','export_id','brightness']) - builder.connect_callbacks(self) # Load values from config after UI has been initialised @@ -95,19 +99,22 @@ class MainApp: self.img_current = self.img_current + 1 self.update(self) - def apply(self, event=None): + def apply(self, event=None, path=None): ''' Export current dataset ''' # Get export settings img_arr = self.tk_imgs img_id = self.export_id.get() - path = config_json["out"] + if path == None: + path = config_json["out"] + else: + print(F"Using path: {path}") if (img_id >= 0 and img_id < len(img_arr)): # Create file now = datetime.datetime.now() - new_file_name = F"{now.strftime('%Y-%m-%dT%H.%M.%S')}-id{img_id}.png" + new_file_name = F"{self.img_current}-{self.output[1][img_id]}-{now.strftime('%Y-%m-%dT%H.%M.%S')}.png" # Put data file_path = pathlib.Path(path, new_file_name) @@ -120,6 +127,25 @@ class MainApp: print(f"Exported Image ID {img_id} to {os.path.join(path, new_file_name)}") else: print("Nothing to export!") + + def apply_all(self, event=None): + img_id = self.export_id.get() + img_current = copy.deepcopy(self.img_current) + + now = datetime.datetime.now() + path = pathlib.Path(config_json["out"], F"{self.output[1][img_id]}-all-{now.strftime('%Y-%m-%dT%H.%M.%S')}/") + os.mkdir(path) + + while True: + self.img_next() + self.update(part_update=True) # Enforce partial update since we don't need the histograms etc. + self.apply(path=path) + + if (self.img_current == img_current): + break + + ## Ensure display is always correct with image + self.update() def add_output(self, data, name: str): ''' @@ -162,7 +188,6 @@ class MainApp: self.meta.insert(END, F"{idx}: {self.output[1][idx]}\n") # Clear output - self.output = [[] for x in range(2)] self.meta.config(state=DISABLED) # Draw canvas @@ -220,9 +245,19 @@ class MainApp: %(labels[0], mean[0], labels[1], mean[1], labels[2], mean[2], labels[0], std[0], labels[1], std[1], labels[2], std[2])) - def update(self, event=None): + def update(self, event=None, part_update=False): path = self.img_path.get() - # print(path) + + ## Check if hist and canny hm have to be rerendered + if not part_update: ## If partial update has not been forced, check if full update is required + if (self.img_current != self.img_old or self.img_size != self.img_size_old): + part_update = False + self.img_old = self.img_current + self.img_size_old = self.img_size + else: + part_update = True + else: + print("Partial update forced!") if path != None and path != "": # Get all images at current path @@ -240,6 +275,9 @@ class MainApp: contrast = self.contrast.get() bright = self.brightness.get() + # Clear output + self.output = [[] for x in range(2)] + # Import and resize image img = cv2.imread(images[self.img_current]) img = cv2.resize(img, (size, size), interpolation = cv2.INTER_AREA) @@ -253,11 +291,12 @@ class MainApp: contrast_val = contrast / 100 bright_val = bright / 100 img_contrast = np.clip(contrast_val * (img_gray + bright_val), 0, 255).astype(np.uint8) - self.add_output(img_contrast, F"Contrast / Brightness\n c+{contrast_val} b+{bright_val}") + # self.add_output(img_contrast, F"Contrast / Brightness\n c+{contrast_val} b+{bright_val}") + self.add_output(img_contrast, F"BCG") # Blurred edition img_blur = cv2.GaussianBlur(img_gray, (3, 3), 0) - self.add_output(img_blur, "Blurred (3)") + self.add_output(img_blur, "Blurred_k3") # Sobel edge if sxy in ['x', 'y', 'both']: @@ -274,17 +313,18 @@ class MainApp: img_sobel = cv2.Sobel(src=img_blur, ddepth=cv2.CV_8U, dx=dx, dy=dy, ksize=5) else: img_sobel = img_gray - self.add_output(img_sobel, F"Sobel Edge\n nz={cv2.countNonZero(img_sobel)}") + self.add_output(img_sobel, "Sobel_edge") + # self.add_output(img_sobel, F"Sobel Edge\n nz={cv2.countNonZero(img_sobel)}") # Canny edge img_canny = cv2.Canny(image=img_blur,threshold1=ct1,threshold2=ct2) - self.add_output(img_canny, "Canny Edge") + self.add_output(img_canny, "Canny_edge") self.writeStats(img, ('B', 'G', 'R'), 0, 0) # BGR - self.add_output(img[:, :, 0], "BGR B") - self.add_output(img[:, :, 1], "BGR G") - self.add_output(img[:, :, 2], "BGR R") + self.add_output(img[:, :, 0], "BGR_B") + self.add_output(img[:, :, 1], "BGR_G") + self.add_output(img[:, :, 2], "BGR_R") if img is not None: self.drawHist(img, ('B', 'G', 'R'), 0, 0) @@ -292,16 +332,18 @@ class MainApp: # HSV img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) self.add_output(img_hsv, "HSV") - self.add_output(img_hsv[:, :, 0], "HSV H") # H - self.add_output(img_hsv[:, :, 1], "HSV S") # S - self.add_output(img_hsv[:, :, 2], "HSV V") # V + self.add_output(img_hsv[:, :, 0], "HSV_H") # H + self.add_output(img_hsv[:, :, 1], "HSV_S") # S + self.add_output(img_hsv[:, :, 2], "HSV_V") # V - if img_hsv is not None: - self.drawHist(img_hsv, ('H', 'S', 'V'), 0, 1) - self.writeStats(img_hsv, ('H', 'S', 'V'), 0, 1) + if not part_update: + if img_hsv is not None: + self.drawHist(img_hsv, ('H', 'S', 'V'), 0, 1) + self.writeStats(img_hsv, ('H', 'S', 'V'), 0, 1) # Canny Heatmap - self.drawCannyHM(img, 1, 1) + if not part_update: + self.drawCannyHM(img, 1, 1) # Show all data plt.show(block=False) ## Graphs