logo

OpenCV: segmentação usando limite

Neste artigo, uma técnica básica para segmentação de objetos chamada Limiar . Mas antes de entrar em mais detalhes, abaixo está uma breve visão geral do OpenCV. OpenCV (Open Source Computer Vision) é uma biblioteca de código aberto de plataforma cruzada de funções de programação destinada a executar tarefas de visão computacional em tempo real em uma ampla variedade de campos, como:
  • Reconhecimento facial
  • Sistemas de reconhecimento de íris
  • Reconhecimento de gestos
  • Interação humano-computador (HCI)
  • Robótica móvel
  • Identificação de objeto
  • Segmentação e reconhecimento
  • Visão estéreo Stereopsis: percepção de profundidade de 2 câmeras
  • Realidade aumentada
Ele também inclui uma biblioteca robusta de aprendizado de máquina estatística que contém vários classificadores diferentes usados ​​para oferecer suporte às áreas acima. Para usar o OpenCV basta importar ou incluir as bibliotecas necessárias e começar a usar a infinidade de funções disponíveis. Limiar é uma técnica de segmentação muito popular usada para separar um objeto de seu fundo. No artigo abaixo descrevi várias técnicas usadas para limitar imagens em tons de cinza (8 bits) . O processo de limiar envolve a comparação de cada valor de pixel da imagem (intensidade de pixel) com um limite especificado. Isso divide todos os pixels da imagem de entrada em 2 grupos:
  1. Pixels com valor de intensidade inferior ao limite.
  2. Pixels com valor de intensidade maior que o limite.
Esses 2 grupos agora recebem valores diferentes dependendo dos vários tipos de segmentação. OpenCV suporta 5 esquemas de limite diferentes em imagens em escala de cinza (8 bits) usando a função: Limite duplo (InputArray src OutputArray dst double thresh double maxval tipo int) Parâmetros:
  • InputArray src: imagem de entrada (Mat 8 bits ou 32 bits)
  • OutputArray dst: imagem de saída (mesmo tamanho da entrada)
  • limite duplo: definir valor limite
  • double maxval: maxVal usado no tipo 1 e 2
  • int type* :Especifica o tipo de limite a ser usado. (0-4)
  • *Abaixo é fornecida uma lista de tipos de limites. Imagem de entrada original' title= A imagem RGB de entrada é primeiro convertida em uma imagem em tons de cinza antes que o limiar seja feito. OpenCV: segmentação usando limite' title= Tipos de limites
      Limite binário (tipo int = 0) 0_130' title= Dos dois grupos obtidos anteriormente, o grupo que possui membros com intensidade de pixel maior que o limite definido é atribuído Max_Value ou, no caso de escala de cinza, um valor de 255 (branco). Os membros do grupo restante têm suas intensidades de pixel definidas como 0 (preto). EQ1' title= Se o valor da intensidade do pixel em (x y) na imagem de origem for maior que o limite, o valor na imagem final será definido como maxVal. Limite binário invertido (tipo int = 1) 1_130' title= Inv. O limite binário é igual ao limite binário. A única diferença essencial é no limite Inv.Binary, o grupo com intensidades de pixel maiores que o limite definido é atribuído como '0', enquanto os pixels restantes com intensidades menores que o limite são definidos como maxVal. eq2' title= Se o valor da intensidade do pixel em (x y) na imagem de origem for maior que o limite, o valor na imagem final será definido como 0, caso contrário, será definido como maxVal. Limiar truncado (tipo int = 2) 2_150' title= O grupo que tem intensidades de pixel superiores ao limite definido é truncado para o limite definido ou, por outras palavras, os valores de pixel são definidos para serem iguais ao limite definido. Todos os outros valores permanecem os mesmos. eq3' title= Se o valor da intensidade do pixel em (x y) na imagem de origem for maior que o limite, o valor na imagem final será definido como limite, caso contrário, permanecerá inalterado. Limite para Zero (tipo int = 3) OpenCV: segmentação usando limite' title= Uma técnica de limite muito simples em que definimos a intensidade do pixel como '0' para todos os pixels do grupo com valor de intensidade de pixel menor que o limite. eq4' title= Se o valor da intensidade do pixel em (x y) na imagem de origem for maior que o limite, o valor em (x y) na imagem final não muda. Todos os pixels restantes são definidos como ‘0’. Limite para Zero Invertido (int type=4) OpenCV: segmentação usando limite' title= Semelhante à técnica anterior, aqui definimos a intensidade do pixel como '0' para todos os pixels do grupo com valor de intensidade de pixel maior que o limite. eq5' title= Se o valor da intensidade do pixel em (x y) na imagem de origem for maior que o limite, o valor em (x y) na imagem final será definido como ‘0’. Todos os valores de pixel restantes permanecem inalterados.
    Para compilar programas OpenCV você precisa ter a biblioteca OpenCV instalada em seu sistema. Estarei postando um tutorial simples para o mesmo nos próximos dias. Se você já instalou o OpenCV execute o código abaixo com a imagem de entrada de sua escolha. CPP
    // CPP program to demonstrate segmentation // thresholding. #include  #include  #include  #include  using namespace cv; int main(int argc char** argv) {  if (argc != 2)   {  cout << ' Usage: '  '   ' << endl;  return -1;  }  int threshold_value = 0;  // Valid Values: 0 1 2 3 4  int threshold_type = 2;   // maxVal useful for threshold_type 1 and 2  int maxVal = 255;   // Source image  Mat src = imread(argv[1] 1);  cvNamedWindow('Original' CV_WINDOW_NORMAL);  imshow('Original' src);  Mat src_gray dst;  // Convert the image to GrayScale  cvtColor(src src_gray CV_BGR2GRAY);  // Create a window to display results  cvNamedWindow('Result' CV_WINDOW_NORMAL);  createTrackbar('Threshold' 'Result'   &threshold_value 255);  while (1)   {  threshold(src_gray dst threshold_value   maxVal threshold_type);  imshow('Result' dst);  waitKey(1);  } }