O que é Thresholding?
Thresholding, ou limiarização, é um tipo de segmentação de imagem que envolve a conversão de uma imagem em escala de cinza para uma imagem binária. Neste processo, escolhe-se um valor de limiar (threshold). Todos os pixels da imagem que têm valores abaixo desse limiar são normalmente definidos como pretos (ou 0), e todos os pixels com valores iguais ou acima do limiar são definidos como brancos (ou 255, no caso de imagens de 8 bits).
Funcionamento do cv2.threshold
A função cv2.threshold
em Python funciona da seguinte forma:
retval, thresholded_image = cv2.threshold(src, thresh, maxval, type)
-
src
: Imagem de entrada, que deve estar em escala de cinza. -
thresh
: O valor do limiar. Pixels com intensidade menor quethresh
são transformados de acordo com o tipo de thresholding aplicado. -
maxval
: O valor a ser dado se o pixel tiver intensidade maior ou igual athresh
. -
type
: O tipo de limiarização a ser aplicado. Há várias opções, como:cv2.THRESH_BINARY
: Os pixels acima do limiar são definidos comomaxval
, e os outros como 0.cv2.THRESH_BINARY_INV
: Inverte oTHRESH_BINARY
, definindo pixels abaixo do limiar comomaxval
.cv2.THRESH_TRUNC
: Pixels acima do limiar são definidos como o valor do limiar, o restante permanece inalterado.cv2.THRESH_TOZERO
: Pixels abaixo do limiar são definidos como 0, o restante permanece inalterado.cv2.THRESH_TOZERO_INV
: Inverte oTHRESH_TOZERO
.
-
retval
: É o valor do limiar utilizado, que pode ser útil em alguns contextos. -
thresholded_image
: É a imagem resultante após a aplicação do threshold.
A função cv2.morphologyEx
do OpenCV é uma ferramenta versátil para realizar operações morfológicas avançadas em imagens. A morfologia é uma ampla classe de operações de processamento de imagem que processam imagens com base em formas. Essas operações são aplicadas a imagens binárias, geralmente após a limiarização, e são úteis para remover ruído, separar ou fundir objetos na imagem, e outras tarefas que dependem da forma dos objetos.
Funcionamento do cv2.morphologyEx
A função cv2.morphologyEx
funciona da seguinte maneira:
output_image = cv2.morphologyEx(src, op, kernel, anchor, iterations, borderType, borderValue)
src
: A imagem de origem.op
: O tipo de operação morfológica a ser realizada. Alguns exemplos comuns incluem:cv2.MORPH_OPEN
: Abertura. Útil para remover pequenos objetos do primeiro plano (por exemplo, pequenos pontos brancos em uma imagem binária).cv2.MORPH_CLOSE
: Fechamento. Bom para fechar pequenos buracos no primeiro plano ou pequenos pontos pretos no objeto.cv2.MORPH_GRADIENT
: Gradiente morfológico. Útil para encontrar os contornos dos objetos.cv2.MORPH_TOPHAT
: Transformação "Top Hat". Isso destaca os elementos menores da imagem.cv2.MORPH_BLACKHAT
: Transformação "Black Hat". Útil para destacar pequenos elementos escuros em um fundo claro.
kernel
: O elemento estruturante usado para a operação. É uma matriz que decide a natureza da operação. Um kernel comum é uma matriz quadrada de uns.anchor
,iterations
,borderType
,borderValue
: São parâmetros adicionais que especificam a posição do âncora do kernel, o número de vezes que a operação é aplicada, o tipo de borda a ser usada e o valor da borda, respectivamente.
O que é Dilatação?
A dilatação é uma operação que "cresce" ou "engrossa" os objetos em uma imagem. É particularmente útil para:
- Aumentar o tamanho de objetos em primeiro plano (geralmente brancos em uma imagem binária).
- Conectar áreas separadas.
- Preencher buracos pequenos em objetos.
- Suavizar os contornos dos objetos.
A operação de dilatação funciona considerando o elemento estruturante (ou kernel) e um pixel de âncora. O kernel é deslizado sobre a imagem (como um filtro) e para cada posição do kernel, se pelo menos um pixel sob o kernel é "1", o pixel na posição do âncora é ajustado para "1" (para imagens binárias) ou para o maior valor sob o kernel (para imagens em tons de cinza).
Funcionamento do cv2.dilate
A função cv2.dilate
funciona da seguinte maneira:
dilated_image = cv2.dilate(src, kernel, anchor, iterations, borderType, borderValue)
src
: Imagem de origem.kernel
: O elemento estruturante utilizado para dilatação. Se nenhum kernel for especificado, um kernel de 3x3 é usado por padrão.anchor
: Posição do âncora no kernel; o padrão é o centro do kernel.iterations
: Número de vezes que a operação de dilatação é aplicada. Mais iterações resultam em objetos mais dilatados.borderType
eborderValue
: Definem como a borda da imagem é tratada durante a operação.
A dilatação é frequentemente usada em combinação com a erosão, outra operação morfológica básica, para realizar tarefas como abertura, fechamento, e extração de bordas. A escolha do kernel e o número de iterações dependem do tamanho e da forma dos objetos na imagem e do resultado desejado.
O que é Distance Transform?
Na transformação de distância, os pixels de primeiro plano (geralmente brancos) em uma imagem binária são transformados de forma que cada pixel contém um número que indica a distância desse pixel até o pixel de fundo (geralmente preto) mais próximo. Essa distância pode ser calculada de diferentes maneiras, por exemplo, usando a distância Euclidiana, a distância de Manhattan, ou a distância de tabuleiro de xadrez.
Funcionamento do cv2.distanceTransform
A função cv2.distanceTransform
é usada da seguinte forma:
distanceImage = cv2.distanceTransform(src, distanceType, maskSize)
src
: A imagem binária de origem, onde os objetos são brancos e o fundo é preto.distanceType
: O tipo de distância a ser usado. Pode sercv2.DIST_L2
para a distância Euclidiana,cv2.DIST_L1
para a distância de Manhattan, oucv2.DIST_C
para a distância de tabuleiro de xadrez, entre outros.maskSize
: O tamanho da máscara usada para a computação da distância. Afeta a precisão do resultado.
A imagem resultante (distanceImage
) é uma imagem em tons de cinza onde os valores dos pixels representam as distâncias. Esta transformação é particularmente útil em várias aplicações, como:
- Segmentação de imagem e análise de forma, onde você precisa distinguir objetos que estão próximos uns dos outros.
- Processamento de imagens biomédicas, como a identificação de células ou outras estruturas.
- Navegação de robôs e planejamento de caminho, onde a distância aos objetos circundantes é crucial.
- Reconhecimento de padrões e visão computacional, para caracterizar a forma e a distribuição espacial dos objetos na imagem.