0

Ich versuche, eine perzeptuell-basierte Bildsuchmaschine zu implementieren, die es Benutzern ermöglichen wird, Bilder zu finden, die Objekte relativ gleicher oder enger Farben zu der benutzerdefinierten Vorlage (Objekt aus dem Beispielbild).Color Features Extraktion durch Clustering in Bildsuchmaschine

Das Ziel ist es jetzt nicht, ein genaues Objekt zu finden, sondern wichtige Bereiche zu finden, die farblich nahe an der Vorlage liegen. Ich bin dabei, meinen Datensatz zu indexieren.

ich einige Clustering-Algorithmen versucht habe, wie k-Mittel von sklearn.cluster (wie ich aus this article gelesen habe), Zentroide aus dem Probenbild auszuwählen, wie meine Funktionen, die schließlich sind in CIELab-Farbraum zu erwerben mehr Wahrnehmungsgleichförmigkeit. Aber es scheint nicht gut zu funktionieren, da Cluster-Zentren zufällig generiert werden und ich daher selbst bei einem Objekt und einem Bild, aus dem das gleiche Objekt extrahiert wurde, schlechte Metrikergebnisse erhalten habe!

Ein allgemeiner Algorithmus in einfachen Bildsuchprogrammen verwendet Abstand zwischen Histogrammen, was nicht akzeptabel ist, da ich versuche, wahrnehmbar gültige Farbdifferenz aufrechtzuerhalten, und damit meine ich, dass ich nur kann Verwalten Sie zwei separate Farben (und vielleicht einige zusätzliche Werte), um metrics in CIELab colour space zu berechnen. Ich verwende CMCl: c metric meiner eigenen Implementierung, und es hat bisher gute Ergebnisse erzielt.

Vielleicht kann mir jemand helfen und einen Algorithmus empfehlen, der für meinen Zweck besser geeignet ist.

Einige Code, die ich bisher gemacht habe:

wäre clustern
import cv2 as cv 
import numpy as np 
from sklearn.cluster import KMeans, MiniBatchKMeans 
from imageproc.color_metrics import * 

def feature_extraction(image, features_length=6): 
    width, height, dimensions = tuple(image.shape) 

    image = cv.cvtColor(image, cv.COLOR_BGR2LAB) 
    image = cv.medianBlur(image, 7) 

    image = np.reshape(image, (width * height, dimensions)) 

    clustering_handler = MiniBatchKMeans(n_init=40, tol=0.0, n_clusters=features_length, compute_labels=False, 
            max_no_improvement=10, max_iter=200, reassignment_ratio=0.01) 
clustering_handler.fit(image) 

    features = np.array(clustering_handler.cluster_centers_, dtype=np.float64) 
    features[:, :1] /= 255.0 
    features[:, :1] *= 100.0 
    features[:, 1:2] -= 128.0 
    features[:, 2:3] -= 128.0 

    return features 

if __name__ == '__main__': 
    first_image_name = object_image_name 
    second_image_name = image_name 

    sample_features = list() 
    reference_features = list() 

    for name, features in zip([first_image_name, second_image_name], [sample_features, reference_features]): 
     image = cv.imread(name) 
     features.extend(feature_extraction(image, 6)) 
    distance_matrix = np.ndarray((6, 6)) 
    distance_mappings = {} 

    for n, i in enumerate(sample_features): 
     for k, j in enumerate(reference_features): 
      distance_matrix[n][k] = calculate_cmc_distance(i, j) 
      distance_mappings.update({distance_matrix[n][k]: (i, j)}) 



    minimal_distances = [] 
    for i in distance_matrix: 
     minimal_distances.append(min(i)) 

    minimal_distances = sorted(minimal_distances) 
    print(minimal_distances) 
    for ii in minimal_distances: 
     i, j = distance_mappings[ii] 
     color_plate1 = np.zeros((300, 300, 3), np.float32) 
     color_plate2 = np.zeros((300, 300, 3), np.float32) 

     color1 = cv.cvtColor(np.float32([[i]]), cv.COLOR_LAB2BGR)[0][0] 
     color2 = cv.cvtColor(np.float32([[j]]), cv.COLOR_LAB2BGR)[0][0] 

     color_plate1[:] = color1 
     color_plate2[:] = color2 

     cv.imshow("s", np.hstack((color_plate1, color_plate2))) 
     cv.waitKey() 

    print(sum(minimal_distances)) 

Antwort

0

Der üblichen Ansatz nur einmal, mit einer repräsentativen Stichprobe von alle Bildern.

Dies ist ein Vorverarbeitungsschritt, um Ihr "Wörterbuch" zu erstellen.

Dann zur Merkmalsextraktion, würden Sie zeigt auf die festen Clusterzentren Karte, die jetzt über alle Bilder geteilt. Dies ist ein einfaches Nearest-Neighbor-Mapping, kein Clustering.