Ir ao conteúdo

Posts recomendados

Postado

Gostaria de uma ajuda para reduzir a quantidade de if`s nesse algoritmo, ele serve para detectar componentes conexos

explicação de algumas funções,

cria_lista()=cria uma lista

pop(lista) remove um elemto

push(lista) coloca um elemento

// considerando que a borda da imagem são zeros
// im - imagem original
// im_rot - imagem rotulada - inicialmente zerada
label = 1;
lista_proximos = cria_lista();
Ponto p, p_atual;
for i = 1 ate nlinhas-1 {
 for j = 1 ate ncolunas-1 {
 // percorre toda a imagem em busca de um pixel foreground (valor 1)
 p.x = i;
 p.y = j;
 if (im(p.x,p.y)==1) and (im_rot(p.x,p.y)==0) {
 // atribui o label a posição (i,j)
 im_rot(p.x,p.y) = label;
 // inclui na lista de busca dos vizinhos
 lista_proximos.push_back(p);
 while !vazia(lista_proximos) {
 // busca o próximo ponto da lista
 p_atual = pop(lista_proximos);

 // buscando por pixels na vizinhança do ponto atual que são iguais a 1
 // ponto acima
 p.x = p_atual.x - 1;
 p.y = p_atual.y;
 // verifica if o ponto acima não é um e não foi rotulado
 if (im(p.x, p.y)==1) and (im_rot(p.x,p.y)==0){
 // atribui o label a posição atual
 im_rot(p.x,p.y) = label;
 // adiciona o ponto na lista para verificar vizinhos posteriormente
 push(lista_proximos,p);
 }
 // ponto abaixo
 p.x = p_atual.x + 1;
 p.y = p_atual.y;
 if (im(p.x, p.y)==1) and (im_rot(p.x,p.y)==0){
 // atribui o label a posição atual
 im_rot(p.x,p.y) = label;
 // busca o próximo ponto da lista
 push(lista_proximos,p);
 }
 // ponto à esquerda
 p.x = p_atual.x;
 p.y = p_atual.y - 1;
 if (im(p.x, p.y)==1) and (im_rot(p.x,p.y)==0){
 im_rot(p.x,p.y) = label;
 push(lista_proximos,p);
 }
 // ponto à direita
 p.x = p_atual.x;
 p.y = p_atual.y + 1;
 if (im(p.x, p.y)==1) and (im_rot(p.x,p.y)==0){
 im_rot(p.x,p.y) = label;
 push(lista_proximos,p);
 }
 } // enquanto
 label = label + 1;
 } // if

}
}

 

Postado
// considerando que a borda da imagem são zeros
// im - imagem original
// im_rot - imagem rotulada - inicialmente zerada
label = 1;
lista_proximos = cria_lista();
Ponto p, p_atual;
for i = 1 ate nlinhas-1 {
 for j = 1 ate ncolunas-1 {
 // percorre toda a imagem em busca de um pixel foreground (valor 1)
 p.x = i;
 p.y = j;

 if (im(p.x,p.y)==1) and (im_rot(p.x,p.y)==0) {
 // atribui o label a posição (i,j)
 im_rot(p.x,p.y) = label;
 // inclui na lista de busca dos vizinhos
 lista_proximos.push_back(p);
 while !vazia(lista_proximos) {
 // busca o próximo ponto da lista
 p_atual = pop(lista_proximos);

for (int d = 0; d < 4; d++)
{
  p.x = p_atual.x - (d == 0) + (d == 1);
  p.y = p_atual.y - (d == 2) + (d == 3);
 // verifica if o ponto acima não é um e não foi rotulado
 if (im(p.x, p.y)==1) and (im_rot(p.x,p.y)==0){
 // atribui o label a posição atual
 im_rot(p.x,p.y) = label;
 // adiciona o ponto na lista para verificar vizinhos posteriormente
 push(lista_proximos,p);
 }
}//for
 
 } // enquanto
 label = label + 1;
 } // if

}
}

Percebi que você repete o mesmo trecho de código 4 vezes, então usei um laço de 0 a 3.

  • Obrigado 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!