Python converting an image to use less colors

后端 未结 2 793
無奈伤痛
無奈伤痛 2021-01-07 02:05

I want to take an image and (somehow) read it as an array of pixels. Meaning each element of the 2d array would be either a hex code or RGB 3-tuple that represent the color

相关标签:
2条回答
  • 2021-01-07 02:58

    What you are after is called color quantization. Several algorihtms have been designed, such as the Median Cut or the Popularity algorithm. They allow you to build an "optimal" color table with the desired number of entries.

    These methods were popular in the times of expensive graphics cards, but have lost fame since the generalization of true color.

    Complementarily to color quantization, one often uses color dithering, a method that restores some of the smoothness of color gradients and avoids banding effects.

    https://nl.mathworks.com/help/images/reduce-the-number-of-colors-in-an-image.html?requestedDomain=true

    0 讨论(0)
  • 2021-01-07 03:04

    Library (libraries) to use?

    scikit-image or OpenCV would be my preferred choices.

    Methods? (Are there any widely used algorithms for this kind of problem?)

    K-means clustering is a popular approach to color quantization.

    Am I using the wrong programming language? (Is there one that offers this kind of functionality but easier to use?)

    Python is arguably the "easiest" language for this task.

    DEMO

    Consider this image:

    The following code reduces the number of colors from +500K to only 6:

    import numpy as np
    from skimage import io
    from sklearn.cluster import KMeans
    
    original = io.imread('https://i.stack.imgur.com/QCl8D.jpg')
    n_colors = 6
    
    arr = original.reshape((-1, 3))
    kmeans = KMeans(n_clusters=n_colors, random_state=42).fit(arr)
    labels = kmeans.labels_
    centers = kmeans.cluster_centers_
    less_colors = centers[labels].reshape(original.shape).astype('uint8')
    
    io.imshow(less_colors)
    

    And this is how the color quantized image looks:

    0 讨论(0)
提交回复
热议问题