Created
October 20, 2022 23:45
-
-
Save victormurcia/3bcf2295a570d63502a8414ad7d6f603 to your computer and use it in GitHub Desktop.
kmeans image color with green mask
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| def KMeansMaskGreen(img, clusters, lowHue, highHue, lowSat, highSat, loBright, hiBright): | |
| """ | |
| Args: | |
| path2img : (str) path to cropped player bounding box | |
| clusters : (int) how many clusters to use for KMEANS | |
| Returns: | |
| rgb_array : (tuple) Dominant colors in image in RGB format | |
| """ | |
| org_img = img.copy() | |
| #print('Org image shape --> ',img.shape) | |
| green = np.array([60,25,25]) | |
| loGreen = np.array([lowHue, lowSat, loBright]) #low green threshold | |
| hiGreen = np.array([highHue, highSat, hiBright]) #Upper green threshold | |
| #Convert image to HSV | |
| hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) | |
| #Make the mask | |
| mask = cv2.inRange(hsv, loGreen, hiGreen) | |
| mask_img = img.copy() | |
| mask_img[mask==255] = (255,255,255) | |
| #Remove white pixels from image so that they don't interfere with the process | |
| mask_img = mask_img[np.all(mask_img != 255 , axis=-1)] | |
| #Convert image into a 1D array | |
| flat_img = np.reshape(mask_img,(-1,3)) | |
| arrayLen = flat_img.shape | |
| #Ensure that masking didn't remove everything (Generally happens in false positives) | |
| if mask_img.shape[0] <= clusters: | |
| #print('Cropped image has dimensions lower than number of desired clusters.Not clustering current image') | |
| rgb_array = np.empty((clusters,3,)) | |
| rgb_array[:] = np.nan | |
| return rgb_array | |
| else: | |
| rgb_array = [] | |
| #Do the clustering | |
| kmeans = KMeans(n_clusters = clusters, random_state=0, tol = 1e-4) | |
| kmeans.fit(flat_img) | |
| #Define the array with centroids | |
| dominant_colors = np.array(kmeans.cluster_centers_,dtype='uint') | |
| #Calculate percentages | |
| percentages = (np.unique(kmeans.labels_,return_counts=True)[1])/flat_img.shape[0] | |
| #Combine centroids representing dominant colors and percentages | |
| #associated with each centroid into an array | |
| pc = list(zip(percentages,dominant_colors)) | |
| pc = sorted(reversed(pc), reverse = True, key = lambda x: x[0]) | |
| i = 0 | |
| for i in range(clusters): | |
| #dummy_array = pc[i][1] | |
| rgb_array.append(pc[i][1]) | |
| i += 1 | |
| return rgb_array |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment