Ir al contenido


Foto

Definicion de colores por pixeles


  • Por favor identifícate para responder
41 respuestas en este tema

#21 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 07 marzo 2012 - 02:01

Hola
Ahora veo mas numeros, 6, los primeros me dan la impresion de que son porcentajes.
Que son los otros ?.
Saludos
  • 0

#22 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 07 marzo 2012 - 02:06

Hola
Ahora veo mas numeros, 6, los primeros me dan la impresion de que son porcentajes.
Que son los otros ?.
Saludos


El valor RGB del color que se colocó.

Saludos
  • 0

#23 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 07 marzo 2012 - 02:11

Hola
Pense lo mismo pero si pones:


delphi
  1. showMessage( format('Color RGB (%f,%f,%f)',[r1,g1,b1]) );


Sale: 85, 170, 130
Pero si pongo:


delphi
  1. showMessage( format('Color RGB (%f,%f,%f)',[r,g,b]) );


Me sale: 33, 33, 66. 67, 50, 98.
Por que la diferencia si los tres ultimos son el rgb ?.
Saludos
  • 0

#24 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 07 marzo 2012 - 02:15

El código que puse en el ejemplo calcula el porcentaje de saturación de cada color. Si lo que queremos es el porcentaje del total del color podemos hacer un pequeño cambio:



delphi
  1. procedure ColorAnalizator(Bitmap: TBitmap; var rr, gg, bb: Extended);
  2. var
  3.   l, x: integer;
  4.   P: PByte;
  5.   r, g, b, T: Extended;
  6. begin
  7.   r:=0; g:=0; b:=0;
  8.   for l := 0 to Bitmap.Height - 1 do
  9.   begin
  10.     P := Bitmap.ScanLine[l];
  11.     x:=0;
  12.     repeat
  13.       b:= b+P^; inc(P);
  14.       g:= g+P^; inc(P);
  15.       r:= r+P^; inc(P);
  16.       inc(x);
  17.     until x = Bitmap.Width;
  18.   end;
  19.   T:= r+g+b;//Bitmap.Height*Bitmap.Width*255;
  20.   if T = 0 then exit;
  21.   rr:= (r / T)*100;
  22.   gg:= (g / T)*100;
  23.   bb:= (b / T)*100;
  24. end;



Si queremos el tanto por uno, es decir que entre todos sumen uno, pues evitamos la multiplicación por 100.

Subo un programilla de ejemplo muy básico.


Saludos.
  • 0

#25 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 07 marzo 2012 - 02:25

Hola

85,170,130 es el valor RGB

33.33,  66.67,  50.98 son los porcentajes de saturación como lo indica escafandra.

Saludos
  • 0

#26 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 07 marzo 2012 - 02:27

Hola
Muy bueno amigo, excelente  (y), ahora tengo que ver como puede resolver el asunto este de los porcentajes.
Lo que me parece muy curioso es que solo sean tres colores el RGB.
En el pantone tengo muchos mas, osea, tengo muchos tintes de diferentes colores que se mezclan para crear otro.
Por que sera ?.
saludos
PD: Gracias Eliseo por la aclaración me sirve mucho. (y)
  • 0

#27 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 07 marzo 2012 - 02:36

Hola
Muy bueno amigo, excelente  (y), ahora tengo que ver como puede resolver el asunto este de los porcentajes.
Lo que me parece muy curioso es que solo sean tres colores el RGB.
En el pantone tengo muchos mas, osea, tengo muchos tintes de diferentes colores que se mezclan para crear otro.
Por que sera ?.
saludos
PD: Gracias Eliseo por la aclaración me sirve mucho. (y)


Si te fijas, las impresoras de color sólo tienen 3 colores básicos con los que se crean todos los colores, si no me equivoco son Cyan, Magenta y Amarillo.

Es el mismo concepto de RGB, tres colores base con los que se juega para crear toda la gama de colores.

Saludos
  • 0

#28 Héctor Randolph

Héctor Randolph

    501st Legion

  • Moderadores
  • PipPipPip
  • 664 mensajes
  • LocationMéxico

Escrito 07 marzo 2012 - 02:49

Amigo Carlos

No creo que una función te pueda convertir DIRECTAMENTE entre RGB  y Pantone.

Con el sistema RGB a 24bits tienes tres vectores con 256 tonos posibles cada uno, es decir, 256*256*256=256^3 colores posibles, son mas de 16 millones de combinaciones las que puedes formar,  más combinaciones de las que el ojo humano puede distinguir.

El sistema pantone no tiene tantos tonos, son muy pocos, tanto así que hasta les han puesto nombre a cada uno.
Es decir son un pequeño subconjunto de los tonos que hay en RGB de 24bits.

