6 Stimmen

Wie kann man prüfen, ob ein RGB-Bild nur eine Farbe enthält?

Ich verwende Python und PIL.

Ich habe Bilder in RGB und möchte wissen, welche Bilder nur eine Farbe (z. B. #FF0000) oder einige sehr nahe beieinander liegende Farben (#FF0000 und #FF0001) enthalten.

Ich dachte an die Verwendung des Histogramms, aber es ist sehr schwierig, etwas mit den 3 Farbbändern herauszufinden, also suche ich nach einem clevereren Algorithmus.

Irgendwelche Ideen?

Das ImageStat-Modul ist DIE Antwort! Vielen Dank, Aaron. Ich verwende ImageStat.var, um die Varianz zu erhalten, und es funktioniert perfekt.

Hier ist mein Teil des Codes:

from PIL import Image, ImageStat

MONOCHROMATIC_MAX_VARIANCE = 0.005

def is_monochromatic_image(src):
    v = ImageStat.Stat(Image.open(src)).var
    return reduce(lambda x, y: x and y < MONOCHROMATIC_MAX_VARIANCE, v, True)

6voto

Aaron Digulla Punkte 308693

Versuchen Sie die ImageStat-Modul . Wenn die Werte, die von extrema gleich sind, haben Sie nur eine einzige Farbe im Bild.

0voto

SmuK Punkte 1

Zunächst sollten Sie einen Abstand zwischen zwei Farben festlegen. Dann müssen Sie nur noch für jedes Pixel überprüfen, ob der Abstand zu Ihrer Farbe klein genug ist.

0 Stimmen

Die Berechnung des euklidischen Abstands zwischen den einzelnen Pixeln im dreidimensionalen RGB-Raum ist theoretisch in Ordnung, aber ich denke, dass sie bei Bildern mit mehreren Millionen Pixeln nicht funktioniert (zumindest in Python).

0 Stimmen

Warum euklidischer Abstand? Sie können sich etwas anderes vorstellen, je nachdem, was Sie wollen.

0 Stimmen

Das Problem liegt nicht in der Art des Abstands, sondern in der Tatsache, dass der Algorithmus O(N^2) ist, wobei N die Anzahl der Pixel im Bild ist (ich habe Fälle mit N=10.000.000)

0voto

Geo Punkte 89102

Hier ist ein kleiner Ausschnitt, den Sie verwenden können:

import Image

im = Image.open("path_to_image")
width,height = im.size

for w in range(0,width):
  for h in range(0,height):
     # this will hold the value of all the channels
     color_tuple = im.getpixel((w,h))
     # do something with the colors here

Vielleicht verwenden Sie einen Hash und speichern die Tupel als Schlüssel und die Anzahl ihrer Vorkommen als Wert?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X