• Lunes 23 de Diciembre de 2024, 12:21

Autor Tema:  precesar imagen.....  (Leído 3466 veces)

Froddo

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
precesar imagen.....
« en: Jueves 4 de Diciembre de 2008, 06:51 »
0
Hola a todos, les cuento:

  He tenido varios problemas al reconocer un color,principalmente por la camara web que no era muy buena(ahora esta arreglado), el cuento es que necesito insertar una sentencia de comparación del color, osea:

if (la foto tomada tiene rojo)
sentencia a aplicar..
end

He intentado cercar el punto de interes (roi)de la foto,para comparar los bits de esta matriz, pero sin mucho éxito....,ya que muchas veces el roi no coincide con el color rojo.

Les puedo comentar que el programa reconoce el color rojo, luego de bastantes pruebas puedo decir que ese tema esatá solucionado, ya que en el camino hubo problemas de brillo en el color, iluminación etc.,para que tengan una idea si la imagen tiene color rojo en la esquina superior izquierda, la imagen mostrada por matlab después del procesamiento es rojo en la esquina izq. y negro en el resto.

Código: Text
  1.  
  2. cam=videoinput('winvideo');
  3. preview(cam);
  4. for 0:15;
  5. pause(1);
  6. foto=getsnapshot(cam);%consigue la foto de la cámara
  7. b=rgb2hsv(foto);%cambio al plano HSV
  8. H=b(:,:,1);plano Hue
  9. c = H(:,:,1)>0.92; %rango del color rojo
  10. c = uint8(c);
  11. %acontinuación ve el rojo en los tres planos
  12. red(:,:,1) = foto(:,:,1).*c;
  13. red(:,:,2) = foto(:,:,2).*c;
  14. red(:,:,3) = foto(:,:,3).*c;
  15. %luego se puede juntar el resultado y mostar solo el color %deseado con
  16. imshow(red)
  17. end
  18.  
  19.  
la imagen mostrada va ser solo el rojo, pero no se en que parte el programa reconoce el color como para decir si hay rojo haces esto..ojala que se comprenda mi problema..
Bueno,me despido y gracias de antemano..
Salu2 :beer: :kicking:
« última modificación: Lunes 22 de Diciembre de 2008, 20:55 por Froddo »

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: precesar imagen.....
« Respuesta #1 en: Jueves 4 de Diciembre de 2008, 14:12 »
0
Disculpa, no entendí muy bien cuál es tu problema.

El código que colocaste tiene un par de errores (debes haber copiado mal), lo que hace es buscar los pixeles en la imagen que en el espacio de color HSV tienen un valor de H > 0.92 y el resto de pixeles los elimina (los pone en un valor 0).

La matriz c guarda valores 0 y 1 para cada pixel de la imagen original, donde un 1 indica que el pixel que corresponde a esa posición en la imagen tiene un valor H > 0.92, por lo tanto, si deseas ejecutar una acción si encuentras pixeles con H>0.92 una alternativa es recorrer la matriz c y evaluar si los valores son 1 o 0, ahí es donde podrías ejecutar la acción que desees.
La imaginación es el límite.
Hardware & Software | Mexchip

Froddo

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re: precesar imagen.....
« Respuesta #2 en: Jueves 4 de Diciembre de 2008, 23:24 »
0
Muchas gracias por responder,
sobre el código, podrias decier donde esta el problema...,ya que no lo puedo ver, o te refieres que el código tiene errores para lograr el objetivo final???

