• Martes 16 de Abril de 2024, 14:34

Autor Tema:  COLOR DE UNA IMAGEN  (Leído 4520 veces)

GAGE

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
COLOR DE UNA IMAGEN
« en: Viernes 17 de Julio de 2009, 20:03 »
0
Hola a todos!! soy nuevo en el foro.

Necesito saber como sacar el color promedio de una imagen.
Mi poryecto consiste en visualizar en un picturebox la imagen de una camaraeweb, y ante cierto evento, saco una foto que la coloco en otro picturebox.
Hasta ahora todo bien. La imagen que coloco en el segundo picturebox, la idea es que sea un tablero de 8x8 o 64 cuadros blancos y negro que representan una clave, y lo que pretendo es decifarla, es decir un cuadro blanco un 0 y uno negro  un 1, y asi todos los cuadros hasta formar la clave que la utilizo para otra cosa.
Mi idea es que atraves de una propiedades del picturebox tomar muestras que representen a uno de los 64 cuadros y lo coloco en un tercer picture box. Hasta aqui tampoco tengo drama.
Mi problema es que no se como hacer para calcular si es blanco o negro, ya que la camaraweb no saca todo negro o blanco, siempre hay otro tipo de color claro u oscuro presente, entonces pense en sacar el color promedio y si es "oscuro" es negro y si es claro es blanco.
El sistema que quiero utilizra es el RGB.
RGB(255,255,255)=blanco =255*3
RGB(0,0,0)=negro =0
tomo como media RGB(127,127,127)

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: COLOR DE UNA IMAGEN
« Respuesta #1 en: Viernes 17 de Julio de 2009, 20:14 »
0
Ya que quieres usarlo para proveer una contraseña la exactitud del caso no tiene relevancia.
Código: Visual Basic
  1. public const Negro=0
  2. public const Blanco= (256^3) -1
  3. public const PuntoMedio= blanco 2
  4.  
  5.  
  6. private function DeterminarColor(byval Color as long) as long
  7.      DeterminarColor= iif( color<= puntomedio,negro,blanco)
  8. end function
  9.  

El sistema no es definitivo, pués es una reducción, pero para lo que quieres es suficiente así...
Todavía podrías decidir blanco si es impar y negro si es par.

Código: Visual Basic
  1.  
  2. private function DeterminarColor(byval Color as long) as long
  3.      DeterminarColor= iif( (color mod 2)=0,negro,blanco)
  4. end function
  5.  
«Ma non troppo»
----> ModoVacaciones = False<----

GAGE

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: COLOR DE UNA IMAGEN
« Respuesta #2 en: Viernes 17 de Julio de 2009, 20:38 »
0
de diez, solo que no se como hacer para utilizar la fucnion  RGB, es decir, tengo la imagen en el picturebox pero no tengo ni idea como hacer para leer un tipo de dato RGB, analizar toda la imagen y luego sacar el color promedio, es decir es como si tuviera un archivo pero no se como leerlo, lo abri pero no se como accederlo, no se si me explico.
Lo que vos me pones seria si yo pudiera idear una funcion que recorra la imagen byte por byte y realizar ese trabajo, el tema es que no se commo hacer leer la imagen y determinar cada pixel en el formato bmp RGB24.
Me podrias indicar algo asi, no se si es muy complicado porque deconozco totalmente el tema de tratamiento de imagenes. Gracias igual

GAGE

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: COLOR DE UNA IMAGEN
« Respuesta #3 en: Sábado 18 de Julio de 2009, 14:10 »
0
vamos muchachos me pueden dar una mano...

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: COLOR DE UNA IMAGEN
« Respuesta #4 en: Martes 21 de Julio de 2009, 08:55 »
0
Cita de: "GAGE"
de diez, solo que no se como hacer para utilizar la fucnion  RGB, es decir, tengo la imagen en el picturebox pero no tengo ni idea como hacer para leer un tipo de dato RGB, analizar toda la imagen y luego sacar el color promedio, es decir es como si tuviera un archivo pero no se como leerlo, lo abri pero no se como accederlo, no se si me explico.
Lo que vos me pones seria si yo pudiera idear una funcion que recorra la imagen byte por byte y realizar ese trabajo, el tema es que no se commo hacer leer la imagen y determinar cada pixel en el formato bmp RGB24.
Me podrias indicar algo asi, no se si es muy complicado porque deconozco totalmente el tema de tratamiento de imagenes. Gracias igual

