我有一个博客有很多文章,我想知道如何建立一个功能,可以检测每一个文章图像的主色调,并为每一个文章设置主色调的背景。
(我使用的是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提供了一个继承自
ImageField
的FileField
方法,它提供了一个.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/