Fórum Processamento de Imagem #188415

13/10/2003

0

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]


Soldi

Soldi

Responder

Posts

13/10/2003

Beppe

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


Responder

Gostei + 0

14/10/2003

Soldi

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


Responder

Gostei + 0

14/10/2003

Beppe

Onde está armazenando as cores?


Responder

Gostei + 0

14/10/2003

Soldi

Onde está armazenando as cores?


em um vetor record, ele se ajusta ao tamanho existente de cada cor e suas qtdes..
soldi


Responder

Gostei + 0

13/11/2003

Mtakaki

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?


Responder

Gostei + 0

14/11/2003

Soldi

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


Responder

Gostei + 0

15/11/2003

Mtakaki

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;


Responder

Gostei + 0

15/11/2003

Mtakaki

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


Responder

Gostei + 0

17/11/2003

Jaguarnet7

sobe


Responder

Gostei + 0

17/11/2003

Beppe

Aqui vai em pseudo-código:

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



Responder

Gostei + 0

18/11/2003

Nildo

Pelo que entendi você quer transformar uma imagem para um tom de cinza? Usa essa função que eu criei:

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.


Responder

Gostei + 0

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

Aceitar