No entiendo que quieres decir con eso de que n0 sabes como utilizar la función RGB... Como no lo entiendo 'hablo' y espero que con ello captes las dudas que tengas al respecto.

Los colores van desde el 0 hasta el 16777215 o lo que es lo mismo se usan 256 intensidades para cada uno de los 3 colores base Rojo, Verde y Azul. Veamos si tenemos 3 colores base y 256 tonalidades por cada uno color máximo 256^3, una forma de expresar esto mismo sería decirlo todo en una sola cifra o expresarlo con sus componentes, así para el negro será rojo=0 Verde=0 Azul=0.
Ahora avanzando hasta el color 250, será Rojo=250 V=0, A=0 qué pasa cuando sobrepaso al valor 280, 280-256= 24 280/256=1'algo entonces Rojo=24, V01,A=0
Si te fijas bien matemáticamente estamos usando una base decimal cuyo valor es 256, la base decimal se basa en valores de 10 con un rango del 0-9,
El primer dígito expresa unidades, el 2º decenas y el tercero centenas, si cambiamos a la base 256, es exactamente igual: unidades= rojo, decenas= verde, centenas=azul

imagina, que los colores fueran en decimal 3 colores, pero sólo con 10 tonos, entonces los números irían desde el 0 al 999, como en este caso cada color se expresa con una cifra posicional sería muy fácil descubrir sus componentes: si dijéramos color 628, sabríamos que tendría 6 de azul, 2 de verde y 8 de rojo, esto lo hemos calculado así:
rojoAb= (10^0) * 8= 1* rojo
verdeAb= (10^1) * 2 = 10 * verde
AzulAb= (10^2) * 6 = 100 * azul
Ab sería indicador de absoluto...
Color= azulAb + verdeAb + rojoAb  = 600 + 20 + 8
Bueno esto mismo hacemos con los colores en base 256
vamos a suponer que tenemos 230 de rojo, intensidad de verde= 42, intensidad de azul= 100
IntensidadAbsolutaDelColor= (base^(orden-1)) * intensidad

RojoAb= (256 ^0) * rojo= 1* 230 = 230
VerdeAb=(256^1) * verde = 256 * 42 = 10752
AzulAb= (256^2) * azul= 65536 * 100 = 6553600

Color= azulAb + verdeAb + rojoAb  = 6553600 +  10752 + 230 = 6564582

Si hiceramos una funcion equivalente a la RGB sería así:

Código: Visual Basic
  1. ' para componer un color (long) desde sus componentes
  2. Public Function MiRGB(byval Rojo as byte,byval Verde as byte, byval Azul as byte) as long
  3.       mirgb= (rojo + (verde * 256) + (azul *65536))
  4. end function
  5.  
  6. ' para extraer los componentes de un color:
  7. public type RVA ' iniciales de: Rojo Verde, Azul, que es lo mismo que RGB pero en español
  8.    Rojo as byte
  9.    Verde as byte
  10.    Azul as byte
  11. end type
  12.  
  13. friend function LongaRGB(byval Color as long) as ColRGB
  14.       colrgb.Rojo = color mod 256  ' imagina en decimal 628, cuantas unidades tenemos? hacemos un mod de 2 cifras es decir 628 mod 100=8
  15.      colrgb.Azul= color  65536  ' imagina en decimal 628 cuantas centenas tenemos, dividimos (entera) entre 100; 628 100= 6 . Es una división entera, byte y long también son enteros...
  16.      colrgb.Verde = (color 256) mod 256 ' imagina como aíslo las decenas en base decimal ?: hay 2 formas según el orden, deshacerse de las unidades, deshacerse de las centenas: 628 10= 62, ahora tomo las unidades que antes eran las centenas 62 mod 10 = 2
  17. end function
  18.  
  19.  

