LuisAVasquez commited on
Commit
4859d06
1 Parent(s): 3af9a0f

adding basic image processing tools

Browse files
imageprocessing/clip_object_recognition.py ADDED
@@ -0,0 +1,167 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ###
2
+ # take a file containing image filepaths and return a file also containing detected objects
3
+ #
4
+
5
+ # the input csv file must contain an 'image_file' column containing all the image filepaths
6
+ # #
7
+
8
+
9
+ import os
10
+ import clip
11
+ import torch
12
+
13
+ import pandas as pd
14
+ from PIL import Image
15
+ from torchvision.datasets import CIFAR100
16
+ from tqdm import tqdm
17
+
18
+ # this dataset gives us the object classes
19
+ cifar100 = CIFAR100(root=os.path.expanduser("~/.cache"), download=True, train=False)
20
+
21
+ def save_checkpoint(checkpoint_path,df, object_list):
22
+ output_df = df.copy()
23
+ output_df['clip_recognized_objects'] = object_list
24
+ output_df.to_csv(checkpoint_path,
25
+ index= False, # don't write a new 'Index' column
26
+ )
27
+ print("Saved checkpoint!")
28
+
29
+ def load_checkpoint(checkpoint_path):
30
+ try:
31
+ print("reading checkpoint at ", checkpoint_path)
32
+ df = pd.read_csv(checkpoint_path)
33
+
34
+ cached_objects = {
35
+ row['image_file']: row['clip_recognized_objects']
36
+ for _, row in df.iterrows()
37
+ }
38
+ print(f"Checkpoint loaded succesfully to cache: {len(cached_objects)} processed files")
39
+ return cached_objects
40
+ except:
41
+ print("Checkpoint was not loaded")
42
+ return cached_objects_dict
43
+
44
+ def get_checkpoint_path(output_path):
45
+ #checkpoint_path = "checkpoint" + os.path.basename(output_path)
46
+ #checkpoint_path = os.path.join( os.path.dirname(output_path), checkpoint_path)
47
+ #return checkpoint_path
48
+ return output_path
49
+
50
+
51
+
52
+ cached_objects_dict = {} # to avoid recomputing
53
+
54
+ def get_objects(filepath, model, preprocess, device, cached_objects_dict):
55
+ objects = cached_objects_dict.get(filepath)
56
+ if objects is None:
57
+ objects = get_objects_in_image(filepath, model, preprocess, device)
58
+ cached_objects_dict[filepath] = objects
59
+ return objects
60
+
61
+ def get_objects_in_image(image_filepath, model, preprocess, device):
62
+
63
+
64
+ # Prepare the inputs
65
+ image = Image.open(image_filepath).resize((600,600))
66
+ image_input = preprocess(image).unsqueeze(0).to(device)
67
+ text_inputs = torch.cat([clip.tokenize(f"a photo of a {c}") for c in cifar100.classes]).to(device)
68
+
69
+ # Calculate features
70
+ with torch.no_grad():
71
+ image_features = model.encode_image(image_input)
72
+ text_features = model.encode_text(text_inputs)
73
+
74
+ # Pick the top 5 most similar labels for the image
75
+ image_features /= image_features.norm(dim=-1, keepdim=True)
76
+ text_features /= text_features.norm(dim=-1, keepdim=True)
77
+ similarity = (100.0 * image_features @ text_features.T).softmax(dim=-1)
78
+ values, indices = similarity[0].topk(5)
79
+
80
+
81
+ # Append the the result
82
+ #print("\nTop predictions:\n")
83
+ objects = []
84
+ for value, index in zip(values, indices):
85
+ objects.append((cifar100.classes[index], value.item()))
86
+ # print(f"{cifar100.classes[index]:>16s}: {100 * value.item():.2f}%")
87
+ return objects
88
+
89
+
90
+
91
+ def clip_object_detection(input_csv, output_csv):
92
+
93
+ checkpoint_path = get_checkpoint_path(output_csv)
94
+ cached_objects_dict = load_checkpoint(checkpoint_path)
95
+
96
+
97
+ # Load the model
98
+ device = "cuda" if torch.cuda.is_available() else "cpu"
99
+ model, preprocess = clip.load('ViT-B/32', device)
100
+ text_inputs = torch.cat([clip.tokenize(f"a photo of a {c}") for c in cifar100.classes]).to(device)
101
+
102
+ recognized_objects_per_image = []
103
+ processed_files = set(cached_objects_dict.keys())
104
+
105
+ df = pd.read_csv(input_csv)
106
+
107
+ iterable_list = list(enumerate( df['image_file']))
108
+ for elem in tqdm(iterable_list):
109
+ idx = elem[0]
110
+ filepath = elem[1]
111
+
112
+ #save checkpoint every 50 files
113
+ if (not (len(processed_files) % 49)
114
+ ):
115
+ print(f"Images processed: {len(processed_files)}")
116
+ save_checkpoint(checkpoint_path, df.iloc[:idx], recognized_objects_per_image)
117
+
118
+ objects = get_objects(
119
+ filepath, model, preprocess, device,
120
+ cached_objects_dict
121
+ )
122
+ recognized_objects_per_image.append(objects)
123
+ processed_files.add(filepath)
124
+
125
+ recognized_objects_per_image = pd.Series(recognized_objects_per_image)
126
+
127
+ return recognized_objects_per_image
128
+
129
+
130
+
131
+
132
+ import argparse
133
+
134
+
135
+ if __name__ == "__main__":
136
+
137
+ parser = argparse.ArgumentParser(prog="CLIP object recognition",
138
+ description='Recognizes the top 5 main objects per image in an image list')
139
+
140
+ parser.add_argument("--input_csv", "-in", metavar='in', type=str, nargs=1,
141
+ help='input file containing images-paths for object recognition.',
142
+ #default=[default_painting_folder]
143
+ )
144
+ parser.add_argument("--output_csv", "-out", metavar='out', type=str, nargs=1,
145
+ help='output file containing images-paths + recognized objects'
146
+ #default=[default_interpretation_folder]
147
+ )
148
+ args = parser.parse_args()
149
+ input_csv_file = args.input_csv[0]
150
+ output_csv_file = args.output_csv[0]
151
+
152
+ print(">>> input file: " , input_csv_file)
153
+ print(">>> output file: ", output_csv_file)
154
+
155
+
156
+ # perform object recognition
157
+ recognized_objects_per_image = clip_object_detection(input_csv_file, output_csv_file)
158
+
159
+ # add a column with the recognized objects
160
+ output_df = pd.read_csv(input_csv_file)
161
+ output_df['clip_recognized_objects'] = recognized_objects_per_image
162
+ output_df.to_csv(output_csv_file,
163
+ index= False, # don't write a new 'Index' column
164
+ )
165
+
166
+
167
+
imageprocessing/color_detection.py ADDED
@@ -0,0 +1,1897 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (c) 2022. Bart Lamiroy (Bart.Lamiroy@univ-reims.fr) and subsequent contributors
2
+ # as per git commit history. All rights reserved.
3
+ #
4
+ # La Muse, Leveraging Artificial Intelligence for Sparking Inspiration
5
+ # https://hal.archives-ouvertes.fr/hal-03470467/
6
+ #
7
+ # This code is licenced under the GNU LESSER GENERAL PUBLIC LICENSE
8
+ # Version 3, 29 June 2007
9
+
10
+ # This code is an adaptation in Python on original JavaScript code by Chirag Mehta - http://chir.ag/projects/ntc |
11
+ # The original script is released under the: Creative Commons License: Attribution 2.5 http://creativecommons.org/licenses/by/2.5/
12
+ import math
13
+
14
+ # var n_match = ntc.name("#6195ED");
15
+ # n_rgb = n_match[0]; // This is the RGB value of the closest matching color
16
+ # n_name = n_match[1]; // This is the text string for the name of the match
17
+ # n_exactmatch = n_match[2]; // True if exact color match, False if close-match
18
+ #
19
+ # alert(n_match);
20
+
21
+ static_names_old = [
22
+ ["000000", "Black"],
23
+ ["000080", "Navy Blue"],
24
+ ["0000C8", "Dark Blue"],
25
+ ["0000FF", "Blue"],
26
+ ["000741", "Stratos"],
27
+ ["001B1C", "Swamp"],
28
+ ["002387", "Resolution Blue"],
29
+ ["002900", "Deep Fir"],
30
+ ["002E20", "Burnham"],
31
+ ["002FA7", "International Klein Blue"],
32
+ ["003153", "Prussian Blue"],
33
+ ["003366", "Midnight Blue"],
34
+ ["003399", "Smalt"],
35
+ ["003532", "Deep Teal"],
36
+ ["003E40", "Cyprus"],
37
+ ["004620", "Kaitoke Green"],
38
+ ["0047AB", "Cobalt"],
39
+ ["004816", "Crusoe"],
40
+ ["004950", "Sherpa Blue"],
41
+ #["0056A7", "Endeavour"],
42
+ ["00581A", "Camarone"],
43
+ ["0066CC", "Science Blue"],
44
+ ["0066FF", "Blue Ribbon"],
45
+ ["00755E", "Tropical Rain Forest"],
46
+ #["0076A3", "Allports"],
47
+ ["007BA7", "Deep Cerulean"],
48
+ ["007EC7", "Lochmara"],
49
+ ["007FFF", "Azure Radiance"],
50
+ ["008080", "Teal"],
51
+ ["0095B6", "Bondi Blue"],
52
+ ["009DC4", "Pacific Blue"],
53
+ ["00A693", "Persian Green"],
54
+ ["00A86B", "Jade"],
55
+ ["00CC99", "Caribbean Green"],
56
+ ["00CCCC", "Robin's Egg Blue"],
57
+ ["00FF00", "Green"],
58
+ ["00FF7F", "Spring Green"],
59
+ ["00FFFF", "Cyan / Aqua"],
60
+ ["010D1A", "Blue Charcoal"],
61
+ ["011635", "Midnight"],
62
+ ["011D13", "Holly"],
63
+ ["012731", "Daintree"],
64
+ ["01361C", "Cardin Green"],
65
+ ["01371A", "County Green"],
66
+ ["013E62", "Astronaut Blue"],
67
+ ["013F6A", "Regal Blue"],
68
+ ["014B43", "Aqua Deep"],
69
+ ["015E85", "Orient"],
70
+ ["016162", "Blue Stone"],
71
+ ["016D39", "Fun Green"],
72
+ ["01796F", "Pine Green"],
73
+ ["017987", "Blue Lagoon"],
74
+ ["01826B", "Deep Sea"],
75
+ ["01A368", "Green Haze"],
76
+ ["022D15", "English Holly"],
77
+ ["02402C", "Sherwood Green"],
78
+ ["02478E", "Congress Blue"],
79
+ ["024E46", "Evening Sea"],
80
+ ["026395", "Bahama Blue"],
81
+ #["02866F", "Observatory"],
82
+ ["02A4D3", "Cerulean"],
83
+ ["03163C", "Tangaroa"],
84
+ ["032B52", "Green Vogue"],
85
+ #["036A6E", "Mosque"],
86
+ ["041004", "Midnight Moss"],
87
+ ["041322", "Black Pearl"],
88
+ ["042E4C", "Blue Whale"],
89
+ ["044022", "Zuccini"],
90
+ ["044259", "Teal Blue"],
91
+ ["051040", "Deep Cove"],
92
+ ["051657", "Gulf Blue"],
93
+ ["055989", "Venice Blue"],
94
+ ["056F57", "Watercourse"],
95
+ ["062A78", "Catalina Blue"],
96
+ ["063537", "Tiber"],
97
+ ["069B81", "Gossamer"],
98
+ ["06A189", "Niagara"],
99
+ ["073A50", "Tarawera"],
100
+ ["080110", "Jaguar"],
101
+ ["081910", "Black Bean"],
102
+ ["082567", "Deep Sapphire"],
103
+ ["088370", "Elf Green"],
104
+ ["08E8DE", "Bright Turquoise"],
105
+ ["092256", "Downriver"],
106
+ ["09230F", "Palm Green"],
107
+ #["09255D", "Madison"],
108
+ ["093624", "Bottle Green"],
109
+ ["095859", "Deep Sea Green"],
110
+ #["097F4B", "Salem"],
111
+ ["0A001C", "Black Russian"],
112
+ ["0A480D", "Dark Fern"],
113
+ ["0A6906", "Japanese Laurel"],
114
+ ["0A6F75", "Atoll"],
115
+ ["0B0B0B", "Cod Gray"],
116
+ ["0B0F08", "Marshland"],
117
+ ["0B1107", "Gordons Green"],
118
+ ["0B1304", "Black Forest"],
119
+ #["0B6207", "San Felix"],
120
+ ["0BDA51", "Malachite"],
121
+ ["0C0B1D", "Ebony"],
122
+ ["0C0D0F", "Woodsmoke"],
123
+ ["0C1911", "Racing Green"],
124
+ ["0C7A79", "Surfie Green"],
125
+ ["0C8990", "Blue Chill"],
126
+ ["0D0332", "Black Rock"],
127
+ ["0D1117", "Bunker"],
128
+ ["0D1C19", "Aztec"],
129
+ ["0D2E1C", "Bush"],
130
+ ["0E0E18", "Cinder"],
131
+ ["0E2A30", "Firefly"],
132
+ ["0F2D9E", "Torea Bay"],
133
+ ["10121D", "Vulcan"],
134
+ ["101405", "Green Waterloo"],
135
+ ["105852", "Eden"],
136
+ ["110C6C", "Arapawa"],
137
+ ["120A8F", "Ultramarine"],
138
+ ["123447", "Elephant"],
139
+ ["126B40", "Jewel"],
140
+ ["130000", "Diesel"],
141
+ ["130A06", "Asphalt"],
142
+ ["13264D", "Blue Zodiac"],
143
+ ["134F19", "Parsley"],
144
+ ["140600", "Nero"],
145
+ ["1450AA", "Tory Blue"],
146
+ #["151F4C", "Bunting"],
147
+ ["1560BD", "Denim"],
148
+ #["15736B", "Genoa"],
149
+ ["161928", "Mirage"],
150
+ ["161D10", "Hunter Green"],
151
+ ["162A40", "Big Stone"],
152
+ ["163222", "Celtic"],
153
+ ["16322C", "Timber Green"],
154
+ ["163531", "Gable Green"],
155
+ ["171F04", "Pine Tree"],
156
+ ["175579", "Chathams Blue"],
157
+ ["182D09", "Deep Forest Green"],
158
+ ["18587A", "Blumine"],
159
+ ["19330E", "Palm Leaf"],
160
+ ["193751", "Nile Blue"],
161
+ ["1959A8", "Fun Blue"],
162
+ ["1A1A68", "Lucky Point"],
163
+ ["1AB385", "Mountain Meadow"],
164
+ ["1B0245", "Tolopea"],
165
+ #["1B1035", "Haiti"],
166
+ ["1B127B", "Deep Koamaru"],
167
+ ["1B1404", "Acadia"],
168
+ ["1B2F11", "Seaweed"],
169
+ ["1B3162", "Biscay"],
170
+ #["1B659D", "Matisse"],
171
+ ["1C1208", "Crowshead"],
172
+ ["1C1E13", "Rangoon Green"],
173
+ ["1C39BB", "Persian Blue"],
174
+ ["1C402E", "Everglade"],
175
+ ["1C7C7D", "Elm"],
176
+ ["1D6142", "Green Pea"],
177
+ #["1E0F04", "Creole"],
178
+ ["1E1609", "Karaka"],
179
+ #["1E1708", "El Paso"],
180
+ ["1E385B", "Cello"],
181
+ ["1E433C", "Te Papa Green"],
182
+ ["1E90FF", "Dodger Blue"],
183
+ ["1E9AB0", "Eastern Blue"],
184
+ ["1F120F", "Night Rider"],
185
+ ["1FC2C2", "Java"],
186
+ ["20208D", "Jacksons Purple"],
187
+ ["202E54", "Cloud Burst"],
188
+ ["204852", "Blue Dianne"],
189
+ ["211A0E", "Eternity"],
190
+ ["220878", "Deep Blue"],
191
+ ["228B22", "Forest Green"],
192
+ ["233418", "Mallard"],
193
+ ["240A40", "Violet"],
194
+ #["240C02", "Kilamanjaro"],
195
+ ["242A1D", "Log Cabin"],
196
+ ["242E16", "Black Olive"],
197
+ ["24500F", "Green House"],
198
+ ["251607", "Graphite"],
199
+ ["251706", "Cannon Black"],
200
+ #["251F4F", "Port Gore"],
201
+ ["25272C", "Shark"],
202
+ ["25311C", "Green Kelp"],
203
+ ["2596D1", "Curious Blue"],
204
+ ["260368", "Paua"],
205
+ #["26056A", "Paris M"],
206
+ ["261105", "Wood Bark"],
207
+ #["261414", "Gondola"],
208
+ ["262335", "Steel Gray"],
209
+ ["26283B", "Ebony Clay"],
210
+ #["273A81", "Bay of Many"],
211
+ #["27504B", "Plantation"],
212
+ ["278A5B", "Eucalyptus"],
213
+ ["281E15", "Oil"],
214
+ ["283A77", "Astronaut"],
215
+ ["286ACD", "Mariner"],
216
+ ["290C5E", "Violent Violet"],
217
+ #["292130", "Bastille"],
218
+ #["292319", "Zeus"],
219
+ ["292937", "Charade"],
220
+ ["297B9A", "Jelly Bean"],
221
+ ["29AB87", "Jungle Green"],
222
+ ["2A0359", "Cherry Pie"],
223
+ ["2A140E", "Coffee Bean"],
224
+ ["2A2630", "Baltic Sea"],
225
+ ["2A380B", "Turtle Green"],
226
+ ["2A52BE", "Cerulean Blue"],
227
+ ["2B0202", "Sepia Black"],
228
+ ["2B194F", "Valhalla"],
229
+ ["2B3228", "Heavy Metal"],
230
+ ["2C0E8C", "Blue Gem"],
231
+ ["2C1632", "Revolver"],
232
+ ["2C2133", "Bleached Cedar"],
233
+ ["2C8C84", "Lochinvar"],
234
+ ["2D2510", "Mikado"],
235
+ ["2D383A", "Outer Space"],
236
+ ["2D569B", "St Tropaz"],
237
+ ["2E0329", "Jacaranda"],
238
+ ["2E1905", "Jacko Bean"],
239
+ ["2E3222", "Rangitoto"],
240
+ ["2E3F62", "Rhino"],
241
+ ["2E8B57", "Sea Green"],
242
+ #["2EBFD4", "Scooter"],
243
+ ["2F270E", "Onion"],
244
+ #["2F3CB3", "Governor Bay"],
245
+ ["2F519E", "Sapphire"],
246
+ ["2F5A57", "Spectra"],
247
+ ["2F6168", "Casal"],
248
+ ["300529", "Melanzane"],
249
+ ["301F1E", "Cocoa Brown"],
250
+ ["302A0F", "Woodrush"],
251
+ #["304B6A", "San Juan"],
252
+ ["30D5C8", "Turquoise"],
253
+ ["311C17", "Eclipse"],
254
+ ["314459", "Pickled Bluewood"],
255
+ ["315BA1", "Azure"],
256
+ ["31728D", "Calypso"],
257
+ ["317D82", "Paradiso"],
258
+ ["32127A", "Persian Indigo"],
259
+ ["32293A", "Blackcurrant"],
260
+ ["323232", "Mine Shaft"],
261
+ #["325D52", "Stromboli"],
262
+ ["327C14", "Bilbao"],
263
+ ["327DA0", "Astral"],
264
+ ["33036B", "Christalle"],
265
+ ["33292F", "Thunder"],
266
+ ["33CC99", "Shamrock"],
267
+ ["341515", "Tamarind"],
268
+ #["350036", "Mardi Gras"],
269
+ ["350E42", "Valentino"],
270
+ ["350E57", "Jagger"],
271
+ ["353542", "Tuna"],
272
+ ["354E8C", "Chambray"],
273
+ #["363050", "Martinique"],
274
+ #["363534", "Tuatara"],
275
+ #["363C0D", "Waiouru"],
276
+ #["36747D", "Ming"],
277
+ ["368716", "La Palma"],
278
+ ["370202", "Chocolate"],
279
+ #["371D09", "Clinker"],
280
+ ["37290E", "Brown Tumbleweed"],
281
+ ["373021", "Birch"],
282
+ ["377475", "Oracle"],
283
+ ["380474", "Blue Diamond"],
284
+ ["381A51", "Grape"],
285
+ ["383533", "Dune"],
286
+ ["384555", "Oxford Blue"],
287
+ ["384910", "Clover"],
288
+ ["394851", "Limed Spruce"],
289
+ #["396413", "Dell"],
290
+ #["3A0020", "Toledo"],
291
+ ["3A2010", "Sambuca"],
292
+ ["3A2A6A", "Jacarta"],
293
+ #["3A686C", "William"],
294
+ #["3A6A47", "Killarney"],
295
+ #["3AB09E", "Keppel"],
296
+ #["3B000B", "Temptress"],
297
+ ["3B0910", "Aubergine"],
298
+ #["3B1F1F", "Jon"],
299
+ ["3B2820", "Treehouse"],
300
+ ["3B7A57", "Amazon"],
301
+ ["3B91B4", "Boston Blue"],
302
+ ["3C0878", "Windsor"],
303
+ ["3C1206", "Rebel"],
304
+ ["3C1F76", "Meteorite"],
305
+ ["3C2005", "Dark Ebony"],
306
+ ["3C3910", "Camouflage"],
307
+ ["3C4151", "Bright Gray"],
308
+ ["3C4443", "Cape Cod"],
309
+ ["3C493A", "Lunar Green"],
310
+ ["3D0C02", "Bean "],
311
+ ["3D2B1F", "Bistre"],
312
+ ["3D7D52", "Goblin"],
313
+ ["3E0480", "Kingfisher Daisy"],
314
+ ["3E1C14", "Cedar"],
315
+ ["3E2B23", "English Walnut"],
316
+ ["3E2C1C", "Black Marlin"],
317
+ ["3E3A44", "Ship Gray"],
318
+ ["3EABBF", "Pelorous"],
319
+ ["3F2109", "Bronze"],
320
+ ["3F2500", "Cola"],
321
+ ["3F3002", "Madras"],
322
+ ["3F307F", "Minsk"],
323
+ ["3F4C3A", "Cabbage Pont"],
324
+ #["3F583B", "Tom Thumb"],
325
+ ["3F5D53", "Mineral Green"],
326
+ #["3FC1AA", "Puerto Rico"],
327
+ ["3FFF00", "Harlequin"],
328
+ ["401801", "Brown Pod"],
329
+ ["40291D", "Cork"],
330
+ ["403B38", "Masala"],
331
+ ["403D19", "Thatch Green"],
332
+ ["405169", "Fiord"],
333
+ ["40826D", "Viridian"],
334
+ ["40A860", "Chateau Green"],
335
+ ["410056", "Ripe Plum"],
336
+ ["411F10", "Paco"],
337
+ ["412010", "Deep Oak"],
338
+ ["413C37", "Merlin"],
339
+ ["414257", "Gun Powder"],
340
+ ["414C7D", "East Bay"],
341
+ ["4169E1", "Royal Blue"],
342
+ ["41AA78", "Ocean Green"],
343
+ ["420303", "Burnt Maroon"],
344
+ ["423921", "Lisbon Brown"],
345
+ ["427977", "Faded Jade"],
346
+ ["431560", "Scarlet Gum"],
347
+ #["433120", "Iroko"],
348
+ ["433E37", "Armadillo"],
349
+ ["434C59", "River Bed"],
350
+ ["436A0D", "Green Leaf"],
351
+ ["44012D", "Barossa"],
352
+ ["441D00", "Morocco Brown"],
353
+ #["444954", "Mako"],
354
+ ["454936", "Kelp"],
355
+ #["456CAC", "San Marino"],
356
+ ["45B1E8", "Picton Blue"],
357
+ #["460B41", "Loulou"],
358
+ ["462425", "Crater Brown"],
359
+ ["465945", "Gray Asparagus"],
360
+ ["4682B4", "Steel Blue"],
361
+ ["480404", "Rustic Red"],
362
+ ["480607", "Bulgarian Rose"],
363
+ #["480656", "Clairvoyant"],
364
+ ["481C1C", "Cocoa Bean"],
365
+ ["483131", "Woody Brown"],
366
+ ["483C32", "Taupe"],
367
+ #["49170C", "Van Cleef"],
368
+ ["492615", "Brown Derby"],
369
+ ["49371B", "Metallic Bronze"],
370
+ ["495400", "Verdun Green"],
371
+ ["496679", "Blue Bayoux"],
372
+ ["497183", "Bismark"],
373
+ ["4A2A04", "Bracken"],
374
+ ["4A3004", "Deep Bronze"],
375
+ ["4A3C30", "Mondo"],
376
+ ["4A4244", "Tundora"],
377
+ ["4A444B", "Gravel"],
378
+ ["4A4E5A", "Trout"],
379
+ ["4B0082", "Pigment Indigo"],
380
+ ["4B5D52", "Nandor"],
381
+ ["4C3024", "Saddle"],
382
+ ["4C4F56", "Abbey"],
383
+ ["4D0135", "Blackberry"],
384
+ ["4D0A18", "Cab Sav"],
385
+ #["4D1E01", "Indian Tan"],
386
+ ["4D282D", "Cowboy"],
387
+ ["4D282E", "Livid Brown"],
388
+ #["4D3833", "Rock"],
389
+ #["4D3D14", "Punga"],
390
+ ["4D400F", "Bronzetone"],
391
+ ["4D5328", "Woodland"],
392
+ ["4E0606", "Mahogany"],
393
+ ["4E2A5A", "Bossanova"],
394
+ ["4E3B41", "Matterhorn"],
395
+ ["4E420C", "Bronze Olive"],
396
+ ["4E4562", "Mulled Wine"],
397
+ #["4E6649", "Axolotl"],
398
+ ["4E7F9E", "Wedgewood"],
399
+ #["4EABD1", "Shakespeare"],
400
+ ["4F1C70", "Honey Flower"],
401
+ ["4F2398", "Daisy Bush"],
402
+ ["4F69C6", "Indigo"],
403
+ ["4F7942", "Fern Green"],
404
+ ["4F9D5D", "Fruit Salad"],
405
+ ["4FA83D", "Apple"],
406
+ ["504351", "Mortar"],
407
+ ["507096", "Kashmir Blue"],
408
+ #["507672", "Cutty Sark"],
409
+ ["50C878", "Emerald"],
410
+ ["514649", "Emperor"],
411
+ ["516E3D", "Chalet Green"],
412
+ #["517C66", "Como"],
413
+ ["51808F", "Smalt Blue"],
414
+ #["52001F", "Castro"],
415
+ ["520C17", "Maroon Oak"],
416
+ #["523C94", "Gigas"],
417
+ ["533455", "Voodoo"],
418
+ ["534491", "Victoria"],
419
+ ["53824B", "Hippie Green"],
420
+ ["541012", "Heath"],
421
+ ["544333", "Judge Gray"],
422
+ ["54534D", "Fuscous Gray"],
423
+ #["549019", "Vida Loca"],
424
+ ["55280C", "Cioccolato"],
425
+ ["555B10", "Saratoga"],
426
+ #["556D56", "Finlandia"],
427
+ ["5590D9", "Havelock Blue"],
428
+ ["56B4BE", "Fountain Blue"],
429
+ ["578363", "Spring Leaves"],
430
+ ["583401", "Saddle Brown"],
431
+ ["585562", "Scarpa Flow"],
432
+ ["587156", "Cactus"],
433
+ ["589AAF", "Hippie Blue"],
434
+ ["591D35", "Wine Berry"],
435
+ ["592804", "Brown Bramble"],
436
+ ["593737", "Congo Brown"],
437
+ #["594433", "Millbrook"],
438
+ ["5A6E9C", "Waikawa Gray"],
439
+ ["5A87A0", "Horizon"],
440
+ #["5B3013", "Jambalaya"],
441
+ ["5C0120", "Bordeaux"],
442
+ ["5C0536", "Mulberry Wood"],
443
+ ["5C2E01", "Carnaby Tan"],
444
+ ["5C5D75", "Comet"],
445
+ ["5D1E0F", "Redwood"],
446
+ #["5D4C51", "Don Juan"],
447
+ #["5D5C58", "Chicago"],
448
+ ["5D5E37", "Verdigris"],
449
+ #["5D7747", "Dingley"],
450
+ ["5DA19F", "Breaker Bay"],
451
+ #["5E483E", "Kabul"],
452
+ #["5E5D3B", "Hemlock"],
453
+ ["5F3D26", "Irish Coffee"],
454
+ ["5F5F6E", "Mid Gray"],
455
+ ["5F6672", "Shuttle Gray"],
456
+ ["5FA777", "Aqua Forest"],
457
+ #["5FB3AC", "Tradewind"],
458
+ ["604913", "Horses Neck"],
459
+ ["605B73", "Smoky"],
460
+ ["606E68", "Corduroy"],
461
+ ["6093D1", "Danube"],
462
+ ["612718", "Espresso"],
463
+ ["614051", "Eggplant"],
464
+ #["615D30", "Costa Del Sol"],
465
+ ["61845F", "Glade Green"],
466
+ #["622F30", "Buccaneer"],
467
+ #["623F2D", "Quincy"],
468
+ ["624E9A", "Butterfly Bush"],
469
+ ["625119", "West Coast"],
470
+ ["626649", "Finch"],
471
+ ["639A8F", "Patina"],
472
+ ["63B76C", "Fern"],
473
+ ["6456B7", "Blue Violet"],
474
+ ["646077", "Dolphin"],
475
+ ["646463", "Storm Dust"],
476
+ ["646A54", "Siam"],
477
+ #["646E75", "Nevada"],
478
+ ["6495ED", "Cornflower Blue"],
479
+ #["64CCDB", "Viking"],
480
+ ["65000B", "Rosewood"],
481
+ ["651A14", "Cherrywood"],
482
+ ["652DC1", "Purple Heart"],
483
+ ["657220", "Fern Frond"],
484
+ ["65745D", "Willow Grove"],
485
+ #["65869F", "Hoki"],
486
+ #["660045", "Pompadour"],
487
+ ["660099", "Purple"],
488
+ ["66023C", "Tyrian Purple"],
489
+ ["661010", "Dark Tan"],
490
+ ["66B58F", "Silver Tree"],
491
+ ["66FF00", "Bright Green"],
492
+ ["66FF66", "Screamin' Green"],
493
+ ["67032D", "Black Rose"],
494
+ #["675FA6", "Scampi"],
495
+ ["676662", "Ironside Gray"],
496
+ ["678975", "Viridian Green"],
497
+ #["67A712", "Christi"],
498
+ ["683600", "Nutmeg Wood Finish"],
499
+ #["685558", "Zambezi"],
500
+ ["685E6E", "Salt Box"],
501
+ #["692545", "Tawny Port"],
502
+ #["692D54", "Finn"],
503
+ ["695F62", "Scorpion"],
504
+ #["697E9A", "Lynch"],
505
+ ["6A442E", "Spice"],
506
+ ["6A5D1B", "Himalaya"],
507
+ ["6A6051", "Soya Bean"],
508
+ #["6B2A14", "Hairy Heath"],
509
+ ["6B3FA0", "Royal Purple"],
510
+ #["6B4E31", "Shingle Fawn"],
511
+ #["6B5755", "Dorado"],
512
+ ["6B8BA2", "Bermuda Gray"],
513
+ ["6B8E23", "Olive Drab"],
514
+ #["6C3082", "Eminence"],
515
+ ["6CDAE7", "Turquoise Blue"],
516
+ ["6D0101", "Lonestar"],
517
+ ["6D5E54", "Pine Cone"],
518
+ ["6D6C6C", "Dove Gray"],
519
+ ["6D9292", "Juniper"],
520
+ ["6D92A1", "Gothic"],
521
+ ["6E0902", "Red Oxide"],
522
+ ["6E1D14", "Moccaccino"],
523
+ ["6E4826", "Pickled Bean"],
524
+ #["6E4B26", "Dallas"],
525
+ #["6E6D57", "Kokoda"],
526
+ ["6E7783", "Pale Sky"],
527
+ ["6F440C", "Cafe Royale"],
528
+ #["6F6A61", "Flint"],
529
+ ["6F8E63", "Highland"],
530
+ ["6F9D02", "Limeade"],
531
+ #["6FD0C5", "Downy"],
532
+ ["701C1C", "Persian Plum"],
533
+ ["704214", "Sepia"],
534
+ ["704A07", "Antique Bronze"],
535
+ ["704F50", "Ferra"],
536
+ ["706555", "Coffee"],
537
+ ["708090", "Slate Gray"],
538
+ ["711A00", "Cedar Wood Finish"],
539
+ ["71291D", "Metallic Copper"],
540
+ #["714693", "Affair"],
541
+ #["714AB2", "Studio"],
542
+ ["715D47", "Tobacco Brown"],
543
+ ["716338", "Yellow Metal"],
544
+ ["716B56", "Peat"],
545
+ ["716E10", "Olivetone"],
546
+ ["717486", "Storm Gray"],
547
+ ["718080", "Sirocco"],
548
+ ["71D9E2", "Aquamarine Blue"],
549
+ ["72010F", "Venetian Red"],
550
+ ["724A2F", "Old Copper"],
551
+ #["726D4E", "Go Ben"],
552
+ ["727B89", "Raven"],
553
+ ["731E8F", "Seance"],
554
+ ["734A12", "Raw Umber"],
555
+ #["736C9F", "Kimberly"],
556
+ ["736D58", "Crocodile"],
557
+ ["737829", "Crete"],
558
+ #["738678", "Xanadu"],
559
+ ["74640D", "Spicy Mustard"],
560
+ ["747D63", "Limed Ash"],
561
+ ["747D83", "Rolling Stone"],
562
+ ["748881", "Blue Smoke"],
563
+ #["749378", "Laurel"],
564
+ ["74C365", "Mantis"],
565
+ ["755A57", "Russett"],
566
+ #["7563A8", "Deluge"],
567
+ ["76395D", "Cosmic"],
568
+ ["7666C6", "Blue Marguerite"],
569
+ #["76BD17", "Lima"],
570
+ ["76D7EA", "Sky Blue"],
571
+ ["770F05", "Dark Burgundy"],
572
+ #["771F1F", "Crown of Thorns"],
573
+ ["773F1A", "Walnut"],
574
+ #["776F61", "Pablo"],
575
+ ["778120", "Pacifika"],
576
+ ["779E86", "Oxley"],
577
+ ["77DD77", "Pastel Green"],
578
+ ["780109", "Japanese Maple"],
579
+ ["782D19", "Mocha"],
580
+ ["782F16", "Peanut"],
581
+ ["78866B", "Camouflage Green"],
582
+ ["788A25", "Wasabi"],
583
+ ["788BBA", "Ship Cove"],
584
+ ["78A39C", "Sea Nymph"],
585
+ ["795D4C", "Roman Coffee"],
586
+ ["796878", "Old Lavender"],
587
+ ["796989", "Rum"],
588
+ ["796A78", "Fedora"],
589
+ ["796D62", "Sandstone"],
590
+ ["79DEEC", "Spray"],
591
+ ["7A013A", "Siren"],
592
+ ["7A58C1", "Fuchsia Blue"],
593
+ ["7A7A7A", "Boulder"],
594
+ ["7A89B8", "Wild Blue Yonder"],
595
+ #["7AC488", "De York"],
596
+ ["7B3801", "Red Beech"],
597
+ ["7B3F00", "Cinnamon"],
598
+ ["7B6608", "Yukon Gold"],
599
+ #["7B7874", "Tapa"],
600
+ #["7B7C94", "Waterloo "],
601
+ ["7B8265", "Flax Smoke"],
602
+ ["7B9F80", "Amulet"],
603
+ ["7BA05B", "Asparagus"],
604
+ ["7C1C05", "Kenyan Copper"],
605
+ ["7C7631", "Pesto"],
606
+ ["7C778A", "Topaz"],
607
+ ["7C7B7A", "Concord"],
608
+ ["7C7B82", "Jumbo"],
609
+ ["7C881A", "Trendy Green"],
610
+ #["7CA1A6", "Gumbo"],
611
+ ["7CB0A1", "Acapulco"],
612
+ ["7CB7BB", "Neptune"],
613
+ ["7D2C14", "Pueblo"],
614
+ ["7DA98D", "Bay Leaf"],
615
+ ["7DC8F7", "Malibu"],
616
+ ["7DD8C6", "Bermuda"],
617
+ ["7E3A15", "Copper Canyon"],
618
+ #["7F1734", "Claret"],
619
+ ["7F3A02", "Peru Tan"],
620
+ ["7F626D", "Falcon"],
621
+ ["7F7589", "Mobster"],
622
+ ["7F76D3", "Moody Blue"],
623
+ ["7FFF00", "Chartreuse"],
624
+ ["7FFFD4", "Aquamarine"],
625
+ ["800000", "Maroon"],
626
+ ["800B47", "Rose Bud Cherry"],
627
+ ["801818", "Falu Red"],
628
+ ["80341F", "Red Robin"],
629
+ ["803790", "Vivid Violet"],
630
+ ["80461B", "Russet"],
631
+ ["807E79", "Friar Gray"],
632
+ ["808000", "Olive"],
633
+ ["808080", "Gray"],
634
+ ["80B3AE", "Gulf Stream"],
635
+ ["80B3C4", "Glacier"],
636
+ ["80CCEA", "Seagull"],
637
+ ["81422C", "Nutmeg"],
638
+ ["816E71", "Spicy Pink"],
639
+ ["817377", "Empress"],
640
+ ["819885", "Spanish Green"],
641
+ ["826F65", "Sand Dune"],
642
+ ["828685", "Gunsmoke"],
643
+ ["828F72", "Battleship Gray"],
644
+ ["831923", "Merlot"],
645
+ ["837050", "Shadow"],
646
+ ["83AA5D", "Chelsea Cucumber"],
647
+ #["83D0C6", "Monte Carlo"],
648
+ ["843179", "Plum"],
649
+ ["84A0A0", "Granny Smith"],
650
+ ["8581D9", "Chetwode Blue"],
651
+ #["858470", "Bandicoot"],
652
+ #["859FAF", "Bali Hai"],
653
+ #["85C4CC", "Half Baked"],
654
+ ["860111", "Red Devil"],
655
+ ["863C3C", "Lotus"],
656
+ ["86483C", "Ironstone"],
657
+ ["864D1E", "Bull Shot"],
658
+ ["86560A", "Rusty Nail"],
659
+ #["868974", "Bitter"],
660
+ ["86949F", "Regent Gray"],
661
+ ["871550", "Disco"],
662
+ ["87756E", "Americano"],
663
+ ["877C7B", "Hurricane"],
664
+ ["878D91", "Oslo Gray"],
665
+ #["87AB39", "Sushi"],
666
+ ["885342", "Spicy Mix"],
667
+ ["886221", "Kumera"],
668
+ ["888387", "Suva Gray"],
669
+ ["888D65", "Avocado"],
670
+ ["893456", "Camelot"],
671
+ ["893843", "Solid Pink"],
672
+ ["894367", "Cannon Pink"],
673
+ ["897D6D", "Makara"],
674
+ ["8A3324", "Burnt Umber"],
675
+ #["8A73D6", "True V"],
676
+ ["8A8360", "Clay Creek"],
677
+ ["8A8389", "Monsoon"],
678
+ #["8A8F8A", "Stack"],
679
+ ["8AB9F1", "Jordy Blue"],
680
+ ["8B00FF", "Electric Violet"],
681
+ ["8B0723", "Monarch"],
682
+ ["8B6B0B", "Corn Harvest"],
683
+ ["8B8470", "Olive Haze"],
684
+ #["8B847E", "Schooner"],
685
+ ["8B8680", "Natural Gray"],
686
+ ["8B9C90", "Mantle"],
687
+ #["8B9FEE", "Portage"],
688
+ #["8BA690", "Envy"],
689
+ ["8BA9A5", "Cascade"],
690
+ ["8BE6D8", "Riptide"],
691
+ ["8C055E", "Cardinal Pink"],
692
+ ["8C472F", "Mule Fawn"],
693
+ ["8C5738", "Potters Clay"],
694
+ ["8C6495", "Trendy Pink"],
695
+ ["8D0226", "Paprika"],
696
+ ["8D3D38", "Sanguine Brown"],
697
+ ["8D3F3F", "Tosca"],
698
+ ["8D7662", "Cement"],
699
+ ["8D8974", "Granite Green"],
700
+ ["8D90A1", "Manatee"],
701
+ ["8DA8CC", "Polo Blue"],
702
+ ["8E0000", "Red Berry"],
703
+ #["8E4D1E", "Rope"],
704
+ ["8E6F70", "Opium"],
705
+ #["8E775E", "Domino"],
706
+ ["8E8190", "Mamba"],
707
+ #["8EABC1", "Nepal"],
708
+ #["8F021C", "Pohutukawa"],
709
+ #["8F3E33", "El Salva"],
710
+ ["8F4B0E", "Korma"],
711
+ ["8F8176", "Squirrel"],
712
+ ["8FD6B4", "Vista Blue"],
713
+ ["900020", "Burgundy"],
714
+ ["901E1E", "Old Brick"],
715
+ ["907874", "Hemp"],
716
+ ["907B71", "Almond Frost"],
717
+ ["908D39", "Sycamore"],
718
+ ["92000A", "Sangria"],
719
+ ["924321", "Cumin"],
720
+ ["926F5B", "Beaver"],
721
+ ["928573", "Stonewall"],
722
+ ["928590", "Venus"],
723
+ ["9370DB", "Medium Purple"],
724
+ ["93CCEA", "Cornflower"],
725
+ ["93DFB8", "Algae Green"],
726
+ ["944747", "Copper Rust"],
727
+ ["948771", "Arrowtown"],
728
+ ["950015", "Scarlett"],
729
+ #["956387", "Strikemaster"],
730
+ ["959396", "Mountain Mist"],
731
+ ["960018", "Carmine"],
732
+ ["964B00", "Brown"],
733
+ ["967059", "Leather"],
734
+ ["9678B6", "Purple Mountain's Majesty"],
735
+ ["967BB6", "Lavender Purple"],
736
+ #["96A8A1", "Pewter"],
737
+ ["96BBAB", "Summer Green"],
738
+ #["97605D", "Au Chico"],
739
+ #["9771B5", "Wisteria"],
740
+ ["97CD2D", "Atlantis"],
741
+ ["983D61", "Vin Rouge"],
742
+ ["9874D3", "Lilac Bush"],
743
+ ["98777B", "Bazaar"],
744
+ #["98811B", "Hacienda"],
745
+ ["988D77", "Pale Oyster"],
746
+ ["98FF98", "Mint Green"],
747
+ ["990066", "Fresh Eggplant"],
748
+ ["991199", "Violet Eggplant"],
749
+ ["991613", "Tamarillo"],
750
+ #["991B07", "Totem Pole"],
751
+ ["996666", "Copper Rose"],
752
+ ["9966CC", "Amethyst"],
753
+ ["997A8D", "Mountbatten Pink"],
754
+ ["9999CC", "Blue Bell"],
755
+ ["9A3820", "Prairie Sand"],
756
+ ["9A6E61", "Toast"],
757
+ ["9A9577", "Gurkha"],
758
+ ["9AB973", "Olivine"],
759
+ ["9AC2B8", "Shadow Green"],
760
+ ["9B4703", "Oregon"],
761
+ ["9B9E8F", "Lemon Grass"],
762
+ ["9C3336", "Stiletto"],
763
+ ["9D5616", "Hawaiian Tan"],
764
+ ["9DACB7", "Gull Gray"],
765
+ ["9DC209", "Pistachio"],
766
+ ["9DE093", "Granny Smith Apple"],
767
+ ["9DE5FF", "Anakiwa"],
768
+ ["9E5302", "Chelsea Gem"],
769
+ ["9E5B40", "Sepia Skin"],
770
+ ["9EA587", "Sage"],
771
+ ["9EA91F", "Citron"],
772
+ ["9EB1CD", "Rock Blue"],
773
+ ["9EDEE0", "Morning Glory"],
774
+ ["9F381D", "Cognac"],
775
+ ["9F821C", "Reef Gold"],
776
+ ["9F9F9C", "Star Dust"],
777
+ ["9FA0B1", "Santas Gray"],
778
+ #["9FD7D3", "Sinbad"],
779
+ ["9FDD8C", "Feijoa"],
780
+ ["A02712", "Tabasco"],
781
+ ["A1750D", "Buttered Rum"],
782
+ ["A1ADB5", "Hit Gray"],
783
+ ["A1C50A", "Citrus"],
784
+ ["A1DAD7", "Aqua Island"],
785
+ ["A1E9DE", "Water Leaf"],
786
+ ["A2006D", "Flirt"],
787
+ ["A23B6C", "Rouge"],
788
+ ["A26645", "Cape Palliser"],
789
+ ["A2AAB3", "Gray Chateau"],
790
+ #["A2AEAB", "Edward"],
791
+ ["A3807B", "Pharlap"],
792
+ ["A397B4", "Amethyst Smoke"],
793
+ ["A3E3ED", "Blizzard Blue"],
794
+ ["A4A49D", "Delta"],
795
+ ["A4A6D3", "Wistful"],
796
+ ["A4AF6E", "Green Smoke"],
797
+ ["A50B5E", "Jazzberry Jam"],
798
+ ["A59B91", "Zorba"],
799
+ ["A5CB0C", "Bahia"],
800
+ ["A62F20", "Roof Terracotta"],
801
+ ["A65529", "Paarl"],
802
+ ["A68B5B", "Barley Corn"],
803
+ ["A69279", "Donkey Brown"],
804
+ ["A6A29A", "Dawn"],
805
+ ["A72525", "Mexican Red"],
806
+ ["A7882C", "Luxor Gold"],
807
+ ["A85307", "Rich Gold"],
808
+ ["A86515", "Reno Sand"],
809
+ ["A86B6B", "Coral Tree"],
810
+ ["A8989B", "Dusty Gray"],
811
+ ["A899E6", "Dull Lavender"],
812
+ ["A8A589", "Tallow"],
813
+ ["A8AE9C", "Bud"],
814
+ ["A8AF8E", "Locust"],
815
+ ["A8BD9F", "Norway"],
816
+ ["A8E3BD", "Chinook"],
817
+ ["A9A491", "Gray Olive"],
818
+ ["A9ACB6", "Aluminium"],
819
+ ["A9B2C3", "Cadet Blue"],
820
+ ["A9B497", "Schist"],
821
+ ["A9BDBF", "Tower Gray"],
822
+ ["A9BEF2", "Perano"],
823
+ ["A9C6C2", "Opal"],
824
+ ["AA375A", "Night Shadz"],
825
+ ["AA4203", "Fire"],
826
+ ["AA8B5B", "Muesli"],
827
+ ["AA8D6F", "Sandal"],
828
+ ["AAA5A9", "Shady Lady"],
829
+ #["AAA9CD", "Logan"],
830
+ ["AAABB7", "Spun Pearl"],
831
+ ["AAD6E6", "Regent St Blue"],
832
+ ["AAF0D1", "Magic Mint"],
833
+ ["AB0563", "Lipstick"],
834
+ ["AB3472", "Royal Heath"],
835
+ ["AB917A", "Sandrift"],
836
+ ["ABA0D9", "Cold Purple"],
837
+ ["ABA196", "Bronco"],
838
+ ["AC8A56", "Limed Oak"],
839
+ #["AC91CE", "East Side"],
840
+ ["AC9E22", "Lemon Ginger"],
841
+ ["ACA494", "Napa"],
842
+ #["ACA586", "Hillary"],
843
+ ["ACA59F", "Cloudy"],
844
+ ["ACACAC", "Silver Chalice"],
845
+ ["ACB78E", "Swamp Green"],
846
+ ["ACCBB1", "Spring Rain"],
847
+ ["ACDD4D", "Conifer"],
848
+ ["ACE1AF", "Celadon"],
849
+ ["AD781B", "Mandalay"],
850
+ ["ADBED1", "Casper"],
851
+ ["ADDFAD", "Moss Green"],
852
+ ["ADE6C4", "Padua"],
853
+ ["ADFF2F", "Green Yellow"],
854
+ ["AE4560", "Hippie Pink"],
855
+ ["AE6020", "Desert"],
856
+ ["AE809E", "Bouquet"],
857
+ ["AF4035", "Medium Carmine"],
858
+ ["AF4D43", "Apple Blossom"],
859
+ ["AF593E", "Brown Rust"],
860
+ ["AF8751", "Driftwood"],
861
+ ["AF8F2C", "Alpine"],
862
+ ["AF9F1C", "Lucky"],
863
+ ["AFA09E", "Martini"],
864
+ ["AFB1B8", "Bombay"],
865
+ ["AFBDD9", "Pigeon Post"],
866
+ ["B04C6A", "Cadillac"],
867
+ ["B05D54", "Matrix"],
868
+ ["B05E81", "Tapestry"],
869
+ ["B06608", "Mai Tai"],
870
+ ["B09A95", "Del Rio"],
871
+ ["B0E0E6", "Powder Blue"],
872
+ ["B0E313", "Inch Worm"],
873
+ ["B10000", "Bright Red"],
874
+ ["B14A0B", "Vesuvius"],
875
+ ["B1610B", "Pumpkin Skin"],
876
+ #["B16D52", "Santa Fe"],
877
+ ["B19461", "Teak"],
878
+ ["B1E2C1", "Fringy Flower"],
879
+ ["B1F4E7", "Ice Cold"],
880
+ ["B20931", "Shiraz"],
881
+ ["B2A1EA", "Biloba Flower"],
882
+ ["B32D29", "Tall Poppy"],
883
+ ["B35213", "Fiery Orange"],
884
+ ["B38007", "Hot Toddy"],
885
+ ["B3AF95", "Taupe Gray"],
886
+ ["B3C110", "La Rioja"],
887
+ #["B43332", "Well Read"],
888
+ ["B44668", "Blush"],
889
+ ["B4CFD3", "Jungle Mist"],
890
+ ["B57281", "Turkish Rose"],
891
+ ["B57EDC", "Lavender"],
892
+ ["B5A27F", "Mongoose"],
893
+ ["B5B35C", "Olive Green"],
894
+ ["B5D2CE", "Jet Stream"],
895
+ ["B5ECDF", "Cruise"],
896
+ ["B6316C", "Hibiscus"],
897
+ ["B69D98", "Thatch"],
898
+ ["B6B095", "Heathered Gray"],
899
+ ["B6BAA4", "Eagle"],
900
+ ["B6D1EA", "Spindle"],
901
+ ["B6D3BF", "Gum Leaf"],
902
+ ["B7410E", "Rust"],
903
+ ["B78E5C", "Muddy Waters"],
904
+ ["B7A214", "Sahara"],
905
+ ["B7A458", "Husk"],
906
+ #["B7B1B1", "Nobel"],
907
+ #["B7C3D0", "Heather"],
908
+ #["B7F0BE", "Madang"],
909
+ ["B81104", "Milano Red"],
910
+ ["B87333", "Copper"],
911
+ ["B8B56A", "Gimblet"],
912
+ ["B8C1B1", "Green Spring"],
913
+ ["B8C25D", "Celery"],
914
+ ["B8E0F9", "Sail"],
915
+ ["B94E48", "Chestnut"],
916
+ #["B95140", "Crail"],
917
+ ["B98D28", "Marigold"],
918
+ ["B9C46A", "Wild Willow"],
919
+ ["B9C8AC", "Rainee"],
920
+ ["BA0101", "Guardsman Red"],
921
+ ["BA450C", "Rock Spray"],
922
+ ["BA6F1E", "Bourbon"],
923
+ ["BA7F03", "Pirate Gold"],
924
+ ["BAB1A2", "Nomad"],
925
+ ["BAC7C9", "Submarine"],
926
+ ["BAEEF9", "Charlotte"],
927
+ ["BB3385", "Medium Red Violet"],
928
+ ["BB8983", "Brandy Rose"],
929
+ ["BBD009", "Rio Grande"],
930
+ ["BBD7C1", "Surf"],
931
+ ["BCC9C2", "Powder Ash"],
932
+ ["BD5E2E", "Tuscany"],
933
+ ["BD978E", "Quicksand"],
934
+ ["BDB1A8", "Silk"],
935
+ #["BDB2A1", "Malta"],
936
+ ["BDB3C7", "Chatelle"],
937
+ ["BDBBD7", "Lavender Gray"],
938
+ ["BDBDC6", "French Gray"],
939
+ ["BDC8B3", "Clay Ash"],
940
+ ["BDC9CE", "Loblolly"],
941
+ ["BDEDFD", "French Pass"],
942
+ ["BEA6C3", "London Hue"],
943
+ ["BEB5B7", "Pink Swan"],
944
+ ["BEDE0D", "Fuego"],
945
+ ["BF5500", "Rose of Sharon"],
946
+ ["BFB8B0", "Tide"],
947
+ ["BFBED8", "Blue Haze"],
948
+ ["BFC1C2", "Silver Sand"],
949
+ ["BFC921", "Key Lime Pie"],
950
+ #["BFDBE2", "Ziggurat"],
951
+ ["BFFF00", "Lime"],
952
+ ["C02B18", "Thunderbird"],
953
+ ["C04737", "Mojo"],
954
+ ["C08081", "Old Rose"],
955
+ ["C0C0C0", "Silver"],
956
+ ["C0D3B9", "Pale Leaf"],
957
+ ["C0D8B6", "Pixie Green"],
958
+ #["C1440E", "Tia Maria"],
959
+ ["C154C1", "Fuchsia Pink"],
960
+ ["C1A004", "Buddha Gold"],
961
+ ["C1B7A4", "Bison Hide"],
962
+ ["C1BAB0", "Tea"],
963
+ ["C1BECD", "Gray Suit"],
964
+ ["C1D7B0", "Sprout"],
965
+ #["C1F07C", "Sulu"],
966
+ #["C26B03", "Indochine"],
967
+ ["C2955D", "Twine"],
968
+ ["C2BDB6", "Cotton Seed"],
969
+ ["C2CAC4", "Pumice"],
970
+ ["C2E8E5", "Jagged Ice"],
971
+ ["C32148", "Maroon Flush"],
972
+ ["C3B091", "Indian Khaki"],
973
+ ["C3BFC1", "Pale Slate"],
974
+ ["C3C3BD", "Gray Nickel"],
975
+ ["C3CDE6", "Periwinkle Gray"],
976
+ ["C3D1D1", "Tiara"],
977
+ ["C3DDF9", "Tropical Blue"],
978
+ ["C41E3A", "Cardinal"],
979
+ ["C45655", "Fuzzy Wuzzy Brown"],
980
+ ["C45719", "Orange Roughy"],
981
+ ["C4C4BC", "Mist Gray"],
982
+ ["C4D0B0", "Coriander"],
983
+ ["C4F4EB", "Mint Tulip"],
984
+ ["C54B8C", "Mulberry"],
985
+ ["C59922", "Nugget"],
986
+ ["C5994B", "Tussock"],
987
+ ["C5DBCA", "Sea Mist"],
988
+ ["C5E17A", "Yellow Green"],
989
+ ["C62D42", "Brick Red"],
990
+ #["C6726B", "Contessa"],
991
+ ["C69191", "Oriental Pink"],
992
+ #["C6A84B", "Roti"],
993
+ ["C6C3B5", "Ash"],
994
+ ["C6C8BD", "Kangaroo"],
995
+ ["C6E610", "Las Palmas"],
996
+ ["C7031E", "Monza"],
997
+ ["C71585", "Red Violet"],
998
+ ["C7BCA2", "Coral Reef"],
999
+ ["C7C1FF", "Melrose"],
1000
+ ["C7C4BF", "Cloud"],
1001
+ ["C7C9D5", "Ghost"],
1002
+ ["C7CD90", "Pine Glade"],
1003
+ ["C7DDE5", "Botticelli"],
1004
+ ["C88A65", "Antique Brass"],
1005
+ ["C8A2C8", "Lilac"],
1006
+ ["C8A528", "Hokey Pokey"],
1007
+ ["C8AABF", "Lily"],
1008
+ ["C8B568", "Laser"],
1009
+ ["C8E3D7", "Edgewater"],
1010
+ ["C96323", "Piper"],
1011
+ #["C99415", "Pizza"],
1012
+ ["C9A0DC", "Light Wisteria"],
1013
+ ["C9B29B", "Rodeo Dust"],
1014
+ ["C9B35B", "Sundance"],
1015
+ ["C9B93B", "Earls Green"],
1016
+ ["C9C0BB", "Silver Rust"],
1017
+ ["C9D9D2", "Conch"],
1018
+ ["C9FFA2", "Reef"],
1019
+ ["C9FFE5", "Aero Blue"],
1020
+ ["CA3435", "Flush Mahogany"],
1021
+ ["CABB48", "Turmeric"],
1022
+ ["CADCD4", "Paris White"],
1023
+ ["CAE00D", "Bitter Lemon"],
1024
+ ["CAE6DA", "Skeptic"],
1025
+ ["CB8FA9", "Viola"],
1026
+ ["CBCAB6", "Foggy Gray"],
1027
+ ["CBD3B0", "Green Mist"],
1028
+ ["CBDBD6", "Nebula"],
1029
+ ["CC3333", "Persian Red"],
1030
+ ["CC5500", "Burnt Orange"],
1031
+ #["CC7722", "Ochre"],
1032
+ #["CC8899", "Puce"],
1033
+ ["CCCAA8", "Thistle Green"],
1034
+ ["CCCCFF", "Periwinkle"],
1035
+ ["CCFF00", "Electric Lime"],
1036
+ #["CD5700", "Tenn"],
1037
+ ["CD5C5C", "Chestnut Rose"],
1038
+ ["CD8429", "Brandy Punch"],
1039
+ #["CDF4FF", "Onahau"],
1040
+ ["CEB98F", "Sorrell Brown"],
1041
+ ["CEBABA", "Cold Turkey"],
1042
+ ["CEC291", "Yuma"],
1043
+ ["CEC7A7", "Chino"],
1044
+ ["CFA39D", "Eunry"],
1045
+ ["CFB53B", "Old Gold"],
1046
+ ["CFDCCF", "Tasman"],
1047
+ ["CFE5D2", "Surf Crest"],
1048
+ ["CFF9F3", "Humming Bird"],
1049
+ #["CFFAF4", "Scandal"],
1050
+ ["D05F04", "Red Stage"],
1051
+ ["D06DA1", "Hopbush"],
1052
+ ["D07D12", "Meteor"],
1053
+ ["D0BEF8", "Perfume"],
1054
+ #["D0C0E5", "Prelude"],
1055
+ ["D0F0C0", "Tea Green"],
1056
+ ["D18F1B", "Geebung"],
1057
+ ["D1BEA8", "Vanilla"],
1058
+ ["D1C6B4", "Soft Amber"],
1059
+ ["D1D2CA", "Celeste"],
1060
+ ["D1D2DD", "Mischka"],
1061
+ ["D1E231", "Pear"],
1062
+ ["D2691E", "Hot Cinnamon"],
1063
+ ["D27D46", "Raw Sienna"],
1064
+ ["D29EAA", "Careys Pink"],
1065
+ ["D2B48C", "Tan"],
1066
+ ["D2DA97", "Deco"],
1067
+ ["D2F6DE", "Blue Romance"],
1068
+ #["D2F8B0", "Gossip"],
1069
+ ["D3CBBA", "Sisal"],
1070
+ ["D3CDC5", "Swirl"],
1071
+ ["D47494", "Charm"],
1072
+ ["D4B6AF", "Clam Shell"],
1073
+ ["D4BF8D", "Straw"],
1074
+ ["D4C4A8", "Akaroa"],
1075
+ ["D4CD16", "Bird Flower"],
1076
+ ["D4D7D9", "Iron"],
1077
+ ["D4DFE2", "Geyser"],
1078
+ ["D4E2FC", "Hawkes Blue"],
1079
+ #["D54600", "Grenadier"],
1080
+ #["D591A4", "Can Can"],
1081
+ ["D59A6F", "Whiskey"],
1082
+ ["D5D195", "Winter Hazel"],
1083
+ ["D5F6E3", "Granny Apple"],
1084
+ ["D69188", "My Pink"],
1085
+ ["D6C562", "Tacha"],
1086
+ ["D6CEF6", "Moon Raker"],
1087
+ ["D6D6D1", "Quill Gray"],
1088
+ ["D6FFDB", "Snowy Mint"],
1089
+ ["D7837F", "New York Pink"],
1090
+ #["D7C498", "Pavlova"],
1091
+ ["D7D0FF", "Fog"],
1092
+ ["D84437", "Valencia"],
1093
+ ["D87C63", "Japonica"],
1094
+ #["D8BFD8", "Thistle"],
1095
+ ["D8C2D5", "Maverick"],
1096
+ ["D8FCFA", "Foam"],
1097
+ ["D94972", "Cabaret"],
1098
+ ["D99376", "Burning Sand"],
1099
+ ["D9B99B", "Cameo"],
1100
+ ["D9D6CF", "Timberwolf"],
1101
+ ["D9DCC1", "Tana"],
1102
+ ["D9E4F5", "Link Water"],
1103
+ ["D9F7FF", "Mabel"],
1104
+ ["DA3287", "Cerise"],
1105
+ ["DA5B38", "Flame Pea"],
1106
+ ["DA6304", "Bamboo"],
1107
+ ["DA6A41", "Red Damask"],
1108
+ ["DA70D6", "Orchid"],
1109
+ ["DA8A67", "Copperfield"],
1110
+ ["DAA520", "Golden Grass"],
1111
+ ["DAECD6", "Zanah"],
1112
+ ["DAF4F0", "Iceberg"],
1113
+ #["DAFAFF", "Oyster Bay"],
1114
+ ["DB5079", "Cranberry"],
1115
+ ["DB9690", "Petite Orchid"],
1116
+ #["DB995E", "Di Serria"],
1117
+ ["DBDBDB", "Alto"],
1118
+ ["DBFFF8", "Frosted Mint"],
1119
+ ["DC143C", "Crimson"],
1120
+ ["DC4333", "Punch"],
1121
+ ["DCB20C", "Galliano"],
1122
+ ["DCB4BC", "Blossom"],
1123
+ ["DCD747", "Wattle"],
1124
+ ["DCD9D2", "Westar"],
1125
+ ["DCDDCC", "Moon Mist"],
1126
+ ["DCEDB4", "Caper"],
1127
+ ["DCF0EA", "Swans Down"],
1128
+ ["DDD6D5", "Swiss Coffee"],
1129
+ ["DDF9F1", "White Ice"],
1130
+ ["DE3163", "Cerise Red"],
1131
+ #["DE6360", "Roman"],
1132
+ ["DEA681", "Tumbleweed"],
1133
+ ["DEBA13", "Gold Tips"],
1134
+ ["DEC196", "Brandy"],
1135
+ ["DECBC6", "Wafer"],
1136
+ ["DED4A4", "Sapling"],
1137
+ ["DED717", "Barberry"],
1138
+ ["DEE5C0", "Beryl Green"],
1139
+ ["DEF5FF", "Pattens Blue"],
1140
+ #["DF73FF", "Heliotrope"],
1141
+ #["DFBE6F", "Apache"],
1142
+ #["DFCD6F", "Chenin"],
1143
+ #["DFCFDB", "Lola"],
1144
+ ["DFECDA", "Willow Brook"],
1145
+ ["DFFF00", "Chartreuse Yellow"],
1146
+ ["E0B0FF", "Mauve"],
1147
+ ["E0B646", "Anzac"],
1148
+ ["E0B974", "Harvest Gold"],
1149
+ ["E0C095", "Calico"],
1150
+ ["E0FFFF", "Baby Blue"],
1151
+ #["E16865", "Sunglo"],
1152
+ #["E1BC64", "Equator"],
1153
+ ["E1C0C8", "Pink Flare"],
1154
+ ["E1E6D6", "Periglacial Blue"],
1155
+ #["E1EAD4", "Kidnapper"],
1156
+ #["E1F6E8", "Tara"],
1157
+ #["E25465", "Mandy"],
1158
+ ["E2725B", "Terracotta"],
1159
+ ["E28913", "Golden Bell"],
1160
+ #["E292C0", "Shocking"],
1161
+ ["E29418", "Dixie"],
1162
+ ["E29CD2", "Light Orchid"],
1163
+ #["E2D8ED", "Snuff"],
1164
+ ["E2EBED", "Mystic"],
1165
+ ["E2F3EC", "Apple Green"],
1166
+ ["E30B5C", "Razzmatazz"],
1167
+ ["E32636", "Alizarin Crimson"],
1168
+ ["E34234", "Cinnabar"],
1169
+ ["E3BEBE", "Cavern Pink"],
1170
+ ["E3F5E1", "Peppermint"],
1171
+ ["E3F988", "Mindaro"],
1172
+ ["E47698", "Deep Blush"],
1173
+ #["E49B0F", "Gamboge"],
1174
+ #["E4C2D5", "Melanie"],
1175
+ ["E4CFDE", "Twilight"],
1176
+ #["E4D1C0", "Bone"],
1177
+ ["E4D422", "Sunflower"],
1178
+ ["E4D5B7", "Grain Brown"],
1179
+ ["E4D69B", "Zombie"],
1180
+ ["E4F6E7", "Frostee"],
1181
+ ["E4FFD1", "Snow Flurry"],
1182
+ ["E52B50", "Amaranth"],
1183
+ ["E5841B", "Zest"],
1184
+ ["E5CCC9", "Dust Storm"],
1185
+ ["E5D7BD", "Stark White"],
1186
+ #["E5D8AF", "Hampton"],
1187
+ #["E5E0E1", "Bon Jour"],
1188
+ ["E5E5E5", "Mercury"],
1189
+ ["E5F9F6", "Polar"],
1190
+ ["E64E03", "Trinidad"],
1191
+ ["E6BE8A", "Gold Sand"],
1192
+ ["E6BEA5", "Cashmere"],
1193
+ ["E6D7B9", "Double Spanish White"],
1194
+ ["E6E4D4", "Satin Linen"],
1195
+ #["E6F2EA", "Harp"],
1196
+ ["E6F8F3", "Off Green"],
1197
+ ["E6FFE9", "Hint of Green"],
1198
+ ["E6FFFF", "Tranquil"],
1199
+ ["E77200", "Mango Tango"],
1200
+ ["E7730A", "Christine"],
1201
+ ["E79F8C", "Tonys Pink"],
1202
+ #["E79FC4", "Kobi"],
1203
+ ["E7BCB4", "Rose Fog"],
1204
+ ["E7BF05", "Corn"],
1205
+ ["E7CD8C", "Putty"],
1206
+ ["E7ECE6", "Gray Nurse"],
1207
+ ["E7F8FF", "Lily White"],
1208
+ ["E7FEFF", "Bubbles"],
1209
+ ["E89928", "Fire Bush"],
1210
+ ["E8B9B3", "Shilo"],
1211
+ ["E8E0D5", "Pearl Bush"],
1212
+ ["E8EBE0", "Green White"],
1213
+ ["E8F1D4", "Chrome White"],
1214
+ ["E8F2EB", "Gin"],
1215
+ ["E8F5F2", "Aqua Squeeze"],
1216
+ ["E96E00", "Clementine"],
1217
+ ["E97451", "Burnt Sienna"],
1218
+ ["E97C07", "Tahiti Gold"],
1219
+ ["E9CECD", "Oyster Pink"],
1220
+ ["E9D75A", "Confetti"],
1221
+ #["E9E3E3", "Ebb"],
1222
+ #["E9F8ED", "Ottoman"],
1223
+ ["E9FFFD", "Clear Day"],
1224
+ ["EA88A8", "Carissma"],
1225
+ #["EAAE69", "Porsche"],
1226
+ ["EAB33B", "Tulip Tree"],
1227
+ #["EAC674", "Rob Roy"],
1228
+ ["EADAB8", "Raffia"],
1229
+ ["EAE8D4", "White Rock"],
1230
+ ["EAF6EE", "Panache"],
1231
+ ["EAF6FF", "Solitude"],
1232
+ ["EAF9F5", "Aqua Spring"],
1233
+ ["EAFFFE", "Dew"],
1234
+ ["EB9373", "Apricot"],
1235
+ #["EBC2AF", "Zinnwaldite"],
1236
+ ["ECA927", "Fuel Yellow"],
1237
+ #["ECC54E", "Ronchi"],
1238
+ ["ECC7EE", "French Lilac"],
1239
+ #["ECCDB9", "Just Right"],
1240
+ ["ECE090", "Wild Rice"],
1241
+ ["ECEBBD", "Fall Green"],
1242
+ #["ECEBCE", "Aths Special"],
1243
+ ["ECF245", "Starship"],
1244
+ ["ED0A3F", "Red Ribbon"],
1245
+ ["ED7A1C", "Tango"],
1246
+ ["ED9121", "Carrot Orange"],
1247
+ ["ED989E", "Sea Pink"],
1248
+ ["EDB381", "Tacao"],
1249
+ ["EDC9AF", "Desert Sand"],
1250
+ ["EDCDAB", "Pancho"],
1251
+ ["EDDCB1", "Chamois"],
1252
+ ["EDEA99", "Primrose"],
1253
+ ["EDF5DD", "Frost"],
1254
+ ["EDF5F5", "Aqua Haze"],
1255
+ #["EDF6FF", "Zumthor"],
1256
+ #["EDF9F1", "Narvik"],
1257
+ ["EDFC84", "Honeysuckle"],
1258
+ ["EE82EE", "Lavender Magenta"],
1259
+ #["EEC1BE", "Beauty Bush"],
1260
+ ["EED794", "Chalky"],
1261
+ ["EED9C4", "Almond"],
1262
+ ["EEDC82", "Flax"],
1263
+ #["EEDEDA", "Bizarre"],
1264
+ ["EEE3AD", "Double Colonial White"],
1265
+ ["EEEEE8", "Cararra"],
1266
+ ["EEEF78", "Manz"],
1267
+ ["EEF0C8", "Tahuna Sands"],
1268
+ ["EEF0F3", "Athens Gray"],
1269
+ ["EEF3C3", "Tusk"],
1270
+ ["EEF4DE", "Loafer"],
1271
+ ["EEF6F7", "Catskill White"],
1272
+ ["EEFDFF", "Twilight Blue"],
1273
+ ["EEFF9A", "Jonquil"],
1274
+ ["EEFFE2", "Rice Flower"],
1275
+ ["EF863F", "Jaffa"],
1276
+ #["EFEFEF", "Gallery"],
1277
+ ["EFF2F3", "Porcelain"],
1278
+ #["F091A9", "Mauvelous"],
1279
+ ["F0D52D", "Golden Dream"],
1280
+ ["F0DB7D", "Golden Sand"],
1281
+ #["F0DC82", "Buff"],
1282
+ #["F0E2EC", "Prim"],
1283
+ ["F0E68C", "Khaki"],
1284
+ ["F0EEFD", "Selago"],
1285
+ ["F0EEFF", "Titan White"],
1286
+ ["F0F8FF", "Alice Blue"],
1287
+ ["F0FCEA", "Feta"],
1288
+ ["F18200", "Gold Drop"],
1289
+ #["F19BAB", "Wewak"],
1290
+ ["F1E788", "Sahara Sand"],
1291
+ ["F1E9D2", "Parchment"],
1292
+ ["F1E9FF", "Blue Chalk"],
1293
+ ["F1EEC1", "Mint Julep"],
1294
+ ["F1F1F1", "Seashell"],
1295
+ ["F1F7F2", "Saltpan"],
1296
+ ["F1FFAD", "Tidal"],
1297
+ ["F1FFC8", "Chiffon"],
1298
+ ["F2552A", "Flamingo"],
1299
+ ["F28500", "Tangerine"],
1300
+ ["F2C3B2", "Mandys Pink"],
1301
+ ["F2F2F2", "Concrete"],
1302
+ ["F2FAFA", "Black Squeeze"],
1303
+ ["F34723", "Pomegranate"],
1304
+ ["F3AD16", "Buttercup"],
1305
+ ["F3D69D", "New Orleans"],
1306
+ ["F3D9DF", "Vanilla Ice"],
1307
+ ["F3E7BB", "Sidecar"],
1308
+ ["F3E9E5", "Dawn Pink"],
1309
+ ["F3EDCF", "Wheatfield"],
1310
+ ["F3FB62", "Canary"],
1311
+ ["F3FBD4", "Orinoco"],
1312
+ #["F3FFD8", "Carla"],
1313
+ ["F400A1", "Hollywood Cerise"],
1314
+ ["F4A460", "Sandy brown"],
1315
+ ["F4C430", "Saffron"],
1316
+ ["F4D81C", "Ripe Lemon"],
1317
+ #["F4EBD3", "Janna"],
1318
+ #["F4F2EE", "Pampas"],
1319
+ ["F4F4F4", "Wild Sand"],
1320
+ ["F4F8FF", "Zircon"],
1321
+ ["F57584", "Froly"],
1322
+ ["F5C85C", "Cream Can"],
1323
+ #["F5C999", "Manhattan"],
1324
+ ["F5D5A0", "Maize"],
1325
+ ["F5DEB3", "Wheat"],
1326
+ ["F5E7A2", "Sandwisp"],
1327
+ ["F5E7E2", "Pot Pourri"],
1328
+ ["F5E9D3", "Albescent White"],
1329
+ ["F5EDEF", "Soft Peach"],
1330
+ ["F5F3E5", "Ecru White"],
1331
+ ["F5F5DC", "Beige"],
1332
+ ["F5FB3D", "Golden Fizz"],
1333
+ ["F5FFBE", "Australian Mint"],
1334
+ ["F64A8A", "French Rose"],
1335
+ ["F653A6", "Brilliant Rose"],
1336
+ ["F6A4C9", "Illusion"],
1337
+ ["F6F0E6", "Merino"],
1338
+ ["F6F7F7", "Black Haze"],
1339
+ ["F6FFDC", "Spring Sun"],
1340
+ ["F7468A", "Violet Red"],
1341
+ ["F77703", "Chilean Fire"],
1342
+ ["F77FBE", "Persian Pink"],
1343
+ ["F7B668", "Rajah"],
1344
+ ["F7C8DA", "Azalea"],
1345
+ ["F7DBE6", "We Peep"],
1346
+ ["F7F2E1", "Quarter Spanish White"],
1347
+ ["F7F5FA", "Whisper"],
1348
+ ["F7FAF7", "Snow Drift"],
1349
+ ["F8B853", "Casablanca"],
1350
+ ["F8C3DF", "Chantilly"],
1351
+ ["F8D9E9", "Cherub"],
1352
+ ["F8DB9D", "Marzipan"],
1353
+ ["F8DD5C", "Energy Yellow"],
1354
+ #["F8E4BF", "Givry"],
1355
+ ["F8F0E8", "White Linen"],
1356
+ ["F8F4FF", "Magnolia"],
1357
+ ["F8F6F1", "Spring Wood"],
1358
+ ["F8F7DC", "Coconut Cream"],
1359
+ ["F8F7FC", "White Lilac"],
1360
+ ["F8F8F7", "Desert Storm"],
1361
+ #["F8F99C", "Texas"],
1362
+ ["F8FACD", "Corn Field"],
1363
+ ["F8FDD3", "Mimosa"],
1364
+ ["F95A61", "Carnation"],
1365
+ ["F9BF58", "Saffron Mango"],
1366
+ ["F9E0ED", "Carousel Pink"],
1367
+ ["F9E4BC", "Dairy Cream"],
1368
+ ["F9E663", "Portica"],
1369
+ ["F9EAF3", "Amour"],
1370
+ ["F9F8E4", "Rum Swizzle"],
1371
+ ["F9FF8B", "Dolly"],
1372
+ ["F9FFF6", "Sugar Cane"],
1373
+ ["FA7814", "Ecstasy"],
1374
+ ["FA9D5A", "Tan Hide"],
1375
+ ["FAD3A2", "Corvette"],
1376
+ ["FADFAD", "Peach Yellow"],
1377
+ ["FAE600", "Turbo"],
1378
+ ["FAEAB9", "Astra"],
1379
+ ["FAECCC", "Champagne"],
1380
+ ["FAF0E6", "Linen"],
1381
+ ["FAF3F0", "Fantasy"],
1382
+ ["FAF7D6", "Citrine White"],
1383
+ ["FAFAFA", "Alabaster"],
1384
+ ["FAFDE4", "Hint of Yellow"],
1385
+ ["FAFFA4", "Milan"],
1386
+ ["FB607F", "Brink Pink"],
1387
+ ["FB8989", "Geraldine"],
1388
+ ["FBA0E3", "Lavender Rose"],
1389
+ #["FBA129", "Sea Buckthorn"],
1390
+ ["FBAC13", "Sun"],
1391
+ ["FBAED2", "Lavender Pink"],
1392
+ ["FBB2A3", "Rose Bud"],
1393
+ ["FBBEDA", "Cupid"],
1394
+ ["FBCCE7", "Classic Rose"],
1395
+ ["FBCEB1", "Apricot Peach"],
1396
+ ["FBE7B2", "Banana Mania"],
1397
+ ["FBE870", "Marigold Yellow"],
1398
+ #["FBE96C", "Festival"],
1399
+ ["FBEA8C", "Sweet Corn"],
1400
+ ["FBEC5D", "Candy Corn"],
1401
+ ["FBF9F9", "Hint of Red"],
1402
+ ["FBFFBA", "Shalimar"],
1403
+ ["FC0FC0", "Shocking Pink"],
1404
+ ["FC80A5", "Tickle Me Pink"],
1405
+ ["FC9C1D", "Tree Poppy"],
1406
+ ["FCC01E", "Lightning Yellow"],
1407
+ ["FCD667", "Goldenrod"],
1408
+ ["FCD917", "Candlelight"],
1409
+ ["FCDA98", "Cherokee"],
1410
+ ["FCF4D0", "Double Pearl Lusta"],
1411
+ ["FCF4DC", "Pearl Lusta"],
1412
+ ["FCF8F7", "Vista White"],
1413
+ ["FCFBF3", "Bianca"],
1414
+ ["FCFEDA", "Moon Glow"],
1415
+ ["FCFFE7", "China Ivory"],
1416
+ ["FCFFF9", "Ceramic"],
1417
+ ["FD0E35", "Torch Red"],
1418
+ ["FD5B78", "Wild Watermelon"],
1419
+ ["FD7B33", "Crusta"],
1420
+ ["FD7C07", "Sorbus"],
1421
+ ["FD9FA2", "Sweet Pink"],
1422
+ ["FDD5B1", "Light Apricot"],
1423
+ ["FDD7E4", "Pig Pink"],
1424
+ ["FDE1DC", "Cinderella"],
1425
+ ["FDE295", "Golden Glow"],
1426
+ ["FDE910", "Lemon"],
1427
+ ["FDF5E6", "Old Lace"],
1428
+ ["FDF6D3", "Half Colonial White"],
1429
+ ["FDF7AD", "Drover"],
1430
+ ["FDFEB8", "Pale Prim"],
1431
+ ["FDFFD5", "Cumulus"],
1432
+ ["FE28A2", "Persian Rose"],
1433
+ ["FE4C40", "Sunset Orange"],
1434
+ #["FE6F5E", "Bittersweet"],
1435
+ #["FE9D04", "California"],
1436
+ ["FEA904", "Yellow Sea"],
1437
+ ["FEBAAD", "Melon"],
1438
+ ["FED33C", "Bright Sun"],
1439
+ ["FED85D", "Dandelion"],
1440
+ #["FEDB8D", "Salomie"],
1441
+ ["FEE5AC", "Cape Honey"],
1442
+ #["FEEBF3", "Remy"],
1443
+ ["FEEFCE", "Oasis"],
1444
+ ["FEF0EC", "Bridesmaid"],
1445
+ ["FEF2C7", "Beeswax"],
1446
+ ["FEF3D8", "Bleach White"],
1447
+ ["FEF4CC", "Pipi"],
1448
+ ["FEF4DB", "Half Spanish White"],
1449
+ ["FEF4F8", "Wisp Pink"],
1450
+ ["FEF5F1", "Provincial Pink"],
1451
+ ["FEF7DE", "Half Dutch White"],
1452
+ #["FEF8E2", "Solitaire"],
1453
+ ["FEF8FF", "White Pointer"],
1454
+ ["FEF9E3", "Off Yellow"],
1455
+ ["FEFCED", "Orange White"],
1456
+ ["FF0000", "Red"],
1457
+ ["FF007F", "Rose"],
1458
+ ["FF00CC", "Purple Pizzazz"],
1459
+ ["FF00FF", "Magenta / Fuchsia"],
1460
+ ["FF2400", "Scarlet"],
1461
+ ["FF3399", "Wild Strawberry"],
1462
+ ["FF33CC", "Razzle Dazzle Rose"],
1463
+ ["FF355E", "Radical Red"],
1464
+ ["FF3F34", "Red Orange"],
1465
+ ["FF4040", "Coral Red"],
1466
+ ["FF4D00", "Vermilion"],
1467
+ ["FF4F00", "International Orange"],
1468
+ ["FF6037", "Outrageous Orange"],
1469
+ ["FF6600", "Blaze Orange"],
1470
+ ["FF66FF", "Pink Flamingo"],
1471
+ ["FF681F", "Orange"],
1472
+ ["FF69B4", "Hot Pink"],
1473
+ ["FF6B53", "Persimmon"],
1474
+ ["FF6FFF", "Blush Pink"],
1475
+ ["FF7034", "Burning Orange"],
1476
+ ["FF7518", "Pumpkin"],
1477
+ ["FF7D07", "Flamenco"],
1478
+ ["FF7F00", "Flush Orange"],
1479
+ ["FF7F50", "Coral"],
1480
+ ["FF8C69", "Salmon"],
1481
+ ["FF9000", "Pizazz"],
1482
+ #["FF910F", "West Side"],
1483
+ ["FF91A4", "Pink Salmon"],
1484
+ ["FF9933", "Neon Carrot"],
1485
+ ["FF9966", "Atomic Tangerine"],
1486
+ ["FF9980", "Vivid Tangerine"],
1487
+ ["FF9E2C", "Sunshade"],
1488
+ ["FFA000", "Orange Peel"],
1489
+ ["FFA194", "Mona Lisa"],
1490
+ ["FFA500", "Web Orange"],
1491
+ ["FFA6C9", "Carnation Pink"],
1492
+ ["FFAB81", "Hit Pink"],
1493
+ ["FFAE42", "Yellow Orange"],
1494
+ ["FFB0AC", "Cornflower Lilac"],
1495
+ ["FFB1B3", "Sundown"],
1496
+ #["FFB31F", "My Sin"],
1497
+ ["FFB555", "Texas Rose"],
1498
+ ["FFB7D5", "Cotton Candy"],
1499
+ ["FFB97B", "Macaroni and Cheese"],
1500
+ ["FFBA00", "Selective Yellow"],
1501
+ ["FFBD5F", "Koromiko"],
1502
+ ["FFBF00", "Amber"],
1503
+ ["FFC0A8", "Wax Flower"],
1504
+ ["FFC0CB", "Pink"],
1505
+ ["FFC3C0", "Your Pink"],
1506
+ ["FFC901", "Supernova"],
1507
+ ["FFCBA4", "Flesh"],
1508
+ ["FFCC33", "Sunglow"],
1509
+ ["FFCC5C", "Golden Tainoi"],
1510
+ ["FFCC99", "Peach Orange"],
1511
+ ["FFCD8C", "Chardonnay"],
1512
+ ["FFD1DC", "Pastel Pink"],
1513
+ ["FFD2B7", "Romantic"],
1514
+ ["FFD38C", "Grandis"],
1515
+ ["FFD700", "Gold"],
1516
+ ["FFD800", "School bus Yellow"],
1517
+ ["FFD8D9", "Cosmos"],
1518
+ ["FFDB58", "Mustard"],
1519
+ ["FFDCD6", "Peach Schnapps"],
1520
+ ["FFDDAF", "Caramel"],
1521
+ ["FFDDCD", "Tuft Bush"],
1522
+ ["FFDDCF", "Watusi"],
1523
+ ["FFDDF4", "Pink Lace"],
1524
+ ["FFDEAD", "Navajo White"],
1525
+ ["FFDEB3", "Frangipani"],
1526
+ ["FFE1DF", "Pippin"],
1527
+ ["FFE1F2", "Pale Rose"],
1528
+ ["FFE2C5", "Negroni"],
1529
+ ["FFE5A0", "Cream Brulee"],
1530
+ ["FFE5B4", "Peach"],
1531
+ ["FFE6C7", "Tequila"],
1532
+ ["FFE772", "Kournikova"],
1533
+ ["FFEAC8", "Sandy Beach"],
1534
+ #["FFEAD4", "Karry"],
1535
+ ["FFEC13", "Broom"],
1536
+ ["FFEDBC", "Colonial White"],
1537
+ ["FFEED8", "Derby"],
1538
+ #["FFEFA1", "Vis Vis"],
1539
+ ["FFEFC1", "Egg White"],
1540
+ ["FFEFD5", "Papaya Whip"],
1541
+ ["FFEFEC", "Fair Pink"],
1542
+ ["FFF0DB", "Peach Cream"],
1543
+ ["FFF0F5", "Lavender blush"],
1544
+ #["FFF14F", "Gorse"],
1545
+ ["FFF1B5", "Buttermilk"],
1546
+ ["FFF1D8", "Pink Lady"],
1547
+ ["FFF1EE", "Forget Me Not"],
1548
+ ["FFF1F9", "Tutu"],
1549
+ #["FFF39D", "Picasso"],
1550
+ ["FFF3F1", "Chardon"],
1551
+ ["FFF46E", "Paris Daisy"],
1552
+ ["FFF4CE", "Barley White"],
1553
+ #["FFF4DD", "Egg Sour"],
1554
+ ["FFF4E0", "Sazerac"],
1555
+ #["FFF4E8", "Serenade"],
1556
+ ["FFF4F3", "Chablis"],
1557
+ ["FFF5EE", "Seashell Peach"],
1558
+ ["FFF5F3", "Sauvignon"],
1559
+ ["FFF6D4", "Milk Punch"],
1560
+ ["FFF6DF", "Varden"],
1561
+ ["FFF6F5", "Rose White"],
1562
+ ["FFF8D1", "Baja White"],
1563
+ ["FFF9E2", "Gin Fizz"],
1564
+ ["FFF9E6", "Early Dawn"],
1565
+ ["FFFACD", "Lemon Chiffon"],
1566
+ ["FFFAF4", "Bridal Heath"],
1567
+ ["FFFBDC", "Scotch Mist"],
1568
+ ["FFFBF9", "Soapstone"],
1569
+ ["FFFC99", "Witch Haze"],
1570
+ ["FFFCEA", "Buttery White"],
1571
+ ["FFFCEE", "Island Spice"],
1572
+ ["FFFDD0", "Cream"],
1573
+ #["FFFDE6", "Chilean Heath"],
1574
+ ["FFFDE8", "Travertine"],
1575
+ ["FFFDF3", "Orchid White"],
1576
+ ["FFFDF4", "Quarter Pearl Lusta"],
1577
+ ["FFFEE1", "Half and Half"],
1578
+ ["FFFEEC", "Apricot White"],
1579
+ ["FFFEF0", "Rice Cake"],
1580
+ ["FFFEF6", "Black White"],
1581
+ #["FFFEFD", "Romance"],
1582
+ ["FFFF00", "Yellow"],
1583
+ ["FFFF66", "Laser Lemon"],
1584
+ ["FFFF99", "Pale Canary"],
1585
+ ["FFFFB4", "Portafino"],
1586
+ ["FFFFF0", "Ivory"],
1587
+ ["FFFFFF", "White"]
1588
+ ]
1589
+
1590
+
1591
+ #from
1592
+ # https://sashamaps.net/docs/resources/20-colors/
1593
+ static_names = [
1594
+ ["800000", "maroon"],
1595
+ ["9A6324", "brown"],
1596
+ ["469990","teal"],
1597
+ ["000075", "navy"],
1598
+ ["000000","black"],
1599
+ ["FF0000", "red"],
1600
+ ["F58231", "orange"],
1601
+ ["FFE119", "yellow"],
1602
+ ["3CB44B", "green"],
1603
+ ["42D4F4", "cyan"],
1604
+ ["4363D8", "blue"],
1605
+ ["F032E6", "magenta"],
1606
+ ["A9A9A9", "grey"],
1607
+ ["FABED4", "pink"],
1608
+ ["FFFAC8", "beige"],
1609
+ ["AAFFC3", "mint"],
1610
+ ["DCBEFF", "lavender"],
1611
+ ["FFFFFF", "white"],
1612
+ ]
1613
+
1614
+ # adopted from: Farbtastic 1.2
1615
+ # http://acko.net/dev/farbtastic
1616
+ # Color is a 7 character string starting with '#'
1617
+ def rgb(color: str):
1618
+ return [int(f'0x{color[1:3]}', 16), int(f'0x{color[3:5]}', 16), int(f'0x{color[5:7]}', 16)]
1619
+
1620
+ # adopted from: Farbtastic 1.2
1621
+ # http://acko.net/dev/farbtastic
1622
+ # Color is a 7 character string starting with '#'
1623
+ def hsl(color: str):
1624
+ rgb = [int(f'0x{color[1:3]}', 16) / 255, int(f'0x{color[3:5]}', 16) / 255, int(f'0x{color[5:7]}', 16) / 255]
1625
+ r, g, b = rgb[0], rgb[1], rgb[2]
1626
+
1627
+ min_value = min(r, min(g, b))
1628
+ max_value = max(r, max(g, b))
1629
+ delta = max_value - min_value
1630
+ l = (min_value + max_value) / 2
1631
+
1632
+ s = 0
1633
+ if 0 < l < 1:
1634
+ if l < 0.5:
1635
+ s = delta / (2 * l)
1636
+ else:
1637
+ s = delta / (2 - 2 * l)
1638
+
1639
+ h = 0
1640
+ if delta > 0:
1641
+
1642
+ if max == r and max != g:
1643
+ h += (g - b) / delta
1644
+ if max == g and max != b:
1645
+ h += (2 + (b - r) / delta)
1646
+ if max == b and max != r:
1647
+ h += (4 + (r - g) / delta)
1648
+
1649
+ h /= 6
1650
+
1651
+ return [(h * 255), (s * 255), (l * 255)]
1652
+
1653
+
1654
+ class Ntc:
1655
+
1656
+ def __init__(self):
1657
+ self.names = []
1658
+
1659
+ for i in range(len(static_names)):
1660
+ color = '#' + static_names[i][0]
1661
+ rgb_array = rgb(color)
1662
+ hsl_array = hsl(color)
1663
+ self.names.append(static_names[i])
1664
+ self.names[i].extend([rgb_array[0], rgb_array[1], rgb_array[2], hsl_array[0], hsl_array[1], hsl_array[2]])
1665
+
1666
+ def name(self, color: str):
1667
+
1668
+ color = color.upper()
1669
+ if len(color) < 3 or len(color) > 7:
1670
+ return ["#000000", "Invalid Color: " + color, False]
1671
+
1672
+ if len(color) % 3 == 0:
1673
+ color = "#" + color
1674
+
1675
+ if len(color) == 4:
1676
+ color = "#" + color[1] + color[1] + color[2] + color[2] + color[3] + color[3]
1677
+
1678
+ rgb_array = rgb(color)
1679
+ r, g, b = rgb_array[0], rgb_array[1], rgb_array[2]
1680
+
1681
+ hsl_array = hsl(color)
1682
+ h, s, l = hsl_array[0], hsl_array[1], hsl_array[2]
1683
+
1684
+ ndf1 = 0
1685
+ ndf2 = 0
1686
+ ndf = 0
1687
+ cl = -1
1688
+ df = -1
1689
+
1690
+ for i in range(len(self.names)):
1691
+ if color == "#" + self.names[i][0]:
1692
+ return ["#" + self.names[i][0], self.names[i][1], True]
1693
+
1694
+ ndf1 = math.pow(r - self.names[i][2], 2) + math.pow(g - self.names[i][3], 2) + math.pow(
1695
+ b - self.names[i][4], 2)
1696
+ ndf2 = math.pow(h - self.names[i][5], 2) + math.pow(s - self.names[i][6], 2) + math.pow(
1697
+ l - self.names[i][7], 2)
1698
+ ndf = ndf1 + ndf2 * 2
1699
+
1700
+ if df < 0 or df > ndf:
1701
+ df = ndf
1702
+ cl = i
1703
+
1704
+ if cl < 0:
1705
+ return ["#000000", "Invalid Color: " + color, False]
1706
+ else:
1707
+ return ["#" + self.names[cl][0], self.names[cl][1], False]
1708
+
1709
+
1710
+ #############################################
1711
+
1712
+
1713
+ # Copyright (c) 2022. Bart Lamiroy (Bart.Lamiroy@univ-reims.fr) and subsequent contributors
1714
+ # as per git commit history. All rights reserved.
1715
+ #
1716
+ # La Muse, Leveraging Artificial Intelligence for Sparking Inspiration
1717
+ # https://hal.archives-ouvertes.fr/hal-03470467/
1718
+ #
1719
+ # This code is licenced under the GNU LESSER GENERAL PUBLIC LICENSE
1720
+ # Version 3, 29 June 2007
1721
+
1722
+ import numpy as np
1723
+ import cv2
1724
+ from sklearn.cluster import MiniBatchKMeans
1725
+
1726
+
1727
+ # inspired from https://pyimagesearch.com/2014/07/07/color-quantization-opencv-using-k-means-clustering/
1728
+ def color_quantify(image: np.array, nb: int) -> np.array:
1729
+ # grab image width and height
1730
+ (h, w) = image.shape[:2]
1731
+
1732
+ # convert the image from the RGB color space to the L*a*b*
1733
+ # color space -- since we will be clustering using k-means
1734
+ # which is based on the euclidean distance, we'll use the
1735
+ # L*a*b* color space where the euclidean distance implies
1736
+ # perceptual meaning
1737
+ image = cv2.cvtColor(image, cv2.COLOR_BGR2LAB)
1738
+
1739
+ # reshape the image into a feature vector so that k-means
1740
+ # can be applied
1741
+ image = image.reshape((image.shape[0] * image.shape[1], 3))
1742
+
1743
+ # apply k-means using the specified number of clusters and
1744
+ # then create the quantized image based on the predictions
1745
+ clt = MiniBatchKMeans(n_clusters = nb)
1746
+ labels = clt.fit_predict(image)
1747
+ quant = clt.cluster_centers_.astype("uint8")[labels]
1748
+
1749
+ # reshape the feature vectors to images
1750
+ quant = quant.reshape((h, w, 3))
1751
+ quant = cv2.cvtColor(quant, cv2.COLOR_LAB2BGR)
1752
+
1753
+ return quant
1754
+
1755
+ # code adapted from https://stackoverflow.com/questions/50899692/most-dominant-color-in-rgb-image-opencv-numpy-python
1756
+ def bincount_app(a: np.array, nb: int):
1757
+ # Not reducing image colours to three significant bits per channel since image supposedly already
1758
+ # reduced.
1759
+ #a = a & int("11100000", 2)
1760
+ #cv2.imwrite("final_image.jpg",a)
1761
+
1762
+ a2D = a.reshape(-1,a.shape[-1])
1763
+
1764
+ col_range = (256, 256, 256) # generically : a2D.max(0)+1
1765
+ a1D = np.ravel_multi_index(a2D.T, col_range)
1766
+
1767
+ #return np.unravel_index(np.bincount(a1D).argmax(), col_range)
1768
+ return np.unravel_index(np.bincount(a1D).argpartition(-nb)[-nb:], col_range)
1769
+
1770
+ def int_array_to_hex_string(a: list) -> str:
1771
+ str_list = [ "{0:#0{1}x}".format(i,4)[2:] for i in a]
1772
+ return '#'+''.join(str_list)
1773
+
1774
+
1775
+ def get_color_names(image: np.array, nb_colors: int = 5):
1776
+ test_image = color_quantify(image, nb_colors)
1777
+ main_colors = [int_array_to_hex_string(i) for i in zip(*bincount_app(test_image, nb_colors))]
1778
+ naming = Ntc()
1779
+ main_color_names = [ naming.name(i)[1] for i in main_colors]
1780
+
1781
+ return main_color_names
1782
+
1783
+ cached_colors_dict = {} # to avoid recomputing
1784
+
1785
+ def get_colors(filepath, nb_colors: int = 5):
1786
+ colors = cached_colors_dict.get(filepath)
1787
+ if colors is None:
1788
+ colors = get_color_names(
1789
+ np.array(Image.open(filepath).resize((600,600) )),
1790
+ nb_colors
1791
+ )
1792
+ cached_colors_dict[filepath] = colors
1793
+
1794
+ return colors
1795
+
1796
+ def get_checkpoint_path(output_path):
1797
+ #checkpoint_path = "checkpoint" + os.path.basename(output_path)
1798
+ #checkpoint_path = os.path.join( os.path.dirname(output_path), checkpoint_path)
1799
+ #return checkpoint_path
1800
+ return output_path
1801
+
1802
+ def load_checkpoint(checkpoint_path):
1803
+ try:
1804
+ print("reading checkpoint at ", checkpoint_path)
1805
+ df = pd.read_csv(checkpoint_path)
1806
+
1807
+ cached_colors = {
1808
+ row['image_file']: row['colors']
1809
+ for _, row in df.iterrows()
1810
+ }
1811
+ print("Checkpoint loaded succesfully to cache")
1812
+ return cached_colors
1813
+ except:
1814
+ print("Checkpoint was not loaded")
1815
+ return cached_colors_dict
1816
+
1817
+ def save_checkpoint(checkpoint_path,df, color_list):
1818
+ output_df = df.copy()
1819
+ output_df['colors'] = color_list
1820
+ output_df.to_csv(checkpoint_path,
1821
+ index= False, # don't write a new 'Index' column
1822
+ )
1823
+ print("Saved checkpoint!")
1824
+
1825
+
1826
+
1827
+ ########################################
1828
+ # get_color_names(numpy.array(PIL.Image.open(painting) ) )
1829
+
1830
+ ########################################
1831
+ from PIL import Image
1832
+ from tqdm import tqdm
1833
+
1834
+
1835
+ #input_csv_directory = "/home/lvasquezreina/supproj/repo/M1-supervised_project/ARTEMIS/custom_scripts/emo_caption_custom_images/outputs/custom_captions.csv"
1836
+
1837
+ import pandas as pd
1838
+ import os
1839
+
1840
+ import argparse
1841
+
1842
+ if __name__ == "__main__":
1843
+
1844
+ parser = argparse.ArgumentParser(prog="ColorDetectionLaMuse",
1845
+ description='Detects the top 5 main colors per image in an image list')
1846
+
1847
+ parser.add_argument("--input_file", "-in", metavar='in', type=str, nargs=1,
1848
+ help='input file containing images-paths for color detection.',
1849
+ #default=[default_painting_folder]
1850
+ )
1851
+ parser.add_argument("--output_file", "-out", metavar='out', type=str, nargs=1,
1852
+ help='output file containing images-paths + detected colors'
1853
+ #default=[default_interpretation_folder]
1854
+ )
1855
+ args = parser.parse_args()
1856
+ input_csv_file = args.input_file[0]
1857
+ output_csv_file = args.output_file[0]
1858
+
1859
+ checkpoint_path = get_checkpoint_path(output_csv_file)
1860
+ cached_colors_dict = load_checkpoint(checkpoint_path)
1861
+
1862
+
1863
+ df = pd.read_csv(input_csv_file)
1864
+ filepath_column = 'image_file'
1865
+
1866
+ colors_list = []
1867
+ processed_files = set(cached_colors_dict.keys())
1868
+
1869
+ iterable_list = list(enumerate( df[filepath_column]))
1870
+ for elem in tqdm(iterable_list):
1871
+
1872
+ idx = elem[0]
1873
+ filepath = elem[1]
1874
+
1875
+ #save checkpoint every 50 files
1876
+ if (not (len(processed_files) % 49)
1877
+ ):
1878
+
1879
+ print(f"Images processed: {len(processed_files)}")
1880
+ save_checkpoint(checkpoint_path, df.iloc[:idx], colors_list)
1881
+
1882
+
1883
+
1884
+ colors = get_colors(filepath)
1885
+ colors_list.append(colors)
1886
+ processed_files.add(filepath)
1887
+
1888
+ output_df = df.copy()
1889
+ #output_df['filepath'] = df['image_file']
1890
+ output_df['colors'] = colors_list
1891
+
1892
+ output_file = os.path.join("detected_colors.csv")
1893
+
1894
+ output_df.to_csv(output_csv_file,
1895
+ index= False, # don't write a new 'Index' column
1896
+ )
1897
+
imageprocessing/emotion_detection.py ADDED
@@ -0,0 +1,248 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+
3
+ # emotion detection with artemis
4
+ # given a CSV with image filepaths in a column 'image_file',
5
+ # append a column 'grounding_emotion' and a column 'emotions' with the detected emotion.
6
+ # 'emotions' contains detected the emotions ordered by descending probability.
7
+ # 'grounding_emotion' contains the main emotion (the most probable one)
8
+
9
+ import pandas as pd
10
+ import numpy as np
11
+ from PIL import Image
12
+ import torch
13
+ from tqdm import tqdm
14
+
15
+
16
+ #### checkpoints
17
+ def save_checkpoint(checkpoint_path,df, grounding_emo_list, emotions_list):
18
+ output_df = df.copy()
19
+ output_df['grounding_emotion'] = grounding_emo_list
20
+ output_df['emotions'] = emotions_list
21
+ output_df.to_csv(checkpoint_path,
22
+ index= False, # don't write a new 'Index' column
23
+ )
24
+ print("Saved checkpoint!")
25
+
26
+ def load_checkpoint_grounding_emotion(checkpoint_path):
27
+ try:
28
+ print("reading checkpoint at ", checkpoint_path)
29
+ df = pd.read_csv(checkpoint_path)
30
+
31
+ cached_grounding_emotion= {
32
+ row['image_file']: row['grounding_emotion']
33
+ for _, row in df.iterrows()
34
+ }
35
+ print(f"Checkpoint loaded succesfully to cache: {len(cached_grounding_emotion)} processed files")
36
+ return cached_grounding_emotion
37
+ except:
38
+ print("Checkpoint was not loaded")
39
+ return cached_grounding_emotion_dict
40
+
41
+ def load_checkpoint_emotions(checkpoint_path):
42
+ try:
43
+ print("reading checkpoint at ", checkpoint_path)
44
+ df = pd.read_csv(checkpoint_path)
45
+
46
+ cached_emotions= {
47
+ row['image_file']: row['emotions']
48
+ for _, row in df.iterrows()
49
+ }
50
+ print(f"Checkpoint loaded succesfully to cache: {len(cached_emotions)} processed files")
51
+ return cached_emotions
52
+ except:
53
+ print("Checkpoint was not loaded")
54
+ return cached_emotions_dict
55
+
56
+ def get_checkpoint_path(output_path):
57
+ #checkpoint_path = "checkpoint" + os.path.basename(output_path)
58
+ #checkpoint_path = os.path.join( os.path.dirname(output_path), checkpoint_path)
59
+ #return checkpoint_path
60
+ return output_path
61
+
62
+
63
+
64
+ cached_grounding_emotion_dict = {} # to avoid recomputing
65
+ cached_emotions_dict = {} # to avoid recomputing
66
+
67
+ def get_all_emotions(filepath, model, cached_grounding_emotion_dict, cached_emotions_dict):
68
+ emotions = cached_emotions_dict.get(filepath)
69
+ grounding_emotion = cached_grounding_emotion_dict.get(filepath)
70
+ if emotions is None:
71
+ grounding_emotion, emotions = get_all_emotions_in_image(filepath, model)
72
+ cached_grounding_emotion_dict[filepath] = grounding_emotion
73
+ cached_emotions_dict[filepath] = emotions
74
+ return grounding_emotion, emotions
75
+
76
+ def get_all_emotions_in_image(filepath, model):
77
+ with Image.open(filepath).convert('RGB') as img:
78
+
79
+ img = transformation(img).unsqueeze(0)# unsqueeze to add artificial first dimension
80
+
81
+ # emotion detection
82
+ emotion_vector = model(img) # apply the model
83
+ emotion_vector = np.exp(emotion_vector.detach().numpy()) # calculate probabilities
84
+ sorted_indices = (-emotion_vector).argsort()[0] # sort from most to least likely
85
+ emotions = [(IDX_TO_EMOTION[ind], emotion_vector[0][ind]) for ind in sorted_indices]
86
+ #construct the csv line
87
+ #emotions_df['image_file'].append(filename)
88
+ grounding_emotion = emotions[0][0]
89
+
90
+ return grounding_emotion, emotions
91
+
92
+
93
+
94
+
95
+ ################### utilities
96
+
97
+ #### Artemis emotions:
98
+ ARTEMIS_EMOTIONS = ['amusement', 'awe', 'contentment', 'excitement',
99
+ 'anger', 'disgust', 'fear', 'sadness', 'something else']
100
+ EMOTION_TO_IDX = {e: i for i, e in enumerate(ARTEMIS_EMOTIONS)}
101
+ IDX_TO_EMOTION = {EMOTION_TO_IDX[e]: e for e in EMOTION_TO_IDX}
102
+
103
+
104
+ ### Artemis image preprocessing
105
+
106
+ #from artemis.in_out.neural_net_oriented import image_transformation
107
+ import torchvision.transforms as transforms
108
+ image_net_mean = [0.485, 0.456, 0.406]
109
+ image_net_std = [0.229, 0.224, 0.225]
110
+
111
+ def image_transformation(img_dim, lanczos=True):
112
+ """simple transformation/pre-processing of image data."""
113
+
114
+ if lanczos:
115
+ resample_method = Image.LANCZOS
116
+ else:
117
+ resample_method = Image.BILINEAR
118
+
119
+ normalize = transforms.Normalize(mean=image_net_mean, std=image_net_std)
120
+ img_transforms = dict()
121
+ img_transforms['train'] = transforms.Compose([transforms.Resize((img_dim, img_dim), resample_method),
122
+ transforms.ToTensor(),
123
+ normalize])
124
+
125
+ # Use same transformations as in train (since no data-augmentation is applied in train)
126
+ img_transforms['test'] = img_transforms['train']
127
+ img_transforms['val'] = img_transforms['train']
128
+ img_transforms['rest'] = img_transforms['train']
129
+ return img_transforms
130
+
131
+ transformation = image_transformation(255)['train']
132
+
133
+ ### Artemis load model
134
+
135
+ #from artemis.in_out.neural_net_oriented import torch_load_model
136
+ import warnings
137
+ def torch_load_model(checkpoint_file, map_location=None):
138
+ """ Wrap torch.load to catch standard warning of not finding the nested implementations.
139
+ :param checkpoint_file:
140
+ :param map_location:
141
+ :return:
142
+ """
143
+ with warnings.catch_warnings():
144
+ warnings.simplefilter("ignore")
145
+ model = torch.load(checkpoint_file, map_location=map_location)
146
+ return model
147
+
148
+
149
+
150
+ ########
151
+
152
+
153
+ ######### performing emotion detection
154
+
155
+ def artemis_emotions_detection(input_file, output_file):
156
+ checkpoint_path = get_checkpoint_path(output_file)
157
+ cached_grounding_emotion_dict = load_checkpoint_grounding_emotion(checkpoint_path)
158
+ cached_emotions_dict = load_checkpoint_emotions(checkpoint_path)
159
+
160
+ #load the model
161
+ # device = torch.device("cuda:" + str(0) if torch.cuda.is_available() else "cpu") # it is not working with gpus, only cpu :/
162
+ device =torch.device("cpu")
163
+ model = torch_load_model(img2emo_model_path, map_location=device)
164
+
165
+ recognized_grounding_emotion_per_image = []
166
+ recognized_emotions_per_image = []
167
+ processed_files = set(cached_emotions_dict.keys())
168
+
169
+ df = pd.read_csv(input_file)
170
+
171
+ iterable_list = list(enumerate( df['image_file']))
172
+
173
+ for elem in tqdm(iterable_list):
174
+ idx = elem[0]
175
+ filepath = elem[1]
176
+
177
+ #save checkpoint every 50 files
178
+ if (not (len(processed_files) % 49)
179
+ ):
180
+ print(f"Images processed: {len(processed_files)}")
181
+ save_checkpoint(
182
+ checkpoint_path,
183
+ df.iloc[:idx],
184
+ recognized_grounding_emotion_per_image,
185
+ recognized_emotions_per_image
186
+ )
187
+
188
+ grounding_emotion, emotions = get_all_emotions(
189
+ filepath,
190
+ model,
191
+ cached_grounding_emotion_dict,
192
+ cached_emotions_dict
193
+ )
194
+
195
+ recognized_grounding_emotion_per_image.append(grounding_emotion)
196
+ recognized_emotions_per_image.append(emotions)
197
+ processed_files.add(filepath)
198
+
199
+ recognized_grounding_emotion_per_image = pd.Series(recognized_grounding_emotion_per_image)
200
+ recognized_emotions_per_image = pd.Series(recognized_emotions_per_image)
201
+
202
+ return recognized_grounding_emotion_per_image, recognized_emotions_per_image
203
+
204
+
205
+ import argparse
206
+
207
+
208
+
209
+ if __name__ == "__main__":
210
+
211
+ parser = argparse.ArgumentParser(prog="Artemis emotion detection",
212
+ description='Recognizes the emotions per image in an image list')
213
+
214
+ parser.add_argument("--input_file", "-in", metavar='in', type=str, nargs=1,
215
+ help='input file containing images-paths for emotion detection.',
216
+ #default=[default_painting_folder]
217
+ )
218
+ parser.add_argument("--output_file", "-out", metavar='out', type=str, nargs=1,
219
+ help='output file containing images-paths + grounding (main) emotion + ranked emotions'
220
+ #default=[default_interpretation_folder]
221
+ )
222
+ parser.add_argument("--model_path", "-mp", metavar='mp', type=str, nargs=1,
223
+ help='artemis img2emo model path'
224
+ #default=[default_interpretation_folder]
225
+ )
226
+
227
+ args = parser.parse_args()
228
+ input_csv_file = args.input_file[0]
229
+ output_csv_file = args.output_file[0]
230
+
231
+ #where is the image to emotion classifier?
232
+ img2emo_model_path = args.model_path[0]
233
+
234
+ print(">>> input file: " , input_csv_file)
235
+ print(">>> output file: ", output_csv_file)
236
+ print(">>> img to emotion model path: ", img2emo_model_path)
237
+
238
+ # perform object recognition
239
+ recognized_grounding_emotion_per_image, recognized_emotions_per_image = artemis_emotions_detection(input_csv_file, output_csv_file)
240
+
241
+ # add a column with the recognized objects
242
+ output_df = pd.read_csv(input_csv_file)
243
+ output_df['grounding_emotion'] = recognized_grounding_emotion_per_image
244
+ output_df['emotions'] = recognized_emotions_per_image
245
+
246
+ output_df.to_csv(output_csv_file,
247
+ index= False, # don't write a new 'Index' column
248
+ )
imageprocessing/img2emo.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ef75eeb5150b2c68e435848a3501d74f7420afe89aed11b23b7e0fc77045a07a
3
+ size 85505075