Identificação e leitura de imagens
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.
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
Curtidas 0
Respostas
Marcelo Saviski
03/12/2003
vixi, isso é um pouco complicado, mas vamos lá:
para a 1º dúvida faça o seguinte:
no eventoOnMouseMove do form faça:
a 2º é mais complicada:
tente assim (é um modo lento, mas serve de exemplo)
A da distância ficou sem solução (ainda)
OBS: não testei nenhuma das funções
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
GOSTEI 0
Marconi
03/12/2003
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
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
GOSTEI 0
Ricardo-op
03/12/2003
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.
Obrigado mais uma vez.
GOSTEI 0
Marcelo Saviski
03/12/2003
mas no fim, você vai ter que escanear e exibir a imagem em um componente Image não é?
GOSTEI 0
Ricardo-op
03/12/2003
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?
GOSTEI 0
Jaguarnet7
03/12/2003
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???
Mas,oq vc prentende, recortar a imagem do osso???
GOSTEI 0
Marcelo Saviski
03/12/2003
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:
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:
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
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
GOSTEI 0