我正在使用Python 2.7尝试从网页截图中获取5色调色板。
到目前为止,我尝试的方法并没有产生令人满意的结果。
当网页上有其他可能不占优势但主题重要的颜色应该在调色板中时,调色板会聚在果岭,灰色和蓝色上。
此处包含输出样本。我在每个图像缩略图上面放了一个5格的桌子,每张都显示了5种颜色中的一种。
我的代码注释了下面的方法,但总结一下,我一直在使用Pillow
和一个名为colorthief
的有前景的模块。
我认为大多数这些调色板练习都适用于场景的照片或图形以及充满色彩的物体。网页是不同的。它们有大量的空白区域和黑色文本。
最好的结果虽然远非令人满意,却是一种将白色像素变为透明的方法。这允许一些屏幕截图显示超过蓝色,灰色和绿色的调色板。
我怀疑如果我可以先从截图中删除所有白色和黑色像素,也可能是相关%中的所有其他像素分别为白色和黑色(例如灰白色,深灰色),那么我可以从集合中生成调色板只有颜色的像素。
网络搜索尚未揭示任何专门处理网页或文档调色板生成的技术。
我可能需要重新考虑调色板生成并直接从HTML获取。但是如果可能的话,我想尝试使图像方法有效。
所以问题是如何从网页的屏幕截图中获取调色板,该网页不包括白色,黑色并仅基于图像中的颜色?
import os, os.path
from PIL import Image
import psycopg2
from colorthief import ColorThief
conn_string = \
"host='localhost' \
dbname='databasename' \
user='username' \
password='password'"
conn = psycopg2.connect(conn_string)
cur = conn.cursor()
## dev paths
screenshots_path = 'path/to/screenshots/'
screenshots_dir = os.listdir(screenshots_path)
for screenshot in screenshots_dir:
if screenshot != 'Thumbs.db':
try:
img_orig = Image.open(screenshots_path + screenshot)
## method 1 replace white pixels with transparent
# img = img_orig.convert("RGBA")
# datas = img.getdata()
# newData = []
# for item in datas:
# if item[0] == 255 and item[1] == 255 and item[2] == 255:
# newData.append((255, 255, 255, 0))
# else:
# newData.append(item)
# img.putdata(newData)
## method 2 - pillow
img = img_orig.convert('P', palette=Image.ADAPTIVE, colors=5)
width, height = img.size
height = img.size[1]
quantized = img.quantize(colors=5, kmeans=3)
palette = quantized.getpalette()[:15]
convert_rgb = quantized.convert('RGB')
colors = convert_rgb.getcolors(width*height)
color_str = str(sorted(colors, reverse=True))
color_str = str([x[1] for x in colors])
print screenshot + ' ' + color_str
## method 3 - colorthief
# try:
# img = Image.open(screenshots_path + screenshot)
# color_thief = ColorThief(screenshots_path + screenshot)
## get the dominant color
# dominant_color = color_thief.get_color(quality=1)
# build a color palette
# color_str = color_thief.get_palette(color_count=5)
# print screenshot + ' ' + str(height) + ' ' + str(color_str)
cur.execute("UPDATE screenshots set color_palette = %s, height = %s WHERE filename like %s", (str(color_str), height, '%' + screenshot + '%',))
conn.commit()
except:
continue
cur.close()
conn.close()
答案 0 :(得分:0)
我不确定你是否在数学上如此倾向,你可能想在finding dominant colors in an image阅读本教程。我们的想法是使用图像颜色的统计数据来计算调色板。首先是一种“主”颜色 - 整个图像的平均颜色。然后你将这种颜色分成两个组件,然后是三个,依此类推。该代码可让您决定要提取的颜色数量。
以下是我使用网站上提到的代码获得的结果: