Processamento de imagem, alongamento linear e OpenCV

Processamento de imagem, alongamento linear e OpenCV

Na tentativa de reconhecer objetos examinando imagens, várias técnicas de processamento e análise de imagens são aplicadas. Este artigo descreve brevemente o algoritmo de alongamento linear e seu uso no OpenCV.

A técnica de alongamento linear pode ser aplicada a imagens onde falta substancial de contraste pode resultar em falsa identificação de objetos, sua relação espacial e significado. O aumento do contraste por alongamento linear pode ser aplicado a imagens com variações muito baixas ou muito altas de brilho. Para aplicar o algoritmo de alongamento linear, uma imagem precisa ser convertida em escala cinza e todos os pixels de 8 bits e seus valores são registrados em histograma.

O histograma conterá todos os 256 níveis cinza (0 - 255) nas chamadas caixas e cada valor de pixels ocorrerá na lixeira representada com seu próprio valor. Quando o histograma e a imagem são criados, os valores máximos (OMAX) e mínimo (omin) são identificados.

Alongamento linear é aplicado ao histograma da seguinte forma:

  • Crie um histograma da imagem original
  • Defina novos valores máximos (NMAX) e novos mínimos (nmin)
  • Calcule o número de caixas no histograma original onde o valor das caixas = (OMAX - OMIN)
  • Calcule o espaçamento para um novo histograma para que o espaço = (nmax - nmin) / (OMAX - omin)
  • Crie um novo histograma com as posições correspondentes para novas caixas (NB) representadas por
  • Use um novo histograma para criar uma nova imagem

A fórmula anterior pode ser representada pela versão simplificada do código C ++ da seguinte forma:

#include usando namespace std; int main () const int nmin = 0; const int nmax = 255; const int omin = 60; const int max = 65; int espaço = (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; 

COMPILAR:

BINS G ++.CPP -O BINS

SAÍDA:

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

O código C ++ acima é realmente uma versão simplificada do algoritmo de alongamento linear. Na próxima seção, vamos usar a biblioteca OpenCV para fazer esta tarefa.

Usando a Biblioteca OpenCV, podemos aproveitar a função cvNormalize. Esta função leva no mínimo cinco argumentos (imagem original, nova imagem, nmin, nmax e tipo de normalização). O código OpenCV C ++ a seguir leva a imagem de amostra como um único argumento. O código C ++ a seguir aplicará a função cvnormalize a uma imagem de amostra e criará histograma para imagem original e normalizada.

#include "cv.h "#include" highgui.h "void create_histogram_image (iplimage*, iplimage*); int main (int argc, char ** argv) // carrega imagem colorida especificada pelo primeiro argumento iplimage*fonte = cvloadImage (argv [1]); // criar nova imagem Estrutura // Para a imagem em escala de cinza IPLIMAGE *Gray_Img = CVCreateImage (cvsize (fonte-> largura, fonte-> altura), ipl_depth_8u, 1); // Definir tipo cvcvcvcrgb2Gray para converter // rgb imagem para graycale cvcvcror , Cv_rgb2gray); // crie uma nova estrutura de imagem // para manter a imagem do histograma iPlimage *hist_img = cvcreateImage (cvsize (300.240), 8, 1); cvSet (hist_img, cvscalarall (255), 0); // Para manter a imagem de saída esticada iPlimage *Strethed_Img = cvcreateImage (cvsize (fonte-> largura, fonte-> altura), ipl_depth_8u, 1); // Crie uma nova estrutura de imagem // para manter a imagem do histograma iPlimage *Strethed_Hist_Img = cvcreateImage (CVSIZE (300.240), 8, 1);cvSet (Strethed_hist_Img, cvscalarall (255), 0); // Crie uma nova estrutura de imagem // para manter a imagem de saída esticada iPlimage *equalizada_img = cvcreateImage (cvsize (fonte-> largura, fonte-> altura), iPl_Depth_8U, 1); // cvNormalize Chamada de função para aplicar o alongamento linear CVNormalize (Gray_IMG, Strethed_Img, 0, 255, cv_minMax); // Crie histograma da imagem original create_histogram_image (Gray_IMG, hist_IMG); // Crie histograma da nova imagem. create_histogram_image (Strethed_Img, Strethed_Hist_Img); // exibe todas as imagens cvNamedWindow ("imagem original em escala cinza", 1); cvshowImage ("imagem original em escala cinza", Gray_IMG); cvNamedWindow ("Imagem em escala cinza esticada", 1); cvshowImage ("Imagem em escala de cinza esticada", Strethed_Img); cvNamedWindow ("histograma de imagem em escala cinza", 1); cvshowImage ("histograma de imagem em escala cinza", hist_img); cvNamedWindow ("histograma de imagem esticada", 1); cvshowImage ("Histograma de imagem esticada", Strethed_hist_Img); // Aguarde indefinidamente para o KeyStroke CvwaitKey (0); retornar 0;  void create_histogram_image (iplimage* Gray_img, iPlimage* hist_img) cvhistogram* hist; int hist_size = 256; Float Range [] = 0,256; Float* intervalos [] = range; Float max_value = 0.0; flutuar w_scale = 0.0#000000; ">; // Crie matriz para manter valores de histograma hist = cvcreatehist (1, & hist_size, cv_hist_array, intervalos, 1); // calcula os valores do histograma cvcalchist (& Gray_img, hist, 0, nulo); Valores mínimos e máximos do histograma cvgetMinMaxhistValue (hist, 0, & max_value, 0, 0); // Defina a altura usando o valor máximo cvScale (Hist-> Bins, Hist-> Bins, ((float) hist_img-> altura)/ max_value, 0); // calcular largura w_scale = ((float) hist_img-> width)/hist_size; // plote o histograma para (int i = 0; i < hist_size; i++ )   cvRectangle( hist_img, cvPoint((int)i*w_scale , hist_img->altura), cvpoint ((int) (i+1)*w_scale, hist_img-> altura -cvRound (cvgetReal1d (hist-> bins, i))), cvscalar (0), -1, 8, 0);  

COMPILAR:

G ++ 'PKG-CONFIG OPENCV--CFLAGS-Libs' Normalizar.CPP -O Normalizar 

EXECUTAR:

./Normalizar amostra.png 

SAÍDA:

amostra.PNG (imagem RGB original)

Na próxima etapa, convertemos a imagem RGB em uma escala de cinza:

Usando o CVNormalize, aplicamos alongamento linear:

Agora podemos comparar histogramas de ambas as imagens.

Histograma da imagem original em escala cinza:

Histograma da nova imagem esticada:

Tutoriais do Linux relacionados:

  • Uma introdução à automação, ferramentas e técnicas do Linux
  • Loops aninhados em scripts de basquete
  • Mastering Bash Script Loops
  • Como trabalhar com a API de Rest WooCommerce com Python
  • Coisas para instalar no Ubuntu 20.04
  • Com que frequência você tem que reiniciar seu servidor Linux?
  • Comparando Linux Apache Prefork vs Worker MPMS
  • Coisas para fazer depois de instalar o Ubuntu 20.04 fossa focal linux
  • Mint 20: Melhor que o Ubuntu e o Microsoft Windows?
  • Otimização de desempenho do Linux: ferramentas e técnicas