Traitement d'images, étirement linéaire et opencv

Traitement d'images, étirement linéaire et opencv

Pour tenter de reconnaître les objets en examinant les images, diverses techniques de traitement et d'analyse d'images sont appliquées. Cet article décrit brièvement l'algorithme d'étirement linéaire et son utilisation dans OpenCV.

La technique d'étirement linéaire peut être appliquée aux images où un manque de contraste substantiel peut entraîner une fausse identification des objets, sa relation spatiale et sa signification. L'amélioration du contraste par étirement linéaire peut être appliquée aux images avec des variations de luminosité très faibles ou très élevées. Pour appliquer l'algorithme d'étirement linéaire, une image doit être convertie en gris et tous les pixels 8 bits et ses valeurs sont enregistrées en histogramme.

L'histogramme contiendra les 256 niveaux de gris (0 - 255) dans des soi-disant bacs et chaque valeur de pixel aura lieu dans le bac représenté avec sa propre valeur. Lorsque l'histogramme et l'image sont créés, les valeurs maximales (OMAX) et minimum (omin) sont identifiées.

Un étirement linéaire est appliqué à l'histogramme comme suit:

  • créer un histogramme de l'image d'origine
  • Définir de nouvelles valeurs maximales (Nmax) et nouvelles minimums (NMIN)
  • Calculez le nombre de bacs dans l'histogramme d'origine où la valeur des bacs = (OMAx - Omin)
  • Calculer l'espacement pour un nouvel histogramme donc l'espace = (nmax - nmin) / (OMAx - omin)
  • créer un nouvel histogramme avec des positions correspondantes pour les nouveaux bacs (NB) représentés par
  • Utilisez un nouvel histogramme pour créer une nouvelle image

La formule précédente peut être représentée par une version simplifiée du code C ++ comme suit:

#include using namespace std; int main () const int nmin = 0; const int nmax = 255; const int omin = 60; const int omax = 65; int espace = (nmax - nmin) / (OMAx - omin); int bins = (omax - omin); pour (int j = 0; j <= bins; j++ )   std::cout << j + OMIN << ": " << NMIN + ( j * space ) << endl;   return 0; 

COMPILER:

Bacs G ++.CPP -O

SORTIR:

60: 0 61: 51 62: 102 63: 153 64: 204 65: 255 

Le code C ++ ci-dessus est une version vraiment simplifiée de l'algorithme d'étirement linéaire. Dans la section suivante, nous allons utiliser la bibliothèque OpenCV pour effectuer cette tâche.

À l'aide de la bibliothèque OpenCV, nous pouvons profiter de la fonction cvnormalise. Cette fonction prend au moins cinq arguments (image originale, nouvelle image, NMIN, Nmax et type de normalisation). Le code OpenCV C ++ suivant prend un exemple d'image comme un seul argument. Le code C ++ suivant appliquera la fonction CVNormalise à une image d'échantillon et créera l'histogramme pour l'image originale et normalisée.

