Ich benutze Python 2.7, um zu versuchen, 5-Farben-Palette von Screenshots von Webseiten zu bekommen.Python bekommen Webseite Screenshot Farbpalette
Die Methoden, die ich bisher versucht habe, liefern keine befriedigenden Ergebnisse.
Die Paletten konvergieren auf Grün, Grau und Blau, wenn Webseiten andere, vielleicht nicht dominante, aber thematisch wichtige Farben haben, die in einer Palette sein sollten.
Ein Beispiel für die Ausgabe ist hier enthalten. Ich habe eine 5-Zellen-Tabelle über jedes Bild-Thumbnail gelegt, von denen jede eine der 5 Farben zeigt.
Mein Code mit Methoden unter kommentiert, aber ich colorthief
Pillow
und ein vielversprechendes Modul wurde namens zusammenzufassen haben.
Ich denke, dass die meisten dieser Farbpalette Übungen auf Fotografie oder Grafiken von Szenen und Objekten, die voller Farben geben oder nehmen. Webseiten sind anders. Sie haben viele Leerzeichen und schwarzen Text.
Die besten Ergebnisse, wenn auch bei weitem nicht zufriedenstellend, waren eine Methode, bei der weiße Pixel in transparente umgewandelt wurden. So konnten einige Screenshots Paletten mit mehr als Blau, Grau und Grün zeigen.
Ich vermute, dass, wenn ich alle weißen und schwarzen Pixel aus dem Screenshot zuerst entfernen könnte, und vielleicht alle anderen Pixel innerhalb eines verwandten% zu weiß und schwarz (z. B. weiß, dunkle Grautöne) dann könnte ich die Palette generiert werden Satz von Pixeln mit nur Farben.
Die Websuche hat keine Techniken ergeben, die sich speziell mit der Erzeugung von Webseiten oder Dokumentenpaletten befassen.
Ich muss vielleicht Palettenerzeugung überdenken und es direkt aus HTML bekommen. Aber ich möchte versuchen, die Bildmethode nach Möglichkeit funktionieren zu lassen.
Also die Frage ist, wie bekomme ich Farbpalette von einem Screenshot einer Webseite, die weiß, schwarz ausschließt und nur auf Farben im Bild basiert?
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()
Diese Verbindung war gut und hat mich in die richtige Richtung. Ziemlich unkompliziert mit opencv. Habe einen anderen [Blogpost] (http://www.pyimageSearch.com/2014/05/26/opencv-python-k-means-color-clustering/) gefunden, der so etwas in Python implementiert hat und es funktioniert gut. – curtisp
Btw an interessierte Leser, meine ursprüngliche Lösung funktionierte tatsächlich. Es produzierte ähnliche Ergebnisse zu denen, die von Utkarsh & auf dem pyimagesearchlink oben gezeigt wurden. Ich bekam blaue/grüne Farben, weil ich eine falsche Inline-Stil-HTML-Referenz in der Hintergrundfarbe der Tabelle verwendete, wo ich Farben zeigte (eine in jedem td). Ich benutzte 'bgcolor =" rgb (232, 147, 31) "' anstelle von 'style =" background-color: rgb (232, 147, 31) "' Browser mögen nicht 'bgcolor' inline nur in css.Aber ich bin froh, dass ich in opencv gegraben habe. – curtisp