Bildverarbeitung, lineare Dehnung und OpenCV

Bildverarbeitung, lineare Dehnung und OpenCV

Um Objekte durch Untersuchung von Bildern zu erkennen, werden verschiedene Bildverarbeitungs- und Analysetechniken angewendet. Dieser Artikel beschreibt kurz den linearen Stretchalgorithmus und seine Verwendung innerhalb von OpenCV.

Lineare Stretch -Technik kann auf Bilder angewendet werden. Kontrastverstärkung durch lineare Dehnung kann auf Bilder mit sehr niedrigen oder sehr hohen Helligkeitsschwankungen angewendet werden. Um den linearen Stretchalgorithmus anzuwenden, muss ein Bild in Graustufen umgewandelt werden, und alle 8-Bit-Pixel und seine Werte werden in das Histogramm aufgezeichnet.

Das Histogramm enthält alle 256 Grey -Levels (0 - 255) in sogenannten Behältern und jeder Pixelwert findet in dem Mülleimer statt, der mit seinem eigenen Wert dargestellt wird. Wenn das Histogramm und das Bild erstellt werden.

Die lineare Dehnung wird wie folgt auf das Histogramm angewendet:

  • Erstellen Sie ein Histogramm des Originalbildes
  • Stellen Sie neue Maximum (Nmax) und neue Mindestwerte (Nmin) ein
  • Berechnen Sie die Anzahl der Behälter im ursprünglichen Histogramm, wobei der Wert von Bins = (OMAX - OMIN)
  • Berechnen Sie den Abstand für ein neues Histogramm SO Space = (Nmax - Nmin) / (Omax - Omerin)
  • Erstellen Sie ein neues Histogramm mit entsprechenden Positionen für neue Bins (NB), die durch dargestellt werden
  • Verwenden Sie ein neues Histogramm, um ein neues Bild zu erstellen

Die vorherige Formel kann durch eine vereinfachte Version von C ++ - Code wie folgt dargestellt werden:

#Include mit dem Namespace STD; int main () const int nmin = 0; const int nmax = 255; const int omin = 60; const int Omax = 65; int space = (nmax - nmin) / (omax - omin); int Bins = (Omax - OMIN); für (int j = 0; j <= bins; j++ )   std::cout << j + OMIN << ": " << NMIN + ( j * space ) << endl;   return 0; 

KOMPILIEREN:

G ++ Mülleimer.CPP -O -Mülleimer

AUSGANG:

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

Der obige C ++ - Code ist eine wirklich vereinfachte Version des linearen Stretchalgorithmus. Im nächsten Abschnitt werden wir die OpenCV -Bibliothek verwenden, um diese Aufgabe zu erledigen.

Mithilfe der OpenCV -Bibliothek können wir die CVNormalize -Funktion nutzen. Diese Funktion dauert mindestens fünf Argumente (Originalbild, neues Bild, Nmin, Nmax und Normalisierung). Der folgende OpenCV C ++ - Code nimmt ein Beispielbild als einzelnes Argument an. Der folgende C ++ - Code wendet die CVNormalize -Funktion auf ein Beispielbild an und erstellt Histogramm sowohl für das ursprüngliche als auch für normalisiertes Bild.

