Mein Ziel ist es, die Farbe des Hauptobjekts in einem Bild/Bild zu finden. In meinem Fall ist das Bild immer vom selben Typ. Zum Beispiel News Reporter (human) in Wald oder News Reporter in Tierfarm .Die Position der Nachrichtenreporter ist auch same.What die einfache Lösung ist die dominierende Farbe des Hauptobjekts (News Reporter)So finden Sie die Farbe des Hauptobjekts in einem Bild fester Größe
, um herauszufinden, jede Hilfe ist welcome.Thanks
EDIT-Code hinzugefügt
import cv2
from collections import namedtuple
from math import sqrt
import random
import webcolors
try:
import Image
except ImportError:
from PIL import Image
Point = namedtuple('Point', ('coords', 'n', 'ct'))
Cluster = namedtuple('Cluster', ('points', 'center', 'n'))
def get_points(img):
points = []
w, h = img.size
for count, color in img.getcolors(w * h):
points.append(Point(color, 3, count))
return points
rtoh = lambda rgb: '#%s' % ''.join(('%02x' % p for p in rgb))
def colorz(filename, n=3):
img = Image.open(filename)
img.thumbnail((200, 200))
w, h = img.size
points = get_points(img)
clusters = kmeans(points, n, 1)
rgbs = [map(int, c.center.coords) for c in clusters]
return map(rtoh, rgbs)
def euclidean(p1, p2):
return sqrt(sum([
(p1.coords[i] - p2.coords[i]) ** 2 for i in range(p1.n)
]))
def calculate_center(points, n):
vals = [0.0 for i in range(n)]
plen = 0
for p in points:
plen += p.ct
for i in range(n):
vals[i] += (p.coords[i] * p.ct)
return Point([(v/plen) for v in vals], n, 1)
def kmeans(points, k, min_diff):
clusters = [Cluster([p], p, p.n) for p in random.sample(points, k)]
while 1:
plists = [[] for i in range(k)]
for p in points:
smallest_distance = float('Inf')
for i in range(k):
distance = euclidean(p, clusters[i].center)
if distance < smallest_distance:
smallest_distance = distance
idx = i
plists[idx].append(p)
diff = 0
for i in range(k):
old = clusters[i]
center = calculate_center(plists[i], old.n)
new = Cluster(plists[i], center, old.n)
clusters[i] = new
diff = max(diff, euclidean(old.center, new.center))
if diff < min_diff:
break
return clusters
def main():
img = cv2.imread('d:/Emmanu/project-data/b1.jpg')
res=cv2.resize(img,(400,300))
crop_img = res[100:200, 150:250]
cv2.imwrite("d:/Emmanu/project-data/color-test.jpg", crop_img)
g= colorz('d:/Emmanu/project-data/color-test.jpg',1)
k=g[0]
print k
f=webcolors.hex_to_rgb(k)
print webcolors.rgb_to_name(f, spec='css3')
if __name__ == '__main__':main()
das Problem ist dies die Hauptfarbe im gesamten Bild gibt nicht das Hauptobjekt
@tfv Ich habe bearbeitet.But dieser Code gibt mir die Hauptfarbe in das ganze Bild nicht die Objekte colour.If Nachrichten Reporter trägt rotes Kleid und er ist im Wald.Es wird grün (Hex) geben. – Emmanu
Definieren Sie Ihr Problem so formal wie möglich. Die Begriffe "Hauptobjekt" und "Hauptfarbe" sind lose definiert. Angenommen, Ihr "Hauptobjekt" ist der Vordergrund, können Sie opencv [Hintergrundsubtraktion] (http://docs.opencv.org/3.1.0/db/d5c/tutorial_py_bg_subtraction.html#gsc.tab=0) verwenden und wenden Sie dann Ihren ähnlichen Code wie Ihr im Vordergrund an. –