Esempio n. 1
0
    def get_colors(self,
                   image_path,
                   num,
                   return_color_counts=False,
                   return_image=False,
                   use_logs=False):
        if num < 2:
            print("The image must have at least 2 colors.")
            return
        image = cv2.imread(image_path, cv2.IMREAD_COLOR)
        (h, w) = image.shape[:2]
        # Convert color spaces
        image = cv2.cvtColor(image, cv2.COLOR_BGR2LAB)
        image = image.reshape((image.shape[0] * image.shape[1], 3))
        clusters = MiniBatchKMeans(n_clusters=num)
        labels = clusters.fit_predict(image)
        res = clusters.cluster_centers_.astype("uint8")[labels]
        # To get the colors back to RGB, we must convert to an image and extract the colors
        res = res.reshape((h, w, 3))
        res = cv2.cvtColor(res, cv2.COLOR_LAB2BGR)
        if return_image:
            res_image = res

        res = res.reshape((h * w, 3))

        res_colors = []
        color_counts = []

        for color in res:
            string_color = generate_hex(color, bgr=True)
            if string_color not in res_colors:
                res_colors.append(string_color)
                color_counts.append(0)
            else:
                color_counts[res_colors.index(string_color)] += 1

        palette = Palette()
        for i, color in enumerate(res_colors):
            palette.add(Color(color, color_counts[i]))

        self.scheme_cache = palette

        # Oh no
        if return_image:
            if return_color_counts:
                return palette, color_counts, res_image
            return palette, res_image
        if return_color_counts:
            return palette, color_counts
        return palette
                return res_colors, color_counts, res_image
            return res_colors, res_image
        if return_color_counts:
            return res_colors, color_counts
        return res_colors

    def get_image_data_from_url(self, url):
        req = urllib.urlopen(url)
        return np.asarray(bytearray(req.read()), dtype=np.uint8)


if __name__ == "__main__":
    print("Running...")
    extractor = Extractor()
    colors, counts, image = extractor.get_colors(
        extractor.get_image_data_from_url(image_url),
        colors,
        return_color_counts=True,
        return_image=True,
        use_logs=True)
    (h, w) = image.shape[:2]
    if colors is not None:
        print("Resulting colors:")
        palette = Palette([])
        for i, color in enumerate(colors):
            palette.add(Color(color, counts[i]))
        palette.sort(sort_palette_by)
        display(palette.get_palette_html())

        cv2_imshow(image)