Programación General > Visual Basic para principiantes
COLOR DE UNA IMAGEN
GAGE:
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:
Ya que quieres usarlo para proveer una contraseña la exactitud del caso no tiene relevancia.
--- Código: Visual Basic ---public const Negro=0public const Blanco= (256^3) -1public const PuntoMedio= blanco 2 private function DeterminarColor(byval Color as long) as long DeterminarColor= iif( color<= puntomedio,negro,blanco)end function
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 --- private function DeterminarColor(byval Color as long) as long DeterminarColor= iif( (color mod 2)=0,negro,blanco)end function
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
GAGE:
vamos muchachos me pueden dar una mano...
Nebire:
--- 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
--- Fin de la cita ---
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 ---' para componer un color (long) desde sus componentesPublic Function MiRGB(byval Rojo as byte,byval Verde as byte, byval Azul as byte) as long mirgb= (rojo + (verde * 256) + (azul *65536))end function ' para extraer los componentes de un color:public type RVA ' iniciales de: Rojo Verde, Azul, que es lo mismo que RGB pero en español Rojo as byte Verde as byte Azul as byte end type friend function LongaRGB(byval Color as long) as ColRGB colrgb.Rojo = color mod 256 ' imagina en decimal 628, cuantas unidades tenemos? hacemos un mod de 2 cifras es decir 628 mod 100=8 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... 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 = 2end function
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 ---dim color as long ' tomar un colorcolor= picture1.point(200,180) ' esto es: color= color del picturebox en las cordenadas 200,180 ' poner un colorpicture1.pset(200,180)= color ' valor que tiene esta variablepicture1.pset(200,180)= 1234567 ' valor inmediatopicture1.pset(200,180)= RGB(230,42,100) ' le pasa el valor que se calcula dim Rojo as byte, Verde as byte, Azul as byteRojo=230, Verde=40, Azul=110picture1.pset(200,180)= RGB(Rojo ,Verde +2 ,Azul -10)
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 ---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) 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) tomarcolor del punto en horizontales, verticales total= total + valordelpuntoactual ' como esto suma y suma, total deberás declararlo como double si no quieres tener desbordamiento fin recorrer horizontalfin recorrer vertical' ojo, entiendo que quieres buscar el promedio de toda la imagenpromedio= total (horizontales* verticales)
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...
Navegación
[#] Página Siguiente
Ir a la versión completa