Przetwarzanie obrazu, liniowe rozciąganie i openCV

Przetwarzanie obrazu, liniowe rozciąganie i openCV

Próbując rozpoznać obiekty poprzez badanie obrazów, stosowane są różne techniki przetwarzania obrazu i analizy. W tym artykule krótko opisano algorytm liniowy i jego użycie w OPENCV.

Liniową technikę rozciągania można zastosować do obrazów, w których znaczny brak kontrastu może powodować fałszywą identyfikację obiektów, jego związek przestrzenny i znaczenie. Zwiększenie kontrastu przez liniowe rozciąganie można zastosować do obrazów o bardzo niskich lub bardzo wysokich zmianach jasności. Aby zastosować liniowy algorytm rozciągania, obraz należy przekonwertować na skalę szarości, a wszystkie 8-bitowe piksele i jego wartości są rejestrowane na histogram.

Histogram będzie zawierał wszystkie 256 poziomów szarości (0–255) w tak zwanych pojemnikach, a każda wartość piksela będzie miała miejsce w pojemniku reprezentowaną z własną wartością. Po utworzeniu histogramu i obrazu zidentyfikowane są wartości maksymalne (OMAX) i minimalne (OMIN).

Rozciąganie liniowe jest stosowane do histogramu w następujący sposób:

  • Utwórz histogram oryginalnego obrazu
  • Ustaw nowe wartości maksimum (Nmax) i nowe minimum (NMIN)
  • Oblicz liczbę pojemników w oryginalnym histogramie, gdzie wartość pojemników = (OMAX - OMIN)
  • Oblicz odstępy dla nowego histogramu, więc przestrzeń = (nmax - nmin) / (OMAX - OMIN)
  • Utwórz nowy histogram z odpowiednimi pozycjami dla nowych pojemników (NB) reprezentowanych przez
  • Użyj nowego histogramu, aby utworzyć nowy obraz

Poprzednia formuła może być reprezentowana przez uproszczoną wersję kodu C ++ w następujący sposób:

#include przy użyciu przestrzeni nazw 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); for (int j = 0; j <= bins; j++ )   std::cout << j + OMIN << ": " << NMIN + ( j * space ) << endl;   return 0; 

SKOMPILOWAĆ:

Pojemniki G ++.CPP -O Bins

WYJŚCIE:

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

Powyższy kod C ++ jest naprawdę uproszczoną wersją liniowego algorytmu rozciągania. W następnej sekcji używamy biblioteki openCV, aby wykonać to zadanie.

Korzystając z Biblioteki OpenCV, możemy skorzystać z funkcji CVNORMALALE. Ta funkcja wymaga co najmniej pięciu argumentów (oryginalny obraz, nowy obraz, NMIN, Nmax i typ normalizacji). Poniższy kod OpenCV C ++ bierze przykładowy obraz jako pojedynczy argument. Poniższy kod C ++ zastosuje funkcję CVnormalizę do przykładowego obrazu i utworzy histogram zarówno dla obrazu oryginalnego, jak i znormalizowanego.

#include "cv.H „#include” highgui.h "void create_histogram_image (iplimage*, iplimage*); int main (int argc, char ** argv) // ładuj kolor koloru określony przez pierwszy argument iplimage*Źródło = cvloadimage (argv [1]); // Utwórz nowy obraz Struktura // dla obrazu wyjściowego w skali iplimage *Gray_img = cvCreateImage (cvSize (źródło-> szerokość, źródło-> wysokość), IPL_DEPTH_8U, 1); // Ustaw typ cv_rgb2gray do konwersji // RGB obrazu na grayscale cvcvtColor (źródło, szare_img , Cv_rgb2gray); // Utwórz nową strukturę obrazu // Aby przechowywać obraz histogramu iplimage *hist_img = cvcreateImage (cvsize (300,240), 8, 1); cvset (hist_img, cvscalarall (255), 0); // Utwórz nową strukturę obrazu. // do przechowywania rozciągniętego obrazu wyjściowego IPLIMAGE *stretched_img = cvcreateImage (cvSize (źródło-> szerokość, źródło-> wysokość), ipl_depth_8u, 1); // Utwórz nową strukturę obrazu // Aby pomieścić histogram obraz IPLIMAGE *rozciągnięty_hist_hist_img = cvCreateImage (cvSize (300 240), 8, 1);CVSET (rozciągnięty_hist_img, CVSCALARALL (255), 0); // Utwórz nową strukturę obrazu //, aby utrzymać rozciągnięty obraz wyjściowy Iplimage *wyrównany_img = cvcreateImage (cvSize (źródło-> szerokość, źródło-> wysokość), ipl_depth_8u, 1); // CVnormalize Funkcja wywołania, aby zastosować liniowe rozciąganie CVNORMALALE (Gray_img, rozciągnięte_img, 0, 255, cv_minmax); // Utwórz histogram oryginalnego obrazu create_histogram_image (Gray_Img, Hist_img); // Utwórz histogram nowego obrazu. create_histogram_image (rozciągnięty_img, rozciągnięty_hist_img); // Wyświetl wszystkie obrazy CVNamedWindow („Oryginalny obraz w skali szarości”, 1); CvShowimage („Oryginalny obraz skali szarości”, Gray_img); CvnaMedWindow („obraz rozciągnięty w skali szarości”, 1); CvShowimage („obraz rozciągnięty w skali szarości”, rozciągnięty_img); CVNamedWindow („Histogram obrazu w skali szarości”, 1); CvShowimage („Histogram obrazu w skali szarości”, Hist_Img); cvnaMedWindow („rozciągnięty histogram obrazu”, 1); cvShowimage („rozciągnięte histogram obrazu”, rozciągnięte_hist_img); // Poczekaj na czas nieokreślony na klawisze CVWaitKey (0); powrót 0;  void create_histogram_image (iplimage* Gray_img, iplimage* hist_img) cvhistogram* hist; int hist_size = 256; Float Range [] = 0,256; float* zakresy [] = Range; float max_value = 0.0; float w_scale = 0.0#000000; ">; // Utwórz tablicę, aby przechowywać wartości histogramu Hist = cvCreateHist (1 i hist_size, cv_hist_array, zakresy, 1); // Oblicz wartości histogram Minimalne i maksymalne wartości histogramu CvgetMinmaxHistValue (Hist, 0, i Max_Value, 0, 0); // Ustaw wysokość za pomocą wartości maksymalnej CVScale (Hist-> Bins, hist-> pojemniki, ((float) hist_img-> wysokość)/ max_value, 0); // oblicz szerokość w_scale = ((float) hist_img-> szerokość)/hist_size; // Wykreśl histogram dla (int i = 0; i < hist_size; i++ )   cvRectangle( hist_img, cvPoint((int)i*w_scale , hist_img->Wysokość), cvpoint ((int) (i+1)*w_scale, hist_img-> wysokość -cvround (cvgetReal1d (Hist-> Bins, i))), cvscalar (0), -1, 8, 0);  

SKOMPILOWAĆ:

g ++ 'pkg-config openCV--cflags-libs' normalizuj.cpp -o normalizuj 

WYKONAĆ:

./normalizuj próbkę.png 

WYJŚCIE:

próbka.PNG (oryginalny obraz RGB)

W następnym kroku przekonwertowaliśmy obraz RGB na skalę szarości:

Korzystając z CVnormalize, zastosowaliśmy liniowy odcinek:

Teraz możemy porównać histogramy obu obrazów.

Histogram oryginalnego obrazu w skali szarości:

Histogram nowego rozciągniętego obrazu:

Powiązane samouczki Linux:

  • Wprowadzenie do automatyzacji, narzędzi i technik Linuksa
  • Zagnieżdżone pętle w skryptach Bash
  • Mastering Bash Script Loops
  • Jak pracować z WooCommerce Rest API z Pythonem
  • Rzeczy do zainstalowania na Ubuntu 20.04
  • Jak często musisz ponownie uruchomić serwer Linux?
  • Porównanie Linux Apache Prefork vs Pracowni
  • Rzeczy do zrobienia po zainstalowaniu Ubuntu 20.04 Focal Fossa Linux
  • Mint 20: Lepsze niż Ubuntu i Microsoft Windows?
  • Optymalizacja wydajności Linux: Narzędzia i techniki