我有一个博客有很多文章,我想知道如何建立一个功能,可以检测每一个文章图像的主色调,并为每一个文章设置主色调的背景。
(我使用的是Django+1.8和Python 3.4.x)
我想从头开始,步骤是什么?
颜色检测功能应该是什么样子?
有什么想法/建议吗?

最佳答案

是的,我只是想知道它在django上是如何工作的
假设一个骨架类似于

class Article(Model):
    background_color = CharField(max_length=6) # hex code of color

class AricleImage(Model):
    article = ForeignKey(Article)
    image = ImageField()

    def get_dominant_color(self):
         return _get_dominant_color(self.image.open())
         # or pass self.image.file, depending on your storage backend
         # We'll implement _get_dominant_color() below later

    def set_article_background_color(self):
         self.article.background_color = self.get_dominant_color()

Django提供了一个继承自ImageFieldFileField方法,它提供了一个.open()方法,这是我们在上面用来获取图像文件句柄的方法(它将传递给下面的scipy/PIL代码)
…建立一个功能,可以检测每一个物品图像的主色,并为每一个物品设置主色背景。
要在所有文章上运行此命令,我们可以执行以下操作:
for article_image in ArticleImage.objects.all():
    article_image.set_article_background_color()

让我们调整this answer中的代码,并用它生成一个函数:
import struct
import Image
import scipy
import scipy.misc
import scipy.cluster

NUM_CLUSTERS = 5

def _get_dominant_color(image_file):
    """
    Take a file object and return the colour in hex code
    """

    im = image_file
    im = im.resize((150, 150))      # optional, to reduce time
    ar = scipy.misc.fromimage(im)
    shape = ar.shape
    ar = ar.reshape(scipy.product(shape[:2]), shape[2])

    print 'finding clusters'
    codes, dist = scipy.cluster.vq.kmeans(ar, NUM_CLUSTERS)
    print 'cluster centres:\n', codes

    vecs, dist = scipy.cluster.vq.vq(ar, codes)         # assign codes
    counts, bins = scipy.histogram(vecs, len(codes))    # count occurrences

    index_max = scipy.argmax(counts)                    # find most frequent
    peak = codes[index_max]
    colour = ''.join(chr(c) for c in peak).encode('hex')
    return colour

在模板中设置文章背景
最后但并非最不重要的是,当你渲染文章时,只需使用{{article.background_color}}
例如,如果您想覆盖一个泛型style.css块,可以在HTML中定义一个<style></style>
<style>
body {
    background: #{{article.background_color}};
}
</style>

(仅举一个例子,您还可以让django生成一个/css/style-custom.css文件,包含在main/css/style.css之后)

关于python - Django检测图像的主色,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34958777/

10-08 20:34