Created
June 9, 2020 15:39
-
-
Save GeneralistDev/c588f5b88fb0c36b46a3e3f456c4872c to your computer and use it in GitHub Desktop.
Approach 2 with color visualization window
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
| import sys # System bindings | |
| import cv2 # OpenCV bindings | |
| import numpy as np | |
| from PIL import Image | |
| from collections import Counter | |
| class ColorRenderer(): | |
| def __init__(self, rgb): | |
| self.rgb = rgb | |
| def render(self): | |
| w, h = 512, 512 | |
| data = np.zeros((h, w, 3), dtype=np.uint8) | |
| r, g, b = self.rgb | |
| data[0:512, 0:512] = [r, g, b] | |
| img = Image.fromarray(data, 'RGB') | |
| img.show() | |
| class BackgroundColorDetector(): | |
| def __init__(self, imageLoc): | |
| self.img = cv2.imread(imageLoc, 1) | |
| self.manual_count = {} | |
| self.w, self.h, self.channels = self.img.shape | |
| self.total_pixels = self.w*self.h | |
| def count(self): | |
| for y in range(0, self.h): | |
| for x in range(0, self.w): | |
| RGB = (self.img[x, y, 2], self.img[x, y, 1], self.img[x, y, 0]) | |
| if RGB in self.manual_count: | |
| self.manual_count[RGB] += 1 | |
| else: | |
| self.manual_count[RGB] = 1 | |
| def average_colour(self): | |
| red = 0 | |
| green = 0 | |
| blue = 0 | |
| sample = 10 | |
| for top in range(0, sample): | |
| red += self.number_counter[top][0][0] | |
| green += self.number_counter[top][0][1] | |
| blue += self.number_counter[top][0][2] | |
| average_red = red / sample | |
| average_green = green / sample | |
| average_blue = blue / sample | |
| print("Average RGB for top ten is: (", average_red, | |
| ", ", average_green, ", ", average_blue, ")") | |
| return (average_red, average_green, average_blue) | |
| def twenty_most_common(self): | |
| self.count() | |
| self.number_counter = Counter(self.manual_count).most_common(20) | |
| for rgb, value in self.number_counter: | |
| print(rgb, value, ((float(value)/self.total_pixels)*100)) | |
| def detect(self): | |
| self.twenty_most_common() | |
| self.percentage_of_first = ( | |
| float(self.number_counter[0][1])/self.total_pixels) | |
| print(self.percentage_of_first) | |
| if self.percentage_of_first > 0.5: | |
| print("Background color is ", self.number_counter[0][0]) | |
| return self.number_counter[0][0] | |
| else: | |
| return self.average_colour() | |
| if __name__ == "__main__": | |
| if (len(sys.argv) != 2): # Checks if image was given as cli argument | |
| print("error: syntax is 'python main.py /example/image/location.jpg'") | |
| else: | |
| BackgroundColor = BackgroundColorDetector(sys.argv[1]) | |
| average_color = BackgroundColor.detect() | |
| print(average_color) | |
| renderer = ColorRenderer(average_color) | |
| renderer.render() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment