Post

Detecção de bordas e relevos em imagens com MiniMagic e Ruby Threads 🌄

O campo do processamento e análise de imagens digitais fez avanços notáveis nos primeiros anos do século 21. Esse progresso foi impulsionado por uma fervorosa pesquisa e pelo desenvolvimento de tecnologias aplicáveis a diversos domínios, incluindo medicina, biologia, automação industrial e sensoriamento remoto.

Para verificar o código correspondente, acesse: Github.com/ErnaneJ/ruby-edge-detection-threads

📸 Processamento Digital de Imagens

O processamento digital de imagens envolve um conjunto de técnicas para capturar, representar e transformar imagens com a ajuda de computadores. Essa abordagem permite a extração de informações, o aprimoramento estrutural e a interpretação automática de imagens por meio de programas de computador. Ele melhora tanto a compreensão humana quanto a análise computacional de imagens.

🔍 Detecção de Bordas

A detecção de bordas é um aspecto crítico do processamento de imagens, facilitando a identificação de transições significativas nas intensidades de pixels e permitindo a segmentação e análise de objetos.

Empregamos operações de convolução para detectar bordas em uma imagem de matriz $M$ por $N$ em ambas as direções $x$ e $y$, usando máscaras como operadores aplicados a pixels de interesse e seus vizinhos. Vários operadores, como os operadores de Prewitt, podem ser utilizados para essa tarefa. As matrizes, como as abaixo, são instrumentais:

\[Gx = \begin{bmatrix} -1 & 0 & 1 \\ -1 & 0 & 1 \\ -1 & 0 & 1 \end{bmatrix} ; Gy = \begin{bmatrix} -1 & -1 & -1 \\ 0 & 0 & 0 \\ 1 & 1 & 1 \end{bmatrix}\]

Essas matrizes calculam variações de intensidade nas direções $ x $ e $ y $, permitindo-nos identificar bordas.

$ Gx $ e $ Gy $ representam as máscaras usadas para detecção de bordas nas direções $x$ e $y$ da imagem digital. Aplicando essas máscaras, obtemos imagens de borda separadas em ambas as direções. A imagem segmentada final é produzida amalgamando informações dessas duas imagens de borda.

m

🧮 Pseudocódigo para Implementação

Dada uma imagem em tons de cinza $I$ com dimensões $M$ × $N$, realizamos o seguinte:

  • Criamos uma imagem (matriz) $M$×$N$, $Gx$, com todos os elementos inicializados com 0.
  • Criamos uma imagem (matriz) $M$ × $N$, $Gy$, com todos os elementos inicializados com 0.
  • Criamos uma imagem (matriz) $M$ × $N$, $G$, que inicialmente pode ser configurada com todos os elementos iguais a zero.

O pseudocódigo para os cálculos é delineado no bloco de código abaixo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Calculando informações de borda
Para i variando de 1 a M-2
  Para j variando de 1 a N-2
    # Cálculo de Gx...
    Gx(i, j) = [ I(i+1, j-1) + I(i+1, j) + I(i+1, j+1) ] - [ I(i-1, j-1) + I(i-1, j) + I(i-1, j+1) ]
    # Limitando...
    Se Gx(i, j) < 0, então Gx(i, j) = 0;
    Se Gx(i, j) > 255, então Gx(i, j) = 255;
  fim-para
fim-para

# Gerando imagem de saída...
Para i variando de 0 a M-1
  Para j variando de 0 a N-1
    G(i, j) = Gx(i, j) + Gy(i, j)
    Se G(i, j) > 255, então G(i, j) = 255
  fim-para
fim-para

🛠️ Projeto

Este projeto envolve o desenvolvimento de um programa Ruby que utiliza threads para criar duas threads, uma para obter a imagem de borda na direção $x$ e a outra na direção $y$ a partir de uma imagem existente. A thread principal abre a imagem de entrada, a representa usando uma matriz adequada e, em seguida, inicia duas threads para calcular as imagens de borda $Gx$ e $Gy$. Após a conclusão de suas tarefas, a thread pai lê as duas matrizes de imagem resultantes para calcular a imagem de saída $G$.

🚀 Desenvolvimento

  • O programa principal processa quatro imagens distintas localizadas na pasta de ativos.
  • A classe principal do projeto é ImageProcessing, projetada exclusivamente para este problema. O código contém informações detalhadas sobre os métodos e o uso.
  • A única biblioteca/gema usada neste projeto é MiniMagick, conforme indicado no Gemfile.
  • Nenhuma biblioteca externa foi necessária para a implementação de threads, pois o Ruby (v3.2.0 2022-12-25 revision a528908271 - x86_64-linux) inclui nativamente a classe Thread.

📊 Resultados

OriginalProcessado
MoedasMoeda
CachorroCachorro
LenaLena
UFRNUFRN

📚 Referências

Esta postagem está licenciada sob CC BY 4.0 pelo autor.