Identificação e leitura de imagens

03/12/2003

7

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.


Responder

Posts

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
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
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
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira