Limiar do OpenCV ( Python , C++ )
On Janeiro 4, 2022 by adminO 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.
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.
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.
Mudando debulha para 127 remove todos os números inferiores ou iguais a 127.
Mudando o valor máximo para 128 define o valor das regiões de limiar 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.
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.
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
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.
Deixe uma resposta