1 pontos por GN⁺ 2025-08-24 | 1 comentários | Compartilhar no WhatsApp
  • A câmera line scan é muito adequada para fotografar objetos em movimento, como trens, em alta resolução e sem distorção
  • O processamento de imagem exige vários algoritmos e técnicas, como detecção de região de interesse, estimativa de velocidade e reamostragem
  • Trabalhos de melhoria de qualidade, como remoção de faixas horizontais e verticais e supressão de ruído, são importantes
  • A implementação inclui processamento de grandes volumes de dados, uso de Python, numpy e várias melhorias experimentais
  • Comparar com exemplos de fotos line scan de outros autores pode trazer insights adicionais

Visão geral da câmera line scan

  • A câmera line scan varre a imagem em velocidade muito alta com uma linha (ou duas linhas) de pixels
  • A câmera fica fixa, e o trem passa diante dela enquanto sua forma completa é registrada
  • O fundo estático se repete em todas as colunas verticais da imagem, produzindo o efeito característico de faixas
  • Esse método permite fotografar imagens de alta resolução sem distorção ao longo de todo o comprimento do trem, sendo útil também para hobbies como modelismo ferroviário
  • Câmeras de tira baseadas em filme funcionam com princípio semelhante, mas diferem por exigir ajuste manual da velocidade do filme devido a problemas de sensibilidade

Equipamento de câmera

  • É usado o modelo [Alkeria Necta N4K2-7C], com sensor de imagem de arranjo Bayer duplo de 4096×2
  • Os dados brutos são armazenados como arranjos binários de 16 bits
  • As capturas foram feitas em vários ambientes, como metrôs urbanos

Detecção de região de interesse (ROI)

  • Como varreduras longas geram grande volume de dados de fundo, um algoritmo de detecção automática de trechos com objetos em movimento é indispensável
  • Para distinguir estruturas verticais (movimento) de estruturas horizontais (fundo), combinam-se função de energia (baseada em gradiente) e valor máximo de pixel
  • A imagem é dividida em vários chunks, e a pontuação é calculada pela energia no percentil 99 de cada chunk
  • Chunks com pontuação 1,5 vez maior que a mínima são considerados áreas contendo objetos em movimento
  • Métodos anteriores falharam em generalizar; o método atual funciona de forma mais eficiente em situações variadas

Estimativa de velocidade

  • Quando o objeto está em movimento, falhas na estimativa de velocidade causam distorções em que a imagem fica esticada ou comprimida
  • A velocidade de movimento de cada chunk é calculada comparando os dois canais verdes (Green) da câmera
  • Para cada chunk, aplicam-se pequenos deslocamentos de -7 a +7 e calcula-se a soma das diferenças absolutas entre os dois canais para gerar um cost array
  • Para encontrar o pico subpixel, usa-se uma interpolação no estilo [mean shift] baseada em Gaussiana, e uma spline corrige a variação total
  • Os valores extraídos da spline representam o intervalo entre amostras na série temporal original e são usados para corrigir a distorção da imagem

Reamostragem

  • Novas imagens são extraídas calculando as posições de amostragem de acordo com a spline
  • Também são considerados casos excepcionais, como inversão horizontal quando a spline é negativa e erro quando ela fica próxima de 0
  • Para cada posição de amostragem, também se armazena a largura da amostra, melhorando o antialiasing com funções de janela adequadas, como a janela de Hann
  • Seleção simples de colunas ou janela retangular não são adequadas, pois geram artefatos grosseiros em upsampling

Demosaicing

  • É necessário um demosaicing customizado com interpolação bilinear, levando em conta o deslocamento espacial do arranjo Bayer de 2 colunas
  • Após a estimativa de velocidade, a interpolação linear é usada para corrigir efeitos como fringing
  • Como há diferença entre os dados dos dois canais verdes, pode haver margem para reconstrução full-color melhor do que em um arranjo Bayer comum

Remoção de faixas verticais

  • Jitter de clock (stripes) e variações no brilho do objeto causam faixas verticais na imagem
  • As faixas são corrigidas com uma função de correção por coluna usando regressão linear e pesos gaussianos (iteratively reweighted least squares)
  • Essas funções de correção formam uma estrutura de grupo matemático; para evitar drift ao acumular correções, considera-se uma solução de sistema linear band-diagonal
  • Na prática, também é possível suprimir ruído de alta frequência com métodos como filtro de suavização exponencial
  • A correção das faixas deve ser feita obrigatoriamente antes da estimativa de velocidade

Supressão de ruído

  • É aplicada uma técnica de controle de ruído baseada em patches (block matching), aproveitando ativamente as texturas repetitivas da superfície do trem
  • Usa-se o vetor de características de cada patch de 3×3 pixels, reduzindo o ruído por média ponderada entre patches semelhantes
  • O desempenho melhora ao pré-processar com distribuição de Poisson (transformação por raiz) conforme a intensidade do sinal antes da comparação
  • A técnica tradicional de total variation denoising não é adequada, pois perde muita textura
  • Este método tem a limitação de exigir muito processamento e ser lento

Correção de inclinação (skew)

  • Se a câmera não estiver perfeitamente vertical, ocorre um leve desalinhamento em toda a imagem
  • A detecção de skew deve ser feita após a estimativa de velocidade e antes da reamostragem final, para minimizar perda de informação
  • A detecção automática pode ser feita com transformada de Hough e outras técnicas baseadas em estruturas verticais

Correção de cor

  • Atualmente, o ajuste de cor é feito com uma matriz de correção manual
  • Na prática, a qualidade é bastante boa, inclusive em tons de pele naturais

