From f0de99a14838e9d36c359f91a5f0c5f750d2fbf4 Mon Sep 17 00:00:00 2001 From: mmcwilliams Date: Tue, 24 Oct 2023 16:14:56 -0400 Subject: [PATCH] Improve color conversion method. Allow for comparison_comparison to test all color spaces --- py/comparison_comparison.py | 63 ++++++++++++++++++++++++++++++++----- py/pallete_schema.py | 4 ++- py/posterize.py | 35 +++++++++++++++++++-- 3 files changed, 92 insertions(+), 10 deletions(-) diff --git a/py/comparison_comparison.py b/py/comparison_comparison.py index 597d8d5..e9d944e 100644 --- a/py/comparison_comparison.py +++ b/py/comparison_comparison.py @@ -4,19 +4,68 @@ from pallete_schema import PalleteSchema class ComparisonComparison: def __init__ (self) : - c = [0, 0, 255] - print(c) - cc = self.convert_color(c, cv2.COLOR_BGR2RGB, cv2.COLOR_RGB2LAB) - print(cc) - print(self.convert_color(cc, cv2.COLOR_BGR2LAB, cv2.COLOR_LAB2RGB)) + red = [0, 10, 200] + green = [5, 250, 5] + blue = [240, 0, 20] + comp_colors = [red, green, blue] + pallete = PalleteSchema('./palletes/test_pallete.json') + colors = self.get_colors(pallete.colors) + for cc in comp_colors : + ccbgr = self.convert_color(cc, 'RGB', 'BGR') + closest = self.closest(colors, ccbgr) + print(f'{closest} for {ccbgr}') + def get_colors (self, pallete) : + colors = [] + for color in pallete : + colors.append(color['color']) + return colors def convert_color (self, color, color_space_a, color_space_b) : pixel = np.zeros([1, 1, 3], dtype=np.uint8) - pixel = cv2.cvtColor(pixel, color_space_a) + if color_space_a == 'RGB' : + pixel = cv2.cvtColor(pixel, cv2.COLOR_BGR2RGB) + elif color_space_a == 'LAB' : + pixel = cv2.cvtColor(pixel, cv2.COLOR_BGR2LAB) + elif color_space_a == 'HSV' : + pixel = cv2.cvtColor(pixel, cv2.COLOR_BGR2HSV) + #default is BGR pixel[:] = color - cvt = cv2.cvtColor(pixel, color_space_b) + if color_space_a == 'RGB' and color_space_b == 'BGR' : + b = cv2.COLOR_RGB2BGR + elif color_space_a == 'BGR' and color_space_b == 'RGB' : + b = cv2.COLOR_BGR2RGB + elif color_space_a == 'RGB' and color_space_b == 'LAB' : + b = cv2.COLOR_RGB2LAB + elif color_space_a == 'LAB' and color_space_b == 'RGB' : + b = cv2.COLOR_LAB2RGB + elif color_space_a == 'BGR' and color_space_b == 'LAB' : + b = cv2.COLOR_BGR2LAB + elif color_space_a == 'LAB' and color_space_b == 'BGR' : + b = cv2.COLOR_LAB2BGR + elif color_space_a == 'HSV' and color_space_b == 'LAB' : + b = cv2.COLOR_HSV2LAB + elif color_space_a == 'LAB' and color_space_b == 'HSV' : + b = cv2.COLOR_LAB2HSV + elif color_space_a == 'RGB' and color_space_b == 'HSV' : + b = cv2.COLOR_RGB2HSV + elif color_space_a == 'HSV' and color_space_b == 'RGB' : + b = cv2.COLOR_HSV2RGB + elif color_space_a == 'BGR' and color_space_b == 'HSV' : + b = cv2.COLOR_BGRHSV + elif color_space_a == 'HSV' and color_space_b == 'BGR' : + b = cv2.COLOR_HSV2BGR + + cvt = cv2.cvtColor(pixel, b) return cvt[0, 0] + def closest(self, colors, color): + colors = np.array(colors) + color = np.array(color) + distances = np.sqrt(np.sum((colors - color) ** 2, axis=1)) + index_of_smallest = np.where(distances == np.amin(distances)) + smallest_distance = colors[index_of_smallest] + return smallest_distance + if __name__ == "__main__": ComparisonComparison() \ No newline at end of file diff --git a/py/pallete_schema.py b/py/pallete_schema.py index f46d1ce..3f4595e 100644 --- a/py/pallete_schema.py +++ b/py/pallete_schema.py @@ -21,8 +21,10 @@ class PalleteSchema : def __init__ (self, file = None, obj = None): if file is not None and obj is None: self.parse_file(file) - else : + elif file is not None and obj is not None : self.write(file, obj) + else : + print('Not sure what you\'re trying to do here') def parse_file (self, file) : with open(file) as f : diff --git a/py/posterize.py b/py/posterize.py index 23ffdf1..28dbf0a 100644 --- a/py/posterize.py +++ b/py/posterize.py @@ -59,9 +59,40 @@ class Posterize: def convert_color (self, color, color_space_a, color_space_b) : pixel = np.zeros([1, 1, 3], dtype=np.uint8) - pixel = cv2.cvtColor(pixel, color_space_a) + if color_space_a == 'RGB' : + pixel = cv2.cvtColor(pixel, cv2.COLOR_BGR2RGB) + elif color_space_a == 'LAB' : + pixel = cv2.cvtColor(pixel, cv2.COLOR_BGR2LAB) + elif color_space_a == 'HSV' : + pixel = cv2.cvtColor(pixel, cv2.COLOR_BGR2HSV) + #default is BGR pixel[:] = color - cvt = cv2.cvtColor(pixel, color_space_b) + if color_space_a == 'RGB' and color_space_b == 'BGR' : + b = cv2.COLOR_RGB2BGR + elif color_space_a == 'BGR' and color_space_b == 'RGB' : + b = cv2.COLOR_BGR2RGB + elif color_space_a == 'RGB' and color_space_b == 'LAB' : + b = cv2.COLOR_RGB2LAB + elif color_space_a == 'LAB' and color_space_b == 'RGB' : + b = cv2.COLOR_LAB2RGB + elif color_space_a == 'BGR' and color_space_b == 'LAB' : + b = cv2.COLOR_BGR2LAB + elif color_space_a == 'LAB' and color_space_b == 'BGR' : + b = cv2.COLOR_LAB2BGR + elif color_space_a == 'HSV' and color_space_b == 'LAB' : + b = cv2.COLOR_HSV2LAB + elif color_space_a == 'LAB' and color_space_b == 'HSV' : + b = cv2.COLOR_LAB2HSV + elif color_space_a == 'RGB' and color_space_b == 'HSV' : + b = cv2.COLOR_RGB2HSV + elif color_space_a == 'HSV' and color_space_b == 'RGB' : + b = cv2.COLOR_HSV2RGB + elif color_space_a == 'BGR' and color_space_b == 'HSV' : + b = cv2.COLOR_BGRHSV + elif color_space_a == 'HSV' and color_space_b == 'BGR' : + b = cv2.COLOR_HSV2BGR + + cvt = cv2.cvtColor(pixel, b) return cvt[0, 0] def closest(self, colors, color):