#include "CV.h "#include" highgui.h "void create_histogram_image (iPlimage *, iPlimage *); int main (int argc, char ** argv) // Charge Image de couleur spécifiée par le premier argument iplimage * source = cvloadImage (argv [1]); // Créer une nouvelle image Structure // Pour l'image de sortie de niveaux de gris iPlimage * gris_img = cvcreateImage (cvSize (source-> width, source-> hauteur), ipl_depth_8u, 1); // définir le type CV_RGB2GRAY à convertir // Image RGB vers GrayScale CvcvtColor (Source, Gray_IMG , Cv_rgb2gray); // créer une nouvelle structure d'image // pour maintenir l'histogramme Image iPlimage * Hist_img = cvcreateImage (cvSize (300,240), 8, 1); cvset (hist_img, cvscalarall (255), 0); // créer une nouvelle structure d'image // pour maintenir l'image de sortie étirée iPlimage * strethed_img = cvcreateImage (cvSize (source-> largeur, source-> hauteur), ipl_depth_8u, 1); // créer une nouvelle structure d'image // pour maintenir l'histogramme IPLIMAGE * STREADED_HIST_IMG = cvcreateImage (cvSize (300,240), 8, 1);cvset (strethed_hist_img, cvScalarall (255), 0); // Créer une nouvelle structure d'image // Pour maintenir l'image de sortie étirée iPlimage * Equalised_img = cvcreateImage (cvSize (source-> width, source-> height), ipl_depth_8u, 1); // cvnormalize function appel pour appliquer le stretch linéaire cvnormalize (gris_img, strethed_img, 0, 255, cv_minmax); // Créer l'histogramme de l'image originale create_histogram_image (gris_img, hist_img); // Créer l'histogramme de la nouvelle image. create_histogram_image (strethed_img, strethed_hist_img); // Afficher toutes les images cvnamedWindow ("image d'origine à l'échelle gris", 1); cvshowImage ("image d'origine à l'échelle gris", gris_img); cvnamedwindow ("image à l'échelle gris étirée", 1); cvshowImage ("image à l'échelle gris étirée", strethed_img); cvnamedWindow ("histogramme d'image à l'échelle gris", 1); cvShowImage ("Histogramme d'image à l'échelle gris", HIST_IMG); cvNamedWindow ("Histogramme d'image étiré", 1); cvShowImage ("Histogramme d'image étiré", stretchyd_hist_img); // attendez indéfiniment pour Keystroke cvwaitkey (0); retour 0;  void create_histogram_image (iPlimage * gray_img, iPlimage * Hist_img) cvhistogram * hist; int hist_size = 256; float plage [] = 0,256; float * gammes [] = range; float max_value = 0.0; float w_scale = 0.0 # 000000; ">; // Créer un tableau pour maintenir les valeurs de l'histogramme Hist = cvcreateHist (1, & Hist_Size, cv_hist_array, Ranges, 1); // Calculer les valeurs de l'histogramme cvcalchist (& gris_img, hist, 0, null); // Obtenez le Valeurs minimales et maximales de l'histogramme cvGetMinMaxHistValue (Hist, 0, & max_value, 0, 0); // régler la hauteur en utilisant la valeur maxim cvscale (hist-> bacs, hist-> bacs, ((float) Hist_img-> height) / max_value, 0); // calculer la largeur w_scale = ((float) hist_img-> largeur) / hist_size; // tracer l'histogramme pour (int i = 0; i < hist_size; i++ )   cvRectangle( hist_img, cvPoint((int)i*w_scale , hist_img->hauteur), cvpoint ((int) (i + 1) * w_scale, hist_img-> hauteur - cvround (cvGetReal1d (hist-> bacs, i))), cvScalar (0), -1, 8, 0);  

COMPILER:

G ++ 'PKG-Config OpenCV --CFLAGS - Normalisation de LIBS.CPP -O normaliser 

EXÉCUTER:

./ Normaliser l'échantillon.PNG 

SORTIR:

goûter.PNG (image RVB d'origine)

À l'étape suivante, nous avons converti l'image RVB en une échelle grise:

À l'aide de cvnormalise, nous avons appliqué un étirement linéaire:

Maintenant, nous pouvons comparer les histogrammes des deux images.

Histogramme de l'image d'origine à l'échelle gris:

Histogramme de la nouvelle image étirée:

Tutoriels Linux connexes:

  • Une introduction à l'automatisation Linux, des outils et des techniques
  • Boucles imbriquées dans les scripts bash
  • Masterring Bash Script Loops
  • Comment travailler avec l'API WooCommerce REST avec Python
  • Choses à installer sur Ubuntu 20.04
  • À quelle fréquence devez-vous redémarrer votre serveur Linux?
  • Comparaison des MPM de Linux Apache PreFork vs Worker
  • Choses à faire après l'installation d'Ubuntu 20.04 Focal Fossa Linux
  • Mint 20: Mieux que Ubuntu et Microsoft Windows?
  • Optimisation des performances de Linux: outils et techniques