Ir ao conteúdo
  • Cadastre-se

C Reduzir quantidade de IF`s


Posts recomendados

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

}
}

 

Link para o comentário
Compartilhar em outros sites

// 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
Link para o comentário
Compartilhar em outros sites

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!