O processo típico envolve:
- Inicializar uma matriz identidade usando o operador
hom_mat2d_identity, que gera a matriz padrão [1.0, 0.0, 0.0, 0.0, 1.0, 0.0]; - Aplicar transformações específicas como
hom_mat2d_translate,hom_mat2d_rotateouhom_mat2d_scalepara modificar a matriz, permitindo combinações ou repetições; - Executar a transformação resultante em imagens, regiões ou contornos XLD usando operadroes como
affine_trans_image,affine_trans_regionouaffine_trans_contour_xld.
Os operadores principais têm as seguintes assinaturas:
hom_mat2d_translate( : : MatrizEntrada, DeslocamentoX, DeslocamentoY : MatrizSaida)hom_mat2d_rotate( : : MatrizEntrada, Angulo, CentroX, CentroY : MatrizSaida)hom_mat2d_scale( : : MatrizEntrada, FatorEscalaX, FatorEscalaY, CentroX, CentroY : MatrizSaida)
Abaixo, um exemplo demonstra a aplicação desses operadores em uma imagem de teste. O código inclui comentários explicativos sobre cada etapa.
read_image (Imagem, 'exemplo.jpg') threshold (Imagem, Area, 0, 200) opening_circle (Area, Area, 1.5) connection (Area, RegioesConectadas) select_shape_std (RegioesConectadas, RegiaoSelecionada, 'max_area', 70) area_center (RegiaoSelecionada, Atributo, LinhaRef, ColunaRef) dev_set_draw ('margin')
-
Aplicação de translação: deslocamento em Linha e Coluna dev_display (Imagem) disp_cross (3600, LinhaRef, ColunaRef, 10, 40) hom_mat2d_identity (MatrizBase) hom_mat2d_translate (MatrizBase, 30, 150, MatrizTranslacao) affine_trans_region (Area, AreaTransformada, MatrizTranslacao, 'nearest_neighbor')
-
Aplicação de rotação: ângulo em radianos, centro em (LinhaRef, ColunaRef) dev_display (Imagem) disp_cross (3600, LinhaRef, ColunaRef, 10, 40) hom_mat2d_rotate (MatrizBase, rad(20), LinhaRef, ColunaRef, MatrizRotacao) affine_trans_region (Area, AreaTransformada, MatrizRotacao, 'nearest_neighbor')
-
Aplicação de escala: fatores em Linha e Coluna, centro em (LinhaRef, ColunaRef) dev_display (Imagem) disp_cross (3600, LinhaRef, ColunaRef, 10, 40) hom_mat2d_scale (MatrizBase, 2.0, 1.05, LinhaRef, ColunaRef, MatrizEscala) affine_trans_region (Area, AreaTransformada, MatrizEscala, 'nearest_neighbor')
</div>O operador `vector_angle_to_rigid` oferece uma abordagem alternativa, combinando rotação e translação em uma única chamada. Sua assinatura é:
`vector_angle_to_rigid( : : OrigemLinha, OrigemColuna, AnguloOrigem, DestinoLinha, DestinoColuna, AnguloDestino : MatrizResultado)`
Este operador primeiro rotaciona a imagem em torno de (OrigemLinha, OrigemColuna) pelo ângulo (AnguloDestino - AnguloOrigem), e depois translada o ponto de origem para (DestinoLinha, DestinoColuna). Se os pontos de origem e destino coincidirem, equivale a uma rotação pura.
<div>```
read_image (Imagem, 'exemplo.jpg')
PontoLinha := 100
PontoColuna := 200
dev_display (Imagem)
for Iteracao := 1 to 150 by 1
vector_angle_to_rigid (PontoLinha, PontoColuna, 0, PontoLinha, PontoColuna, rad(10), Matriz)
disp_cross (3600, 100, 200, 10, 40)
affine_trans_image (Imagem, ImagemRotacionada, Matriz, 'nearest_neighbor', 'false')
copy_image (ImagemRotacionada, Imagem)
endfor
read_image (Imagem, 'dinamico.png') binary_threshold (Imagem, Regiao, 'max_separability', 'dark', Usado) dev_set_draw ('margin') connection (Regiao, RegioesConectadas) select_shape_std (RegioesConectadas, RegiaoPrincipal, 'max_area', 70) area_center (Imagem, AtributoImg, LinhaImg, ColunaImg)
rotate_image (Imagem, ImagemRotacionada, -90, 'constant') area_center (ImagemRotacionada, AtributoRot, LinhaRot, ColunaRot)
hom_mat2d_identity (MatrizInicial) hom_mat2d_rotate (MatrizInicial, -rad(90), LinhaImg, ColunaImg, MatrizRotacao) hom_mat2d_translate (MatrizRotacao, LinhaRot - LinhaImg, ColunaRot - ColunaImg, MatrizFinal) affine_trans_region (RegiaoPrincipal, RegiaoAjustada, MatrizFinal, 'constant')
</div>Observação: ao usar `rotate_image` com ângulos que não são múltiplos de 90°, apenas a rotação é aplicada sem translação adicional.
</div>