Detalhes de implementação

  • Todo o pipeline foi implementado em Python e numpy
  • Como o volume de dados é grande (4096 linhas × centenas de milhares de colunas), adotou-se um processamento em chunks por etapas para superar problemas de falta de memória
  • Como a alocação total de memória de uma vez seria impraticável, os dados são processados e salvos parcialmente em cada etapa

Experiência de implementação

  • Foi tentado o uso de ferramentas de IA para implementar o código, mas os resultados foram limitados
  • Em muitos casos, a IA gera código ineficiente, como transformar problemas lineares em complexidade de tempo quadrática sem necessidade
  • Também surgem problemas de memória em processamento de arrays grandes, como geração desnecessária de máscaras completas
  • Por outro lado, alguns pontos como certas APIs, estruturação de código e visualização (Matplotlib) podem ser agilizados com ajuda de IA

Exemplos de fotos de trens line scan de outras pessoas

Adam Magyar

  • [Adam Magyar] realizou os projetos "Stainless" e "Urban Flow" com uma câmera line scan própria em preto e branco
  • Ele já produziu resultados muito limpos mesmo em ambientes de baixa luminosidade, como metrôs internos
  • É necessário escolher bem o ponto de captura para evitar o flicker da iluminação do metrô

Blog KR64

  • O [kr64.seesaa.net] publica uma grande quantidade de fotos line scan de trens variados por todo o Japão
  • Aparentemente, usa uma câmera slit-scan em filme, com altíssima variedade e qualidade
  • O site frequentemente fica fora do ar por problemas técnicos, e não é possível entrar em contato

1 comentários

 
GN⁺ 2025-08-24
Comentários do Hacker News
  • Também gostei muito dessa ideia, tentei fazer algo parecido usando um drone para escanear a maior árvore da Nova Inglaterra, o resultado não ficou tão bom, mas talvez eu tente de novo
    Resultado
    Esse projeto fazia parte desta história

  • Eu também uso um processo parecido, mas filmo com uma câmera comum e junto manualmente os quadros para fazer animação
    Uma característica desse método é que ele naturalmente faz o foco ir para o objeto, enquanto o fundo se transforma em padrões abstratos
    Cada “linha” tem cerca de 15 px de largura
    Exemplo 1 Exemplo 2 Exemplo 3
    Filmei um timelapse do pôr do sol no skyline de Tóquio, apliquei uma técnica semelhante e depois usei motion tracking para fazer o tempo fluir da esquerda para a direita do quadro
    Aqui, cada linha tem 4 pixels, e a animação original é em resolução 8k
    Vídeo relacionado Motion tracking

  • Procurei mais exemplos de trens com line scan, veja aqui

  • Isso me lembra os primeiros experimentos em que scanners flatbed eram usados como se fossem backs digitais
    Exemplo: link

  • Fico curioso para saber como ficaria fotografar paisagens em movimento de um carro ou trem com uma câmera line scan; imagino que o efeito de paralaxe possa gerar distorções interessantes

    • Tenho algumas fotos tiradas de dentro de um trem —
      série Nankai 6000 de Osaka: foto
      paisagem da França: foto 1
      Marselha: foto 2
      Califórnia: foto 3 foto 4
      As árvores roxas aparecem assim porque a câmera era sensível ao infravermelho próximo; desde que comprei um filtro IR-cut, não consegui mais tirar fotos em trens, e algumas também têm frame drops ou outros artefatos
    • Era exatamente isso que eu queria saber; fico curioso se seria tecnicamente possível “escanear” toda a paisagem de uma viagem de trem de cerca de uma hora
    • Fica tudo borrado, parecido com o fundo das fotos no texto principal deste post
      Se for rápido como carro ou trem, não dá para ver direito; precisa ser bem devagar para sair uma distorção legal
  • Artigo realmente interessante, especialmente esta foto de bondinho
    Também é uma questão interessante pensar em como escolher o conteúdo do fundo

  • Pelo que eu me lembro, na última Olimpíada a Omega usou uma combinação de câmera strip na linha de chegada com um display de linhas de alta frequência
    Numa câmera comum isso aparecia como linhas piscando, mas no fundo do photo finish dava para ver o logo da Omega
    É algo bem sutil, mas achei impressionante terem conseguido implementar isso

  • Gosto deste vídeo sobre câmeras de photo finish em pistas de corrida de cavalos, então compartilho aqui; acho que outras pessoas também podem achar interessante

  • A sensação de velocidade é enorme ao ver o trem perfeitamente parado, com nitidez, entre faixas de cor

  • Na minha opinião, o denoising parece um pouco artificial e dá a impressão de enfatizar ainda mais os artefatos restantes, especialmente o color fringe nos detalhes
    Acho que eu preferiria deixar esse recurso desligado
    E, em relação ao processo de demosaic, fico curioso se implementar esta versão do RCD poderia produzir alta resolução sem artefatos

    • Na prática, eu também desativo o denoising por padrão, porque cada faixa horizontal fica mais visível e o processamento também fica muito mais lento
      A correção de banding vertical também não funciona bem em todos os casos e às vezes até cria mais banding
      Ainda há bastante trabalho a fazer
      O demosaicing RCD é literalmente o próximo passo; o problema de color fringing acontece porque usei interpolação linear simples para os canais vermelho e azul
      Como o canal verde cobre a imagem inteira, estou pensando em formas de usá-lo como guia para melhorar a interpolação
    • Eu também acho que o resultado com denoising não parece particularmente melhor