Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #58 da revista programar. Faz já o download aqui!

joao_info

[Resolvido] Imagem Binária - Algoritmo de Contagem

Mensagens Recomendadas

joao_info    0
joao_info

O objectivo consiste em contar quantas camadas tenho a preto e a branco numa imagem binária (no meu caso, é um passadeira), e dentro destas camadas contar o número de pixels que existem apenas numa linha recta vertical, de preferência colocada no centro da imagem.

A linguagem é matlab.

O algoritmo que tenho neste momento é:

I = rgb2gray(imread('pass_p.png'));

level = graythresh(I);
bw = im2uint8(im2bw(I,level));

imshow(bw);

[Nx, Ny] = size(I);
cP = 0;
cB = 0;

%Vectores
B = zeros(1,9);
P = zeros(1,9);

for k = 2:Ny-1
   index = 1;
   if(bw(((Nx-1)/2),k ) == 0) %preto
      cP = cP + 1;
      if(bw(((Nx-1)/2)-1, (k-1)) == 255)
          B(1,index) = B(1,cB);
          cB = 0;
          index = index +1;  
      end
   end
   if(bw(((Nx-1)/2),k) == 255) %branco
           cB = cB + 1;

       if(bw(((Nx-1)/2)-1, (k-1)) == 0)
           P(1,index) = P(1,cP);
           cP = 0;
           index = index +1;
       end
   end
end

Deixo aqui o link de uma possivel imagem ->

http://www.urbanreviewstl.com/wordpress/wp-content/uploads/2011/08/crosswalk.jpg

Contudo, não se esqueçam que a imagem tem que ser favoravel, de modo, que eu recortaria o que nao interessa, deixando apenas a passadeira.

Gostaria de saber se alguém consegue resolver o problema :)

Desde já obrigado :D

Editado por Rui Carlos
GeSHi

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    312
Rui Carlos

Não percebi o problema, e também não percebi o que pretendias fazer com o código.

Por linha vertical queres dizer exactamente o quê? Uma coluna de pixeis todos da mesma cor? Em que situações é que não terias uma linha vertical no meio?

Colocar uns comentários no código, a explicar o que pretendes fazer nas diferentes instruções também torna possível alguém verificar se o código está efectivamente a fazer o que pretendes, ou se o algoritmo que estás a usar funciona.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
joao_info    0
joao_info

Bem, o que eu pretendo é detetar uma passadeira.

Encontra-se aqui a imagem em questão:

https://drive.google.com/file/d/0B5tH_Qo3-GvhdGN4OWxBSDJVd0U/edit?usp=sharing

Vou tentar explicar-me melhor : A imagem é constituída por preto e branco, e considerando que esta é uma passadeira, vai ter banda pretas e brancas consecutivamente. O que eu pretende é contar quantas bandas tem a imagem e quantos pixeis tem cada banda detectada a preto e a branco.

Código:

[Nx Ny] = size(I); % tamanho da imagem
for k = 2:Ny-1 % Para k a começar em dois, incremento 1 a 1 verticalmente o Ny/2 (que na imagem é cerca de 300/2 = 150) , ou seja, centro da imagem
index = 1;
if(bw(((Nx-1)/2),k ) == 0) %vejo se o pixel em questão é preto
   cP = cP + 1; % se for, incremento 1 no contador
   if(bw(((Nx-1)/2)-1, (k-1)) == 255) % vejo se o pixel anterior é branco para detetar uma banda/camada
	   B(1,index) = B(1,cB); %se for, tento colocar esse valor no meu vetor B (nao sei se esta correto o codigo)
	   cB = 0;
	   index = index +1;  
   end
end

Espero ter clarificado algumas ideias :)

Desde já obrigado.

Editado por Rui Carlos
GeSHi

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    312
Rui Carlos

Já percebi o que pretendes.

Olhando para o teu código, penso que a inicialização do index devia estar fora do ciclo (assim estás sempre a escrever na mesma posição).

Adicionalmente, acho que devias ter B(1,index) = cB; em vez de B(1,index) = B(1,cB);.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.