Skip to content

Archives

  • Janeiro 2022
  • Dezembro 2021
  • Novembro 2021
  • Outubro 2021
  • Setembro 2021

Categories

  • Sem categorias
Trend RepositoryArticles and guides
Articles

Limiar do OpenCV ( Python , C++ )

On Janeiro 4, 2022 by admin
  • O que é o limiar da imagem?
  • Exemplos de limiares: C++ e Python
  • Input Image
  • Limiar Binário Inverso ( tipo = THRESH_BINARY_INV )
  • Limiar Truncado ( tipo = THRESH_TRUNC )
  • Threshold to Zero ( tipo = THRESH_TOZERO )
  • Inverted Threshold to Zero ( tipo = THRESH_TOZERO_INV)
  • Download code and example image

O que é o limiar da imagem?

Cuidadosamente observe a animação abaixo (Figura 1). Quantos números você vê? A maioria de vocês vai ver os números: 32 (oh sim, olhem com cuidado), 64, 100, 128, 180, 200 e 255. Mas há mais na imagem do que o que encontra o olho.

Num segundo você pode ver a versão limite da imagem original. Você vai notar que todos os números parecem completamente brancos (ou seja, eles têm um valor de escala de cinza de 255) e há um número extra 5. Você não notou o número 5 na imagem original porque o seu valor em escala de cinza era, bem 5. Na verdade, todos os números na imagem original têm um valor de escala de cinzentos igual ao número. Portanto 255 é o mais brilhante e 5 é o mais escuro.

Ler os números na imagem limite é muito mais fácil do que ler os números na imagem original. Não é surpreendente que um algoritmo de reconhecimento de texto encontre a imagem limite no nosso exemplo muito mais fácil de processar do que a imagem original.

Este post foi testado no OpenCV 4.4.

No Computer Vision quando você torna uma tarefa mais fácil para os seres humanos, você normalmente também a torna mais fácil para algoritmos de computador.

Todos os algoritmos de thresholding tomam uma imagem de origem (src) e um valor threshold (thresh) como input e produzem uma imagem de saída (dst), comparando o valor de pixel no pixel de origem ( x , y ) com o threshold. Se src ( x , y ) > thresh , então dst ( x , y ) é atribuído algum valor. Caso contrário, dst ( x , y ) é atribuído algum outro valor.

A forma mais simples de limiar é chamada de Limiar Binário. Além da imagem de origem (src) e do valor limiar (thresh), ele toma outro parâmetro de entrada chamado valor máximo ( maxValue ). Em cada localização de pixel (x,y) ele compara o valor de pixel src ( x , y ) para debulhar. Se src ( x , y ) for maior que thresh, ele define o valor da imagem de destino pixel dst ( x , y ) para maxValue. Caso contrário, ele o coloca em zero. Aqui está como se parece o pseudo-código.

# Simple threshold function pseudo codeif src(x,y) > thresh dst(x,y) = maxValueelse dst(x,y) = 0

Mais geralmente, há muitos tipos de limiar baseado em diferentes regras de limiar aplicadas a src ( x , y ) para obter dst ( x , y ). Vamos ver os vários tipos de limiares disponíveis no OpenCV.

Exemplos de limiares: C++ e Python

Se você estiver com pressa, pule para a seção de download para obter código e imagem de exemplo.

Input Image

Nos exemplos a seguir, usaremos esta imagem como input. Clique na Figura 2 para fazer o download da imagem em formato PNG. A imagem de entrada contém números escritos com intensidade ( valor em escala de cinza ) igual ao próprio número. Por exemplo, o valor de pixel do número 200 é 200, e o de 32 é 32. É por isso que 32 aparece muito mais escuro que 200 na imagem.

Figure 2: Input Image. Clique para abrir um PNG de alta resolução em uma janela diferente

Em cada exemplo, vamos explicar a regra de thresholding através de um pseudo-código, fornecer C++ e python exemplo, e a imagem de thresholded output.

Binary Thresholding ( type = THRESH_BINARY )

Este é o tipo mais comum e mais simples de thresholding.

Regra do limiar

# Binary Thresholdif src(x,y) > thresh dst(x,y) = maxValueelse dst(x,y) = 0

Python

# import opencvimport cv2# Read imagesrc = cv2.imread("threshold.png", cv2.IMREAD_GRAYSCALE)# Set threshold and maxValuethresh = 0maxValue = 255 # Basic threshold exampleth, dst = cv2.threshold(src, thresh, maxValue, cv2.THRESH_BINARY);

C++

using namespace cv; // Read imageMat src = imread("threshold.png", IMREAD_GRAYSCALE);Mat dst;// Set threshold and maxValuedouble thresh = 0;double maxValue = 255; // Binary Thresholdthreshold(src,dst, thresh, maxValue, THRESH_BINARY);

Resultado do limiar binário

Figure 3 mostra o resultado da aplicação do limiar binário à imagem de entrada com thresh = 0 e maxValue = 255.

