2016-04-17 6 views
0

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

+0

@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

+0

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. –

Antwort

0

Wenn Sie die Farbe des gesamten Bildes verwenden, erhalten Sie in den meisten Fällen eine falsche Antwort, da der Hintergrund größer ist.Wenn Ihre Bildgröße fest ist und Sie sich über die Position des Objekts sicher sind, wird das Bild an der erwarteten Stelle zugeschnitten object.In den meisten Fällen wird es funktionieren.

Um

import cv2 
img = cv2.imread("'d:/Emmanu/project-data/b1.jpg'") 
crop_img = img[200:400, 100:300] # Crop from x, y, w, h -> 100, 200, 300, 400 
# NOTE: its img[y: y + h, x: x + w] and *not* img[x: x + w, y: y + h] 
cv2.imshow("cropped", crop_img) 
cv2.waitKey(0) 

Jetzt geben Sie diese crop_image als Input für Ihre code.And in den meisten Fällen zu beschneiden wird es richtig solution.There geben, ist nichts einfacher, dass this.I denken, das wird helfen.

+0

Waww..Sehr gut und einfach Logic.Missed that.Thanks – Emmanu

Verwandte Themen