Sobre el punto de comparación, una idea que estado inplementando es que ocupar el comando
max(max(c)), ya que con esto aprovecho el hecho de tener la matriz con 1 y ceros., osea modificar el código y tener algo asÍ:
Código: Text
  1.  
  2. cam=videoinput('winvideo');
  3.  preview(cam);
  4.  for 0:15;
  5. pause(1);
  6. foto=getsnapshot(cam);%consigue la foto de la cámara
  7.  b=rgb2hsv(foto);%cambio al plano HSV
  8.  H=b(:,:,1);plano Hue
  9.  c = H(:,:,1)>0.92; %rango del color rojo
  10.  c = uint8(c);
  11. if (max(max(c)==1);
  12. %aca pongo la sentencia que quiero..
  13. end
  14. end
  15.  
  16.  
el problema que noto es que despreocupo los otros planos(el de saturacion y brillo),por eso a veces muestra pixeles blancos...,ya que  no puedo aplicar este comando
Código: Text
  1.  
  2. c=H(:,:,1)>0.96 && H(:,:,2)>0.2 && H(:,:,2)<0.8 && H(:,:,3)>0.4 && H(:,:,3)<0.7;
  3.  
  4.  
en matlab sale el siguiente error:
??? Operands to the || and && operators must be convertible to logical scalar values.



Bueno me despido y espero que me ayuden.....
Muchas gracias de antemano...
Salu2 :kicking:  :kicking:
« última modificación: Viernes 5 de Diciembre de 2008, 08:14 por Froddo »

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: precesar imagen.....
« Respuesta #3 en: Viernes 5 de Diciembre de 2008, 07:11 »
0
El código está bien, me refería a que si copio y pego me da un error con un comentario que no tiene %, y otro con la función rgb2hsv, que me parece debieras aplicar a foto y no a la variable cam.

En el código que pusiste con &&, no puedes hacer eso, primero, los valores de HSV los debes tomar de la matriz b, resultado de la conversión rgb2hsv, no de la matriz H como pusiste.
La imaginación es el límite.
Hardware & Software | Mexchip

Froddo

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re: precesar imagen.....
« Respuesta #4 en: Viernes 5 de Diciembre de 2008, 08:30 »
0
gracias compañero nuevamente, tienes razón,he tenido un error al copiar el program, en la funcion para rgb2hsv y el comentario está arreglado(la pagina dejo el comentario en 2 lineas,ya que lo escribí sólo en una)..

Sobre tu consejo, voy a tomar los valores de la matriz b y te cuento que pasa..

Salu2 y gracias nuevamente.... :D  :D ..

Froddo

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re: precesar imagen.....
« Respuesta #5 en: Sábado 6 de Diciembre de 2008, 17:20 »
0
Hola, esperando que esten bien, les cuento :

La comparación realizada con la sentencia
Código: Text
  1.  
  2. if (max(max(c)==1);
  3.  
  4.  
Ha resultado, pero tiene que ser en condiciones óptimas o sea  que el programa no es muy robusto, ya que la mayoría de las veces reconoces pixeles que no son el color rojo.., por ejemplo, si tengo la cámara en un color negro  a veces reconoce un pixel blanco producto de la luz...,
por eso estoy intentando restringir el intervalo de los planos S y V.

Lo que tengo pensado es aplicar la siguiente linea de comando:
Código: Text
  1.  
  2. cam=videoinput('winvideo');
  3. preview(cam);
  4. for 0:15;
  5. pause(1);
  6. foto=getsnapshot(cam);%consigue la foto de la cámara
  7. b=rgb2hsv(foto);%cambio al plano HSV
  8. H=b(:,:,1)>0.92;
  9. S=b(:,:,2)>0.4 && b(:,:,2)<0.8;
  10. V=b(:,:,3)>0.4 && B(:,:,3)<0.6;
  11. c=??????
  12.  
  13.  
Mi duda es si multiplico o sumo los planos y por qué???, además de saber si tien lógica lo que he puesto...
Bueno me despido y cualquier ayuda es muy bien recibida...
Salu2 :kicking:  :kicking:

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: precesar imagen.....
« Respuesta #6 en: Sábado 6 de Diciembre de 2008, 21:06 »
0
En el código que pones, donde se cumplan las condiciones habrá 1 (unos), donde no, 0 (ceros). Me parece buena idea multiplicarlos, donde no coincidan los tres, el resultado será 0, para tener un 1 como resultado, los tres planos deben cumplir las condiciones :).

Suerte :).