Figure 3 : Limiar Binário ( debulha = 0 e valor máximo = 255)

Mudando debulha para 127 remove todos os números inferiores ou iguais a 127.

Figure 4 : Limiar Binário ( debulha = 127 e maxValor = 255)

Mudando o valor máximo para 128 define o valor das regiões de limiar para 128.

Figure 5: Limiar Binário com valor máximo definido para 128

Limiar Binário Inverso ( tipo = THRESH_BINARY_INV )

O limiar binário inverso é o oposto do limiar binário. O pixel de destino é ajustado para zero se o pixel de origem correspondente for maior que o limiar, e para maxValue, se o pixel de origem for menor que o limiar.

Regra de limiar

# Inverse Binary Thresholdif src(x,y) > thresh dst(x,y) = 0else dst(x,y) = maxValue

Python

th, dst = cv2.threshold(src, thresh, maxValue, cv2.THRESH_BINARY_INV)

C++

threshold(src,dst, thresh, maxValue, THRESH_BINARY_INV);

Resultado do Limiar Binário Inverso

Note que o resultado do limiar binário inverso mostrado na Figura 6 é exatamente o inverso da Figura 4.

Figure 6 : Limiar Binário Inverso ( debulha = 127, valor máximo = 0 )

Limiar Truncado ( tipo = THRESH_TRUNC )

Neste tipo de limiar, o pixel de destino é definido para o limiar ( debulha ) se o valor do pixel de origem for maior que o limiar. Caso contrário, ele é definido para o valor do pixel de origem. maxValue é ignorado.

Regra do limiar

# Truncate Thresholdif src(x,y) > thresh dst(x,y) = threshelse dst(x,y) = src(x,y)

Python

th, dst = cv2.threshold(src, thresh, maxValue, cv2.THRESH_TRUNC)

C++

threshold(src,dst, thresh, maxValue, THRESH_TRUNC);

Resultado do limiar truncado

Figure 7 mostra o resultado da aplicação do limiar truncado à imagem de entrada. Note que todos os valores acima do limiar ( 127 ) são definidos para 127, e todos os valores menores ou iguais a 127 são inalterados. maxValue é ignorado.

Figure 7 : Limiar Truncado (thresh = 127)

Threshold to Zero ( tipo = THRESH_TOZERO )

Neste tipo de limiar, o valor do pixel de destino é definido para o valor do pixel de origem correspondente se o valor do pixel de origem for maior que o limiar. Caso contrário, ele é ajustado para zero. O valor máximo é ignorado.

Regra do limiar

# Threshold to Zeroif src(x,y) > thresh dst(x,y) = src(x,y)else dst(x,y) = 0

Python

th, dst = cv2.threshold(src, thresh, maxValue, cv2.THRESH_TOZERO)

C++

threshold(src,dst, thresh, maxValue, THRESH_TOZERO);

Resultado do limiar a zero

Figure 8: Limiar a Zero ( thresh = 127 )

Inverted Threshold to Zero ( tipo = THRESH_TOZERO_INV)

Neste tipo de limiar, o valor do pixel de destino é ajustado a zero se o valor do pixel de origem for maior que o limiar. Caso contrário, é definido para o valor do pixel de origem. maxValue é ignorado.

Regra do limiar

# Inverted Threshold to Zeroif src(x,y) > thresh dst(x,y) = 0else dst(x,y) = src(x,y)

Python

th, dst = cv2.threshold(src, thresh, maxValue, cv2.THRESH_TOZERO_INV)

C++

threshold(src,dst, thresh, maxValue, THRESH_TOZERO_INV);

Resultado do Limiar Invertido para Zero

Figure 9 mostra o resultado da aplicação do Limiar Invertido para Zero na imagem de entrada. Os números abaixo do limiar mantêm o seu valor de escala de cinza, e os números acima do limiar são 0, exceto para o limite. Os artefatos no limite são devido ao fato de que os valores dos pixels no limite transitam de 0 para o valor do número sobre alguns pixels. Assim, alguns dos pixels do limite estão abaixo do limite.

Figure 9: Limiar Invertido a Zero ( thresh = 127 )

Download code and example image

Deixe uma resposta Cancelar resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

Arquivo

  • Janeiro 2022
  • Dezembro 2021
  • Novembro 2021
  • Outubro 2021
  • Setembro 2021

Meta

  • Iniciar sessão
  • Feed de entradas
  • Feed de comentários
  • WordPress.org
  • DeutschDeutsch
  • NederlandsNederlands
  • SvenskaSvenska
  • DanskDansk
  • EspañolEspañol
  • FrançaisFrançais
  • PortuguêsPortuguês
  • ItalianoItaliano
  • RomânăRomână
  • PolskiPolski
  • ČeštinaČeština
  • MagyarMagyar
  • SuomiSuomi
  • 日本語日本語

Copyright Trend Repository 2022 | Theme by ThemeinProgress | Proudly powered by WordPress