Fórum Processamento de Imagem #188415
13/10/2003
0
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
Curtir tópico
+ 0Posts
13/10/2003
Beppe
Ataliba
Gostei + 0
14/10/2003
Soldi
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
14/10/2003
Beppe
Gostei + 0
14/10/2003
Soldi
em um vetor record, ele se ajusta ao tamanho existente de cada cor e suas qtdes..
soldi
Gostei + 0
13/11/2003
Mtakaki
Gostei + 0
14/11/2003
Soldi
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
15/11/2003
Mtakaki
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
15/11/2003
Mtakaki
Gostei + 0
17/11/2003
Jaguarnet7
Gostei + 0
17/11/2003
Beppe
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
18/11/2003
Nildo
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
Clique aqui para fazer login e interagir na Comunidade :)