#include "cv.H "#include" HighGui.H "void create_histogram_image (iplimage*, iplimage*); int main (int argc, char ** argv) // Farbbild laden, angegeben durch das erste Argument IPlimage*source = cvloadimage (argv [1]); // Neues Bild erstellen Struktur // für das Graustufen-Ausgangsbild iplimage *Gray_img = cvcreateimage (cvsize (Quelle-> Breite, Quelle-> Höhe), IPL_Depth_8u, 1); // Setzen Sie den Typ CV_RGB2Gray, um // RGB-Bild auf Grayscale Cvcvtcolor (Quelle, Grau, Gray_img) zu setzen (Quelle, Grau, Grau, Gray_Img, Grau, Grau, Grau, Grau, Grau, Grau, Grau, Grau, Grau, Grau, Gray_img, Grau, Gray_img (Quelle, Gray_img , CV_RGB2GRAY); // neue Bildstruktur erstellen // Histogramm Bild iplimage *hist_img = cvCreateimage (cvsize (300,240), 8, 1); // Um ​​gestrecktes Ausgangsbild iplimage *Stretched_img = cvcreateimage (CVSIZE (Quelle-> Breite, Quelle-> Höhe), IPL_Depth_8u, 1); // neue Bildstruktur zu erstellen // Histogramm Bild iplimage *Stretched_hist_img = cvcreateimage (cvSimage (cvSimage) erstellen (300.240), 8, 1);CVSET (Stretched_hist_img, cvScalarall (255), 0); // Neue Bildstruktur erstellen //, um gestrecktes Ausgangsbild zu halten. // cvnormalisieren Funktionsaufruf, um lineare Stretch Cvnormalize (Gray_img, Stretched_img, 0, 255, cv_Minmax) anzuwenden; // Histogramm des Originalbildes erstellen create_histogram_image (Gray_img, hist_img); // Erstellen Sie das Histogramm des neuen Bildes. create_histogram_image (Stretched_img, Stretched_hist_img); // Alle Bilder anzeigen CVNAMEDWINDOW ("Original Grey-Scale-Bild", 1); cvshowimage ("Original graues Bild", Gray_img); cvnamedWindow ("gestrecktes graues Bild", 1); cvshowimage ("gestrecktes graues Bild", Stretched_img); cvnamedWindow ("graues Bildhistogramm", 1); cvshowimage ("graues Bildhistogramm", hist_img); cvnamedWindow ("gestrecktes Bildhistogramm", 1); cvshowimage ("gestrecktes Bildhistogramm", Stretched_hist_img); // auf unbestimmte Zeit auf Tastenanschlag Cvwaitkey (0) warten; Rückkehr 0;  void create_histogram_image (iplimage* gray_img, iplimage* hist_img) cvhistogram* hist; int hist_size = 256; Float -Bereich [] = 0,256; float* ranges [] = Bereich; float max_value = 0.0; float w_scale = 0.0#000000; ">; // Array erstellen, um Histogrammwerte Hist = cvcreatehist (1, & hist_size, cv_hist_array, Ranges, 1); // Histogrammwerte CVCALCHIST (& Gray_img, Hist, 0, Null); // Get the the the the the the the the the the the the the the the the the the the the the the the the the the the the the the the the the the the HistoRt. Minimale und maximale Werte des Histogramms cvgetminmaxhistValue (Hist, 0, & max_value, 0, 0); // Höhenhöhe unter Verwendung von Maximim-Wert cvscale (Hist-> Bins, Hist-> Bins, ((float) hist_img-> Höhe)// MAX_VALUE, 0); // Berechnen Sie die Breite w_scale = ((float) hist_img-> width)/hist_size; // Das Histogramm für (int i = 0; i; i; < hist_size; i++ )   cvRectangle( hist_img, cvPoint((int)i*w_scale , hist_img->Höhe), cvpoint ((int) (i+1)*w_scale, hist_img-> Höhe -cvround (cvgetReal1d (hist-> mutze, i))), cvscalar (0), -1, 8, 0);  

KOMPILIEREN:

g ++ 'pkg-config opencv--cflags-libs' normalisieren.CPP -o normalisieren 

AUSFÜHREN:

./Probe normalisieren.png 

AUSGANG:

Probe.PNG (Original RGB -Bild)

Im nächsten Schritt haben wir das RGB-Bild in einen grauen Maßstab umgewandelt:

Mit Cvnormalize haben wir eine lineare Dehnung angewendet:

Jetzt können wir Histogramme beider Bilder vergleichen.

Histogramm des ursprünglichen grauen Bildbildes:

Histogramm des neuen gestreckten Bildes:

Verwandte Linux -Tutorials:

  • Eine Einführung in Linux -Automatisierung, Tools und Techniken
  • Verschachtelte Schleifen in Bash -Skripten
  • Mastering -Bash -Skriptschleifen beherrschen
  • Wie man mit der Woocommerce -REST -API mit Python arbeitet
  • Dinge zu installieren auf Ubuntu 20.04
  • Wie oft müssen Sie Ihren Linux -Server neu starten??
  • Vergleich von Linux Apache Pre -Onk -vs -Worker -MPMs
  • Dinge zu tun nach der Installation Ubuntu 20.04 fokale Fossa Linux
  • Mint 20: Besser als Ubuntu und Microsoft Windows?
  • Linux -Leistungsoptimierung: Tools und Techniken