Esto implica que puedes convertir de pantone a RGB pero en sentido inverso no (no hay biyección). No puedes encontrar un código pantone para cada color de RGB.

Si deseas una función que te de una equivalencia, la estrategia sería tener un listado de cada tono disponible en pantone ( no de todos los que existen, me refiero a los que tengas a mano) y para cualquier color dado en RGB encontrar el "MÁS  CERCANO" a pantone o haciendo una combinación con varios tonos pantone.

O sea que sería una aproximación por convención o el que tu consideres que más se le acerca.

Saludos

  • 0

#29 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 07 marzo 2012 - 02:54

Si te fijas, las impresoras de color sólo tienen 3 colores básicos con los que se crean todos los colores, si no me equivoco son Cyan, Magenta y Amarillo.


Ese detalle es importante. No es lo mismo el color conseguido con luz emitida que con luz reflejada de un tinte. Caral, deberás experimentar con tus mezclas y posiblemente encontrar una correlación entre los datos obtenidos de la foto (rgb) y los tintes que se precisen.

Existe otro pequeño detalle y es la fidelidad de color de la maquina de fotos utilizada, pues no todas son iguales y algunas ponderan mas un color para enfatizar las fotos. Con las películas de celuloide pasaba lo mismo.


Saludos.
  • 0

#30 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 07 marzo 2012 - 02:59

Hola
Gracias amigos, la verdad es que este tema esta muy interesante.
Me han servido de muchísimo vuestros ejemplos y comentarios.
Todavía tengo que masticar mucho pero creo que llegare a entender el concepto.
Muchas gracias.
Este aparato hace algo similar a lo que quiero hacer, toma una imagen del color y lo traduce para buscarlo en el pantone o hacerlo si no esta en la lista.
Si tenéis mas comentarios o ejemplos no dudad en ponerlos, todo me sirve.
Saludos
  • 0

#31 Héctor Randolph

Héctor Randolph

    501st Legion

  • Moderadores
  • PipPipPip
  • 664 mensajes
  • LocationMéxico

Escrito 07 marzo 2012 - 03:01

Lo que dice escafandra es verdad, en las computadoras el color depende del dispositivo, cada monitor dará un tono diferente, incluso el mismo monitor cambia si lo personalizas en cuanto a contraste y brillo. Cada cámara fotográfica y escáner te dará un tono diferente dependiendo de su resolución y del algoritmo que utilice para interpretar los colores.

En cambio el catálogo pantone es un intento por estandarizar los tonos empleados en la industria gráfica, es llamado color directo pero también es relativo y tiene más aplicación cuando se habla de tintes.




  • 0

#32 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 07 marzo 2012 - 03:54

Hola
Gracias amigo Hector.
Estoy valorando todo, es un tema que no conozco y me interesa meterme.
Saludos
  • 0

#33 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 07 marzo 2012 - 05:27

Llego tarde, pero solo quería comentar que como dice escafandra no se utilizan los mismos colores para representar una imagen en pantalla que para una imagen impresa. Por ejemplo si mezclas rojo y verde obtienes en pantalla el amarillo, pero utilizando pintura es imposible.

Por eso las impresoras utilizan en vez de RGB los colores CMYK (Cian, Magenta, Amarillo, Negro). Encontraras muchos ejemplos de como convertir un color RGB a su correspondiente valor CMYK, por ejemplo este de Zarko Gajic:
http://delphi.about....qt/rgb_cmyk.htm

Y por cierto, si quieres jugar con colores, tono, detectar bordes, difuminar, etc ... puedes echarle un vistazo a este ejemplo que deje en mi web
http://delphi.jmrds.com/?q=node/23

El enlace de descarga directa es: http://delphi.jmrds....ros_ejemplo.zip

  • 0

#34 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 07 marzo 2012 - 06:14

Hola
Muchas gracias amigo.
Voy a probar el ejemplo de tu web y ver que saco de todo esto.
El ejemplo de Zarko Gajic es muy interesante, pero no se si sabre como aplicarlo para lo que necesito en cuanto a saber los porcentajes de cada tinte para crear un color, algo así como los ejemplos que me habéis dado hasta ahora de RGB.
Si podéis ayudarme a entender esto de los colores CMYK seria muy bueno ya que creo que el asunto de la mezcla de tintas debe ir por ese lado.
No he terminado todavía de entender todo esto. :
Muchas gracias a todos por vuestro tiempo.
Saludos

  • 0

#35 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 07 marzo 2012 - 06:21

Hola
Ya probé el programa amigo Seoane, que decir, bueno, lo de siempre, impresionante el manejo de esto. (y)
No es lo que busco, pero te aseguro que ya lo tengo a buen recaudo. (y)
Gracias.
Saludos
  • 0

#36 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 07 marzo 2012 - 06:29