No sé si necesitas más aclaraciones sobre la función RGB... yo te acabo de explicar el 'padrenuestro' de los colores, cuando algo te resulte complejo en base 256 piénsalo en decimal y luego cambia el valor de las bases  
base^0=1, base^1=base , base^2= base*base
en decimal (base 10): 10^0=1; 10^1=10; 10^2=100
en base 256: 256^0=1; 256^1=256; 256^2=65536
____________________________

La siguiente cuestión que creo entender, como tomar colores del picture y ponerlos..
Los formularios y picture tiene 2 funciones para ese cometido : point, interroga por el color en unas cordenadas que se deben especificar, y pSet (pointSet) especifica que el color debe asignarse a unas cordenadas determinadas

Código: Visual Basic
  1. dim color as long
  2.  
  3. ' tomar un color
  4. color= picture1.point(200,180) ' esto es: color= color del picturebox en las cordenadas 200,180
  5.  
  6. ' poner un color
  7. picture1.pset(200,180)= color  ' valor que tiene esta variable
  8. picture1.pset(200,180)= 1234567  ' valor inmediato
  9. picture1.pset(200,180)= RGB(230,42,100) ' le pasa el valor que se calcula
  10.  
  11. dim Rojo as byte, Verde as byte, Azul as byte
  12. Rojo=230, Verde=40, Azul=110
  13. picture1.pset(200,180)= RGB(Rojo ,Verde +2 ,Azul -10)
  14.  

Estas funciones son lentas, si se va a hacer un uso intensivo para tomar o asignar colores, es mejor usar las API SetPixel y GetPixel...

Para analizar toda la imagen tienes que barrer sus cordenadas, como las cordenadas son una malla, una cuadrícula, necesitas 2 bucles anidados entre sí

Código: Text
  1. recorrer verticales a lo alto desde 0 hasta el alto de la imagen (o del picturebox, según el tipo de ajuste de la imagen)
  2.     recorrer horizontales a lo ancho desde 0 hasta el ancho de la imagen (o del picturebox, según el tipo de ajuste de la imagen)
  3.           tomarcolor del punto en horizontales, verticales
  4.           total= total + valordelpuntoactual  ' como esto suma y suma, total deberás declararlo como double si no quieres tener desbordamiento
  5.     fin recorrer horizontal
  6. fin recorrer vertical
  7. ' ojo, entiendo que quieres buscar el promedio de toda la imagen
  8. promedio= total  (horizontales* verticales)  
  9.  
     

Todo esto se puede acelerar mucho, pero conociendo a fondo las API para trabajar directamente con las imágenes, pero como estás muy verde y qque para ti lo importante es aprender VB (cupongo) y no tanto resolver el problema, creo que esto debería serte más que suficiente....
 
Practica para obtener colores de una imagen y modificarlos con point y pset, por ejemplo usando point lee un picturebox y con pset escribe en otro picturebox. Importante: Al trabajar con imágenes acuérdate de poner scalemode=vbpixels (3) para los picturebox .....
cuando domines y entiendas los colores y la función RGB, etc, podrás hacer cualquier cosa, como intercambiar los verdes por los rojos (intercambiar canales), variar luminosidad, umbralizar, etc....

nota: cuando en alguna parte pongo 'tono' referido a un color base en realidad debería poner intensidad referido a ese color, ya que tono en realidad siempre se aplica a un color compuesto por los 3 base... es un pequeño vicio que cualquiera podría entender, pero que a un neófito o novato puede confundir...
«Ma non troppo»
----> ModoVacaciones = False<----

GAGE

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: COLOR DE UNA IMAGEN
« Respuesta #5 en: Martes 21 de Julio de 2009, 14:56 »
0
Gracias por el  detalle de tu respuesta, ahora entiendo bien el tema de porque utiliza un tipo de dato long para rerpresentar las 3 componentes.
Voy a poner en practica tu explicacion y ver que resultados tengo.
Gracias de nuevo.