Identificação e leitura de imagens

03/12/2003

0

Trabalho com Delphi 5 e estou com um projeto de leitura de imagens e preciso fazer a leitura de duas formas:
1- Tenho um quadrado amarelo de arestas pretas e ao redor dele tudo é cinza, quando o ponteiro do mouse está sobre o amarelo, um label ou edit deve apresentar o nome da cor ou seu valor hexa. Ao colocar o mouse sobre a parte cinza, deve aparecer o nome cinza ou hexa, e quando o ponteiro estiver sobre a aresta, deve aparecer preto ou seu valor hexa.

2- Tenho dois quadrados amarelos sem bordas e todo o restante da tela é cinza, ao clicar um botão, o programa automaticamente indentificaria o limite entre o amarelo eo cinza e contornaria o quadrado automaticamente com uma borda preta. Estando os dois quadrados contornados, ele me informaria a distância em pixel, mm, etc... que separa um quadrado do outro.

Se alguém já fez um trabalho assim ou possui informações sobre isso, eu ficaria muito grato.

Obrigado.


Ricardo-op

Ricardo-op

Responder

Posts

03/12/2003

Marcelo Saviski

vixi, isso é um pouco complicado, mas vamos lá:

para a 1º dúvida faça o seguinte:

no eventoOnMouseMove do form faça:

Label1.Caption :=´#´ +  IntToHex(Canvas.Pixels[X, Y], 6);


a 2º é mais complicada:

tente assim (é um modo lento, mas serve de exemplo)

var
  i, j: Integer
  Cor1, Cor2: TColor;
  R, G, B: Boolean;
  Dif: Boolean;
begin
  for j := 0 to ClientWidht - 1 do
  begin
    for i := 0 to ClientHeight - 1 do
    begin
      Cor1 := Canvas.Pixels[i, j];
      Cor2 := Canvas.Pixels[i +1, j + 1];
      Dif := Cor 1 <> Cor2;      
      if Dif then
        Canvas.Pixels[i, j] := clBlack;
    end;
end;


A da distância ficou sem solução (ainda)

OBS: não testei nenhuma das funções


Responder

03/12/2003

Marconi

O que eu acho que voce precisa para contornar e calcular a distância seria manter duas variaveis globais TControl que guardiam as propriedades dos dois quadrados.

Para contornar basta utilizar as funções
Canvas.LineTo(x,y)
e Canvas.movTo(x,y)
os x e y seriam dados pelas propriedades top, height, left e width de cada um dos quadrados.

Para calcular a distância em pixeis bastaria verificar qual está mais à direita ou mais abaixo, comparando as propriedades top e left.

A distancia entre eles dependeria da posição que os achasse. Se estiverem em diagonal teria que aplicar pitagoras para encontrar a hipotenusa, que seria então a distância.

É meio complicado para montar mas a idéia é esta.

Marconi


Responder

04/12/2003

Ricardo-op

Agradeço pelas respostas, mas esqueci de informar que estas imagens são scaneadas e não desenhas no form do Delphi. (O melhor seria scanear no formato JPG ou BMP)

Obrigado mais uma vez.


Responder

04/12/2003

Marcelo Saviski

mas no fim, você vai ter que escanear e exibir a imagem em um componente Image não é?


Responder

04/12/2003

Ricardo-op

Sim, de qualquer forma a imagem snaneada será passada para o componente image. Mas, desculpem-me por minha ignorância nesta área, mas supondo que a imagem scaneada seja uma radiografia da mão, preciso identificar o branco e o preto e contornar a figura branca que representam os ossos. Com os códigos acima apresentados isso é possível?


Responder

04/12/2003

Jaguarnet7

Vc deve fazer testes para ver as faixa de cores que os ossos aparecem normalmente. Sabendo isso ira usar a cor como delimitador da imagem.
Mas,oq vc prentende, recortar a imagem do osso???


Responder

04/12/2003

Marcelo Saviski

Veja como isso funciona:

digamos que vc tenha a imagem, fundo preto com um quadrado verde no centro

seria algo + ou - assim:

(cada # é um pixel da imagem)


[color=green:57c8442a3e][/color:57c8442a3e]
[color=green:57c8442a3e][/color:57c8442a3e]
[color=green:57c8442a3e][/color:57c8442a3e]


e quer se gerar algo assim:

[color=red:57c8442a3e][/color:57c8442a3e]
[color=red:57c8442a3e][/color:57c8442a3e][color=green:57c8442a3e][/color:57c8442a3e][color=red:57c8442a3e][/color:57c8442a3e]
[color=red:57c8442a3e][/color:57c8442a3e][color=green:57c8442a3e][/color:57c8442a3e][color=red:57c8442a3e][/color:57c8442a3e]
[color=red:57c8442a3e][/color:57c8442a3e][color=green:57c8442a3e][/color:57c8442a3e][color=red:57c8442a3e][/color:57c8442a3e]
[color=red:57c8442a3e][/color:57c8442a3e]

o que se precisa fazer é passar pixel por pixel, e verificar se o do lado é diferente, se for, deixar ele vermelho

assim:

for Y := 0 to Height - 1 do
  for X := 0 to Width - 1 do
    if Pixels[X, Y] <> Pixels[X + 1, Y + 1] then
      Pixels[X, Y] := clRed;


a propriedade Pixels pertence ao Canvas, para usar o Canvas você precisa de uma Imagem Bitmap

faça esse teste bem simples:

coloque um Image e um botão, carregue um Bitmep qualquer que tenha ai, de preferencia com cores bem contrastantes e com uma cor de fundo uniforme, e coloque esse código no Botão:

for Y := 0 to Height - 1 do
  for X := 0 to Width - 1 do
    if Image.Picture.Bitmap.Canvas.Pixels[X, Y] <> Image.Picture.Bitmap.Canvas.Pixels[X + 1, Y + 1] then
      Image.Picture.Bitmap.Canvas.Pixels[X, Y] := clRed;


faça o teste e me diga se funcionou, é só um exemplo básico (e lento) que deve contornar a imagem
mas lembre-se de carregar uma imagem com poucas cores e fundo uniforme, de preferencia formas geométricas (é só um teste por enquanto)

qualquer dúvida pode falar, tenho bastante coisa sobre manipulação de imagens que poderão lhe servir


Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar