2017-05-24 2 views
0

J'ai un ensemble de données d'images, où je crée l'histogramme de chaque image, puis je veux les enregistrer dans un fichier, de sorte que pour chaque nouvelle image que j'utilise en entrée, je compare l'histogramme de cette image avec ceux que j'ai déjà dans le fichier et trouve s'ils sont identiques. Le code à ce jour est le suivant:Comparer les histogrammes dans le fichier OpenCV

import numpy as np 
import cv2 
import os.path 
import glob 
import matplotlib.pyplot as plt 
import pickle 

index = {} 

#output dic 
out = { 
    1: {}, 
    2: {}, 
    3: {}, 
} 

for t in [1]: 

    #load_files 
    files = glob.glob(os.path.join("..", "data", "train", "Type_{}".format(t), "*.jpg")) 
    no_files = len(files) 

    #iterate and read 
    for n, file in enumerate(files): 
     try: 
      image = cv2.imread(file) 
      img = cv2.resize(image, None, fx=0.1, fy=0.1, interpolation=cv2.INTER_AREA) 

      # features : histograms 
      plt.hist(img.flatten(), 256, [0, 256], color='r') 
      plt.xlim([0,256]) 
      plt.legend('histogram', loc='upper left') 
      plt.show() 
      # index[file] = hist 

      # write histograms into file 
      #compare them and find similarity score 
      # result_dist = compareHist(index[0], index[1], cv2.cv.CV_COMP_CORREL) 

      print(file, t, "-files left", no_files - n) 

     except Exception as e: 
      print(e) 
      print(file) 

Quelqu'un peut-il me guider à travers cela? Merci!

Répondre

1

Vous pouvez calculer l'histogramme de canal rouge de toutes les images comme celle-ci:

import os 
import glob 
import numpy as np 
from skimage import io 

root = 'C:\Users\you\imgs' # Change this appropriately 
folders = ['Type_1', 'Type_2', 'Type_3'] 
extension = '*.bmp' # Change if necessary 

def compute_red_histograms(root, folders, extension): 
    X = [] 
    y = [] 
    for n, imtype in enumerate(folders): 
     filenames = glob.glob(os.path.join(root, imtype, extension))  
     for fn in filenames: 
      img = io.imread(fn) 
      red = img[:, :, 0] 
      h, _ = np.histogram(red, bins=np.arange(257), normed=True) 
      X.append(h) 
      y.append(n) 
    return np.vstack(X), np.array(y) 

X, y = compute_red_histograms(root, folders, extension) 

Chaque image est représentée par un vecteur caractéristique 256 dimensions (les composants de l'histogramme de canal rouge), d'où X est un Tableau NumPy 2D avec autant de lignes qu'il y a d'images dans votre ensemble de données et 256 colonnes. y est un tableau 1D NumPy avec des étiquettes de classes numériques, c'est-à-dire 0 pour Type_1, 1 pour Type_2 et 2 pour Type_3.

Ensuite, vous pouvez diviser votre ensemble de données en train et test comme si:

from sklearn.model_selection import train_test_split 

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=0) 

Et enfin, vous pouvez former un SVM:

from sklearn.svm import SVC 

clf = SVC() 
clf.fit(X_train, y_train) 

En faisant, vous pouvez faire des prédictions ou évaluer précision de classification très facilement:

In [197]: y_test 
Out[197]: array([0, 2, 0, ..., 0, 0, 1]) 

In [198]: clf.predict(X_test) 
Out[198]: array([2, 2, 2, ..., 2, 2, 2]) 

In [199]: y_test == clf.predict(X_test) 
Out[199]: array([False, True, False, ..., False, False, False], dtype=bool) 

In [200]: clf.score(X_test, y_test) 
Out[200]: 0.3125 
+0

merci pour votre aide. Il me donne une erreur à 'filenames = glob.glob (os.path.join (racine, obj.folder, extension))', ce nom 'obj' n'est pas défini – joasa

+0

J'ai édité ma réponse pour corriger ce bug – Tonechas

+0

Maintenant je obtenir ces avertissements _UserWarning: Peut-être corrompre les données EXIF. Attendre la lecture de 524288 octets mais seulement 0. Sauter la balise 3 "Saut de balise% s"% (taille, len (données), balise)) _ et ce message d'erreur: ** OSError: le fichier image est tronqué (54 octets non traité)**. Savez-vous ce que cela signifie? – joasa