Solo me estoy preguntando una cosa, bien podría hacerse lo mismo sin la conversión a HSV, usando el espacio RGB ¿no? Una opción para robustecerlo sería hacerlo en los dos espacios :).
La imaginación es el límite.
Hardware & Software | Mexchip

Froddo

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re: precesar imagen.....
« Respuesta #7 en: Lunes 8 de Diciembre de 2008, 04:42 »
0
Hola compañero, yo de nuevo :P ,te cuento:
He agragado el siguiente código:
Código: Text
  1.  
  2. cam=videoinput('winvideo');
  3.  preview(cam);
  4. for 0:15;
  5. pause(1);
  6. foto=getsnapshot(cam);%consigue la foto de la cámara
  7. b=rgb2hsv(foto);%cambio al plano HSV
  8. H=b(:,:,1)>0.92;
  9. S=b(:,:,2)>0.4 && b(:,:,2)<0.8;
  10. V=b(:,:,3)>0.4 && B(:,:,3)<0.6;
  11. c=H*S*V
  12. c = uint8(c);
  13. red(:,:,1) = foto(:,:,1).*c;
  14. red(:,:,2) = foto(:,:,2).*c;
  15. red(:,:,3) = foto(:,:,3).*c;
  16. if (max(max(red))==1);
  17. fprintf(SerPIC,'%c','A');
  18. imshow(red);
  19. end
  20. end
  21.  
  22.  

Al ejecutar el programa matlab sigue arrojando el error:
Código: Text
  1. ??? Operands to the || and && operators must be convertible to logical scalar values.
  2.  

Otra cosa, cuando no agrego los intervalos de los planos S Y V, osea solo dejo el intervalo del plano H, la sentencia if, no envia el caracter que quiero.., que puede ser???, tengo los puertos com1 abiertos y probados, pero cuando ejecuto el programa no envia el caracter y si muestra la imagen en rojo?????

Geo,sobre el por qué trabajar en el plano HSV, fue por qué supuestamente es más robusto que RGB y me daría menos problemas.. :D  :D

Salu2 y muechas gracias nuevamente por tu paciencia ;)
 :kicking:  :kicking:

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: precesar imagen.....
« Respuesta #8 en: Jueves 11 de Diciembre de 2008, 08:47 »
0
Prueba con & en lugar de &&.

Esto:
Código: Text
  1. c = H * S * V
  2.  
podrías sustituirlo por esto:
Código: Text
  1. c = H & S & V
  2.  
(debería ser el mismo resultado).

En cuanto al problema con la sentencia if, no te entendí muy bien, pero creo que puedes resolverlo por tu cuenta :). Suerte.
La imaginación es el límite.
Hardware & Software | Mexchip

Froddo

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re: precesar imagen.....
« Respuesta #9 en: Jueves 11 de Diciembre de 2008, 18:04 »
0
ok, gracias, voy a probar con tu comando, sobre la sentencia if, ya lo he solucionado, he agregado un while :D  :D

Salu2 :beer:

Froddo

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re: precesar imagen.....
« Respuesta #10 en: Sábado 13 de Diciembre de 2008, 04:58 »
0
Muchas gracias Geo, tu comando funciona de maravilla, ahora estoy probando los rangos para una óptima toma, muchas gracias por tu paciencia.. :P  :P  y cualquier cosa estoy por acá nuevamente :lol:  :lol:

Salu2 :beer:  :beer:

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: precesar imagen.....
« Respuesta #11 en: Domingo 14 de Diciembre de 2008, 19:01 »
0
Qué bien que ya casi lo tienes :).

Un solo apunte: para futuros trabajos podrías trabajar sólo con una foto, no directamente con video. De esta forma podrías manejar una imagen en donde coloques objetos de diferentes tonalidades o colores y evalúes el rendimiento, una vez que te convence el resultado trabajas con el video, sabiendo que tu algoritmo/procesamiento funciona :).

Nos vemos y te tomo la palabra, que para eso estamos aquí, para compartir :). ¡Salud! :beer:
La imaginación es el límite.
Hardware & Software | Mexchip