Django检测图像的主色

时间:2016-01-23 02:02:04

标签: python django detection

我有一篇包含大量文章的博客,我想知道如何构建一个可以检测每篇文章图像主色的函数,并且每篇文章都以主色设置背景。

(我正在使用Django +1.8和Python 3.4.x)

我试图从头开始构建它,步骤是什么?

颜色检测功能应该是什么样的?

任何想法/建议?

1 个答案:

答案 0 :(得分:3)

  

是的,我只想要一个关于它如何在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提供ImageField继承自FileField的{​​{1}},它提供.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}}

即可

e.g。如果要覆盖通用style.css,可以在HTML中定义<style></style>

<style>
body {
    background: #{{article.background_color}};
}
</style>

(举个例子,你也可以让django生成一个/css/style-custom.css文件,包含在主/css/style.css之后