Hola
Estaba probando el ejemplo de Zarko Gajic y me sale de primera un error:
[Error] Unit1.pas(28): Undeclared identifier: 'TRGBColor'
[Error] Unit1.pas(28): Undeclared identifier: 'TCMYKColor'
[Error] Unit1.pas(32): Undeclared identifier: 'Cyan'
[Error] Unit1.pas(33): Undeclared identifier: 'Magenta'

Tengo en el uses el Math, pero me da esos errores.
Como puedo solucionarlo para poder ver el ejemplo ?.
Saludos
  • 0

#37 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 08 marzo 2012 - 04:24

Vamos a adaptar el código para la nueva situación respetando el código de Zarko Gajic.

La función ColorAnalizator3 devolverá un valor RGB medio de la imagen analizada, no porcentajes. La media la va a llevar línea a línea para evitar valores de suma muy altos que se podrían dar en imágenes muy grandes.

Definimos las estructuras necesarias y usamos la función de Zarko Gajic para encontrar el valor CMYK:


delphi
  1. uses Math;
  2.  
  3. type
  4. TCMYKColor = packed record
  5.   Cyan:    BYTE;
  6.   Magenta:  BYTE;
  7.   Yellow:  BYTE;
  8.   KeyPlate: BYTE;
  9. end;
  10.  
  11. TRGBColor = packed record
  12.   Red:  BYTE;
  13.   Green: BYTE;
  14.   Blue:  BYTE;
  15. end;
  16.  
  17.  
  18. function RGBtoCMYK(rgbColor: TRGBColor) : TCMYKColor;
  19. begin
  20.   with Result do
  21.   begin
  22.     Cyan := 1 - rgbColor.Red;
  23.     Magenta := 1 - rgbColor.Green;
  24.     Yellow := 1 - rgbColor.Blue;
  25.     KeyPlate := Min(Min(Cyan, Magenta), Yellow) ;
  26.     Cyan := Cyan - KeyPlate;
  27.     Magenta := Magenta - KeyPlate;
  28.     Yellow := Yellow - KeyPlate;
  29.   end;
  30. end;
  31.  
  32. function ColorAnalizator3(Bitmap: TBitmap): TRGBColor;
  33. var
  34.   l, x: integer;
  35.   P: PByte;
  36.   r,g,b: integer;
  37. begin
  38.   With Result do
  39.   begin
  40.     for l := 0 to Bitmap.Height - 1 do
  41.     begin
  42.       r:=0; g:= 0; b:= 0;
  43.       P := Bitmap.ScanLine[l];
  44.       x:=0;
  45.       repeat
  46.         inc(b, P^); inc(P);
  47.         inc(g, P^); inc(P);
  48.         inc(r, P^); inc(P);
  49.         inc(x);
  50.       until x = Bitmap.Width;
  51.       Red:= Red + ((r div x)-Red) div (l+1);
  52.       Green:= Green + ((g div x)-Green) div (l+1);
  53.       Blue:= Blue + ((b div x)-Blue) div (l+1);
  54.     end;
  55.   end;
  56. end;



Ejemplo de uso:


delphi
  1. var
  2.   RGB: TRGBColor;
  3.   CMYK: TCMYKColor;
  4. begin
  5.   RGB:= ColorAnalizator3(Image1.Picture.Bitmap);
  6.   CMYK:= RGBtoCMYK(RGB);
  7. end;



Espero que esto te ayude un poco mas.


Saludos.
  • 0

#38 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 08 marzo 2012 - 05:52

Hola
Gracias amigo.
Como lo puedo ver el dato en un label u otro ?.
Disculpa pero es que esto de los bytes no lo manejo para nada.
Saludos
  • 0

#39 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 08 marzo 2012 - 06:02

Creo que de esta manera lo vas a entender:


delphi
  1. var
  2.   RGB: TRGBColor;
  3.   CMYK: TCMYKColor;
  4. begin
  5.   RGB:= ColorAnalizator3(Image4.Picture.Bitmap);
  6.   CMYK:= RGBtoCMYK(RGB);
  7.  
  8.   Label1.Caption:= 'Cian: ' + IntToStr(CMYK.Cyan);
  9.   Label2.Caption:= 'Magenta: '+ IntToStr(CMYK.Magenta);
  10.   Label3.Caption:= 'Yellow: ' + IntToStr(CMYK.Yellow);
  11.   Label4.Caption:= 'KeyPlate: ' + IntToStr(CMYK.KeyPlate);
  12. end;




Saludos.
  • 0

#40 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 08 marzo 2012 - 07:43

Hola
Gracias amigo.
Osea: Los datos Byte son Float ?, o por lo menos asi lo entiendo.
Si es asi entonces se podría hacer lo mismo con los RGB ?.
Saludos
  • 0




IP.Board spam blocked by CleanTalk.