Processamento de Imagem
CAROS AMIGOS
PRECISO, ÁPÓS FAZER A LEITURA DAS CORES DA IMAGEM SUBSTITUIR AS PROXIMAS, OU SEJA, PEGAR O VARIOS TONS DE CINZA QUE APARECE E TORNA-LO UM SÓ BASEADO NO QUE MAIS APARECE, PRECISO DE ALGUMAS DICAS DE COMO PROCEDER PARA FAZER ISSO, EU JA CONSIGO GUARDAR AS CORES E SUAS QTDES EM UM VETOR RECORD,
MAS PRECISO DE DICAS DE COMO TRABALHAR COM O VETOR.
SE PUDEREM AJUDAR
OBRIGADO
[i:a09a7d2441]Título em maiúsculas editado. Procure digitar sua mensagem em minúsculas. Leia as [url=http://delphiforum.icft.com.br/forum/viewtopic.php?t=6689&sid=add834b4ed94967502cf2381c38e751a][u:a09a7d2441]Regras de Conduta[/u:a09a7d2441][/url]. (marcelo.c – Moderador)[/i:a09a7d2441]
PRECISO, ÁPÓS FAZER A LEITURA DAS CORES DA IMAGEM SUBSTITUIR AS PROXIMAS, OU SEJA, PEGAR O VARIOS TONS DE CINZA QUE APARECE E TORNA-LO UM SÓ BASEADO NO QUE MAIS APARECE, PRECISO DE ALGUMAS DICAS DE COMO PROCEDER PARA FAZER ISSO, EU JA CONSIGO GUARDAR AS CORES E SUAS QTDES EM UM VETOR RECORD,
MAS PRECISO DE DICAS DE COMO TRABALHAR COM O VETOR.
SE PUDEREM AJUDAR
OBRIGADO
[i:a09a7d2441]Título em maiúsculas editado. Procure digitar sua mensagem em minúsculas. Leia as [url=http://delphiforum.icft.com.br/forum/viewtopic.php?t=6689&sid=add834b4ed94967502cf2381c38e751a][u:a09a7d2441]Regras de Conduta[/u:a09a7d2441][/url]. (marcelo.c – Moderador)[/i:a09a7d2441]
Soldi
Curtidas 0
Respostas
Beppe
13/10/2003
Como pretende identificar os tons de cinza? Por regra, os valores de R, G e B são os mesmos, mas se houver leves variações o resultado ainda será cinza.
Ataliba
Ataliba
GOSTEI 0
Soldi
13/10/2003
Como pretende identificar os tons de cinza? Por regra, os valores de R, G e B são os mesmos, mas se houver leves variações o resultado ainda será cinza.
Ataliba
QUANDO FAÇO UMA VARREDURA PIXEL A PIXEL, GUARDANDO A COR E A QTDE QUE ELA APARECE, APARECEM VARIOS TONS, O QUE PRECISO É TESTA-LOS E TRANSFORMA-LOS EM UM SÓ.
SE TIVER MAIS ALGUMA DICA, FICO GRATO
SOLDI
GOSTEI 0
Beppe
13/10/2003
Onde está armazenando as cores?
GOSTEI 0
Soldi
13/10/2003
Onde está armazenando as cores?
em um vetor record, ele se ajusta ao tamanho existente de cada cor e suas qtdes..
soldi
GOSTEI 0
Mtakaki
13/10/2003
Rapaz eu também estou tendo o mesmo problema, eu estou armazenando os valores de uma imagem (0-255, em tons de cinza) num array dinâmico do tamanho da imagem, mas na hora de visualizar fica com defeitos, para transformar os valores na escale de cinza eu utilizo um função que muda da base decimal para hexdecimal, ex: (255 - manda o valor 255 e retorna $FFFFFF e já tentei $00FFFFFF, em cada componente do RGB retorna o valor igual para cada um 255=FF), mas mesmo assim não aparece certo. alguém pode me dizer como fazer?
GOSTEI 0
Soldi
13/10/2003
Rapaz eu também estou tendo o mesmo problema, eu estou armazenando os valores de uma imagem (0-255, em tons de cinza) num array dinâmico do tamanho da imagem, mas na hora de visualizar fica com defeitos, para transformar os valores na escale de cinza eu utilizo um função que muda da base decimal para hexdecimal, ex: (255 - manda o valor 255 e retorna $FFFFFF e já tentei $00FFFFFF, em cada componente do RGB retorna o valor igual para cada um 255=FF), mas mesmo assim não aparece certo. alguém pode me dizer como fazer?
pois é eu tb quero substituir as cores, mas nao em tons de conza, mas amntendo as cores, paenas reduzir as tonalidades, ou seja, tornar varios tons de cinza em apenas um só, aí é o problema, a imagem retornada fica com uma cor só, nao se mantem os padroes, tb nao sei como fazer.
soldi
GOSTEI 0
Mtakaki
13/10/2003
Ei cara eu consegui resolver uma parte, eu fiz assim:
No caso para 256 tons de cinza:
0 - preto
255 - branco
Como você viu o Tcolor é no formato hexadecimal, segundo o help do delphi. Eu fiquei testando o que poderia ser, então usei um Image.Canvas.Pen:= Tcolor(255); e retornou a cor vermelha, então eu notei que o Tcolor teria que passar o valor em base 10 e não na base 16.
fiz o seguinte ex:
o valor 200 - transformei para hexadecimal, no caso C8 então para cada componente RGB concatenei e resultou C8C8C8 ( 1º par Azul, 2º Verde e 3º Vermelho).
Usei uma função que retornava o valor em decimal, no caso retornava 13158600 pelo menos para o meu programa funcionou, só notei um problema uma das fotos que eu tentei abrir ficou com um problema, apareceram uns pontos vermelhos. No caso não é necessário fazer essas transformações pega o valor (x) e faz cada x retornar 16^2*x+16^1*x+16^0*x, que vai retornar o valor também;
{-------Procedimento para transformar em decimal para Hexadecimal----}
function DecToBase( Decimal: LongInt): String;
const
Symbol: String[16] = ´0123456789ABCDEF´;
var
Strin: String;
Bas: Byte;
begin
Strin := ´´;
repeat
Bas := Decimal mod 16;
Strin := Symbol[Bas + 1] + Strin;
Decimal := Decimal div 16;
until ( Decimal = 0 );
Result := Strin;
end;
{-------Procedimento para transformar em Hexadecimal para decimal ----}
function retornaBase( Str: String): Integer;
var
x,y,z:integer;
valor:real;
begin
x:=length(Str); z:=0; valor:=0;
repeat
case Str[x] of
´0´:y:=0;
´1´:y:=1;
´2´:y:=2;
´3´:y:=3;
´4´:y:=4;
´5´:y:=5;
´6´:y:=6;
´7´:y:=7;
´8´:y:=8;
´9´:y:=9;
´A´:y:=10;
´B´:y:=11;
´C´:y:=12;
´D´:y:=13;
´E´:y:=14;
´F´:y:=15;
end;
valor:=valor+(power(16,z))*y;
x:=x-1; z:=z+1;
until ( x = 0 );
Result := round(valor);
end;
No caso para 256 tons de cinza:
0 - preto
255 - branco
Como você viu o Tcolor é no formato hexadecimal, segundo o help do delphi. Eu fiquei testando o que poderia ser, então usei um Image.Canvas.Pen:= Tcolor(255); e retornou a cor vermelha, então eu notei que o Tcolor teria que passar o valor em base 10 e não na base 16.
fiz o seguinte ex:
o valor 200 - transformei para hexadecimal, no caso C8 então para cada componente RGB concatenei e resultou C8C8C8 ( 1º par Azul, 2º Verde e 3º Vermelho).
Usei uma função que retornava o valor em decimal, no caso retornava 13158600 pelo menos para o meu programa funcionou, só notei um problema uma das fotos que eu tentei abrir ficou com um problema, apareceram uns pontos vermelhos. No caso não é necessário fazer essas transformações pega o valor (x) e faz cada x retornar 16^2*x+16^1*x+16^0*x, que vai retornar o valor também;
{-------Procedimento para transformar em decimal para Hexadecimal----}
function DecToBase( Decimal: LongInt): String;
const
Symbol: String[16] = ´0123456789ABCDEF´;
var
Strin: String;
Bas: Byte;
begin
Strin := ´´;
repeat
Bas := Decimal mod 16;
Strin := Symbol[Bas + 1] + Strin;
Decimal := Decimal div 16;
until ( Decimal = 0 );
Result := Strin;
end;
{-------Procedimento para transformar em Hexadecimal para decimal ----}
function retornaBase( Str: String): Integer;
var
x,y,z:integer;
valor:real;
begin
x:=length(Str); z:=0; valor:=0;
repeat
case Str[x] of
´0´:y:=0;
´1´:y:=1;
´2´:y:=2;
´3´:y:=3;
´4´:y:=4;
´5´:y:=5;
´6´:y:=6;
´7´:y:=7;
´8´:y:=8;
´9´:y:=9;
´A´:y:=10;
´B´:y:=11;
´C´:y:=12;
´D´:y:=13;
´E´:y:=14;
´F´:y:=15;
end;
valor:=valor+(power(16,z))*y;
x:=x-1; z:=z+1;
until ( x = 0 );
Result := round(valor);
end;
GOSTEI 0
Mtakaki
13/10/2003
Ei acabei de ver que estava enganado em relação a transformação direto, tem que passar de decimal para hexa e de hexa para decimal
GOSTEI 0
Jaguarnet7
13/10/2003
sobe
GOSTEI 0
Beppe
13/10/2003
Aqui vai em pseudo-código:
Para a tabela Pontos pode-se usar um vetor não-ordenado.
A tabela Cores pode ser implementada como um tabela de dispersão(hash table). Cada item na tabela é composto por (Cor, Aparições)
O método de inserção na tabela Cores primeiro verifica se a cor existe; em caso positivo incrementa-se o campo Aparições do item, senão um novo item é adicionado.
para cada coluna X para cada linha Y se o pixel em (X, Y) é tom de cinza, então adicione o ponto (X, Y) à tabela Pontos adicione a cor do pixel em (X, Y) à tabela Cores descubra a cor Cor predominante na tabela Cores para cada item (X, Y) na tabela Pontos mude o pixel em (X, Y) para a cor Cor
Para a tabela Pontos pode-se usar um vetor não-ordenado.
A tabela Cores pode ser implementada como um tabela de dispersão(hash table). Cada item na tabela é composto por (Cor, Aparições)
O método de inserção na tabela Cores primeiro verifica se a cor existe; em caso positivo incrementa-se o campo Aparições do item, senão um novo item é adicionado.
se existe Cor em um item C de Cores, então C.Aparições <- C.Aparições + 1 senão C <- (Cor, 1) adicione C à Cores
GOSTEI 0
Nildo
13/10/2003
Pelo que entendi você quer transformar uma imagem para um tom de cinza? Usa essa função que eu criei:
Existem formas mais rápidas de se fazer isso. Mas é complicado mexer em Assembler. Mas acho que o que tem aqui já resolve.
procedure TomDeCinza(const Bmp: TBitmap); type TRGBArray = array[0..32767] of TRGBTriple; PRGBArray = ^TRGBArray; var x, y, Cinza: Integer; Linha: PRGBArray; begin Bmp.PixelFormat := pf24Bit; for y := 0 to Bmp.Height - 1 do begin Linha := Bmp.ScanLine[y]; for x := 0 to Bmp.Width - 1 do begin Cinza := (Linha[x].rgbtRed + Linha[x].rgbtGreen + Linha[x].rgbtBlue) div 3; Linha[x].rgbtRed := Cinza; Linha[x].rgbtGreen := Cinza; Linha[x].rgbtBlue := Cinza; end; end; end;
Existem formas mais rápidas de se fazer isso. Mas é complicado mexer em Assembler. Mas acho que o que tem aqui já resolve.
GOSTEI 0