2016-07-07 59 views
0

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.

enter image description here

Mein Code mit Methoden unter kommentiert, aber ich colorthiefPillow 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() 

Antwort

0

Ich bin mir nicht sicher, ob Sie so mathematisch geneigt sind, indem Sie dieses Tutorial auf finding dominant colors in an image lesen möchten. Die Idee besteht darin, Statistiken der Bildfarben zu verwenden, um die Farbpalette herauszufinden. Sie beginnen mit einer einzigen "Hauptfarbe" - der durchschnittlichen Farbe des gesamten Bildes. Dann brichst du diese Farbe in zwei Komponenten und dann drei und so weiter. Mit dem Code können Sie entscheiden, wie viele Farben Sie extrahieren möchten.

Hier ist ein Ergebnis, das ich habe den Code auf der Website erwähnt:

Finding dominant colors of a screenshot

+0

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

+1

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