diff --git a/src/experiments/algorithms/colour_FE.py b/src/experiments/algorithms/colour_FE.py index ce6c0f9..b0bdb4a 100644 --- a/src/experiments/algorithms/colour_FE.py +++ b/src/experiments/algorithms/colour_FE.py @@ -4,20 +4,40 @@ from cv2.mat_wrapper import Mat as Mat import os import numpy as np import csv +from enum import Enum CSV_PATH = "src\\experiments\\algorithms\\data\\" IMG_PATH = "dataset\\accasia_1210048 (2023_09_28 12_19_26 UTC).JPG" BARK_TYPES = 8 +class Tree(Enum): + ACCASIA = 0 + BERK = 1 + EIK = 2 + ELS = 3 + ESDOORN = 4 + ES = 5 + LINDE = 6 + PLATAAN = 7 + +class ColourSpace(Enum): + BGR = 0 + HSV = 1 + class colourTester: def __init__(self) -> None: - pass + self.bgr_curves = [[[], [], []] for x in range(BARK_TYPES)] + self.bgr_ids = ["", "", ""] + self.hsv_curves = [[[], [], []] for x in range(BARK_TYPES)] + self.hsv_ids = ["", "", ""] + self.labels = ["" for x in range(BARK_TYPES)] def loadImage(self) -> None: img = cv2.imread(self.im_path, 1) assert img is not None, \ "Failed to load an image, check path" - self.img = img + self.bgr_img = img + self.hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) return def setImPath(self, path : str) -> None: @@ -50,17 +70,42 @@ class colourTester: return (mean, std) def loadCurves(self) -> None: - labels = [] - ids = [] - data = [[[], [], []] for x in range(BARK_TYPES)] with open(self.csv_bgr_path, 'r') as bgr_file: reader = csv.reader(bgr_file, delimiter=',') - # fix whatever is happening here - - print(data) + j = 0 + i = -1 + for row in reader: + j+=1 + i += 1 if (j-1) % 3 == 0 else 0 + self.labels[i] = row[0] + self.bgr_ids[(j-1)%3] = row[1] + for col in row[2:]: + self.bgr_curves[i][(j-1)%3].append(col) + + with open(self.csv_hsv_path, 'r') as hsv_file: + reader = csv.reader(hsv_file, delimiter=',') + j = 0 + i = -1 + for row in reader: + j+=1 + i += 1 if (j-1) % 3 == 0 else 0 + self.labels[i] = row[0] + self.hsv_ids[(j-1)%3] = row[1] + for col in row[2:]: + self.hsv_curves[i][(j-1)%3].append(col) return - def testImage(self) -> None: + def correlate(self, mean : float, tree : Tree, space : ColourSpace) -> [float, float, float]: + results = [0, 0, 0] + if space == ColourSpace.BGR: + curve = self.bgr_curves + elif space == ColourSpace.HSV: + curve = self.hsv_curves + for i in range(3): + results[i] = float(curve[tree.value][i][int(mean[i])]) + return results + + def testImage(self) -> Tree: # load an image self.loadImage() @@ -68,16 +113,49 @@ class colourTester: self.loadCurves() # extract data - mean, std = self.getData(self.img) + bgr_mean, bgr_std = self.getData(self.bgr_img) + hsv_mean, hsv_std = self.getData(self.hsv_img) - # correlate with curves - # dictionary? list? with 0 - 1 scores - pass + # correlate with curves + av_results = np.zeros(BARK_TYPES) + for tree in Tree: + bgr_res = self.correlate(bgr_mean, tree, ColourSpace.BGR) + hsv_res = self.correlate(hsv_mean, tree, ColourSpace.HSV) + av_results[tree.value] = (np.mean(bgr_res)+np.mean(hsv_res) / 2) + # print(str(IMG_PATH.split('_')[0])+';'+tree.name + ';' + str(np.mean(bgr_res)) + ';' + str(np.mean(hsv_res))) + return np.argmax(av_results) + + def testDataset(self, path : str) -> None: + n_t = 0 + n_f = 0 + tree_type_cor = np.zeros(BARK_TYPES) + tree_type_inc = np.zeros(BARK_TYPES) + res = np.zeros(BARK_TYPES) + i = -1 + last_name = "" + for file in os.listdir(path): + file_path = os.path.join(path, file) + self.setImPath(file_path) + name = file_path.split('_')[0].split('\\')[1].upper() + result = Tree(self.testImage()).name + + if last_name != name: + i += 1 + last_name = name + + if(name == result): + tree_type_cor[i] += 1 + else: + tree_type_inc[i] += 1 + + res = tree_type_cor / (tree_type_cor + tree_type_inc) * 100 + for i in range(BARK_TYPES): + print("%s: %d%% correct"%(Tree(i).name, res[i])) + return if __name__ == "__main__": tester = colourTester() - tester.setImPath(IMG_PATH) tester.setCsvBgrPath(CSV_PATH + "bgr_curve.csv") tester.setCsvHsvPath(CSV_PATH + "hsv_curve.csv") - tester.testImage() + tester.testDataset("dataset") pass \ No newline at end of file