Programación Específica > Matlab
Imágen Matlab
Quicksilver:
Cofrades, como siempre, tratando de llegar aca con buenas dudas, hoy traigo una buena, jejeje. :hola:
Hace rato programando, traté de reconocer colores con una cámara web, sin exito, pues por ahora, no tengo la menor idea de como reconocer determinado color (por ejemplo, el rojo, o el amarillo). :unsure:
Siendo mas breve, quisiera preguntarles, como de una imágen, en RGB, una imágen proveniente de una web cam, puedo reconocer un canal o un color en especifico, en este caso, el amarillo, espero pues que alguna de vuestras mentes tenga la respuesta.
Muchisimas gracias de antemano, un saludo a todos.
allisap:
esto es un poco mas complicado de lo que a simple vista aparenta...
mira .. una imagen en RGB es una matriz de M*N *3 ,largo , ancho y los tres planos de color: rojo, verde y azul ...asi que si quisieras detectar algo en rojo por ejemplo podrias analizar su valor RGB y te daras cuenta que el canal en rojo es alto, cercano a 255( ques es lo maximo que puedes tener si manejas color de 8 bits) pero te daras cuenta que aun tengas ciertos valores de verde y de azul, cercanos 0...dependiendo de que tan puro sea su tono de rojo (lo cual no es posible con una camara web) asi que tendrias que aplicar algunas tecnicas de umbral para limpiar tu imagen (es decir, hacer un preprocesamiento de la imagen capturada ), para una imagen en amarillo es mas complicado porque el amarillo es la suma del rojo y del verde, esto es un pixel amarillo tiene altos valores de rojo y de verde y pocos de azul...
ademas todo esto tambien se ve afectado por la iluminacion y la calidad de la camara web
mi consejo...
empieza haciendo un filtrado de tu imagen y luego aplicale un umbral para ver que tan bien se ajusta y como responde tu camara web
suerte
Geo:
En primer lugar, debes saber cómo se representan los colores, qué son los pixeles y cómo están constituídos (allisap lo menciona). (En Matlab, una imagen es una matriz, si es a color, son tres matrices, una por cada componente: rojo, verde y azul).
Para detectar un color, si es muy específico, podrías examinar los pixeles e ir marcando aquellos que coincidan con los valores numéricos del color que buscas, el problema es que esto es altamente selectivo y probablemente no "detectes" pixeles de color semejante pero que por su valor numérico no coinciden con el que buscas, de allí que umbralizar sea una buena alternativa.
Por poner un ejemplo, si buscaras un color rojo puro, buscarías todos los pixeles que en la imagen tengan valores de 255, 0 y 0 para sus tres componentes: rojo, verde y azul, respectivamente.
Quicksilver:
Cofrades, camaradas, he logrado hacer el reconocimiento de color... os pondré elcódigo mas abajo, y lo explicaré un poco, espero pues que les sirva.
--- Código: Text --- canalvideo=videoinput('winvideo',1);preview(canalvideo);frame=getsnapshot(canalvideo);%image(frame);delete(canalvideo); prompt = {'Nombre:'};title = 'ANALISIS CORNEAL';lines = 1;def = {'mi imagen'};answer = inputdlg(prompt,title,lines,def);assignin('base','imfile',answer{1}); imwrite(frame,strcat(answer{1},'.jpg')); % guarda la imagen , se usa strcat %porque se van a introducir muchas imagenes, concatena el nombre con la%extension (primera vez) % %T=dir('*.jpg');% a=imread(T.name); otra OPCIONNNNNNNNNN %a=imread(strcat(answer{1},'.jpg')); % lee % planeR=a( :, :,1);% reconoce la intensidad del color rojo en la imagen% planeG=a( :, :,2);% reconoce la intensidad del color verde en la imagen% planeB=a( :, :,3);% reconoce la intensidad del color azul en la imagen% % imwrite(planeR,'plano1.jpg');% imwrite(planeG,'plano2.jpg'); % EL COLOR AMARILLO SE OBTIENE ENTRE EL PLANO ROJO Y EL PLANO VERDE,QUE% CORRESPONDEN AL PLANO1 Y AL PLANO2, POR ESTO DEBEMOS HACER EL PLANO 3% OSEA EL AZUL EN NEGRO %a(:,:,3)=0;% el plano tres azul lo vuelva negro (hace cambio)}%imwrite(a,strcat(answer{1},'.jpg')):con esto nos imprime amarillo rgb b=rgb2hsv(frame);%pase a HSV frameH=b(:,:,1);%en c guaradmos el plano hamarillo = 0.12;precision = 0.1;c = H(:,:,1)>(amarillo-precision) & H(:,:,1)<(amarillo+precision);c = uint8(c); imgAmarillos(:,:,1) = frame(:,:,1).*c;imgAmarillos(:,:,2) = frame(:,:,2).*c;imgAmarillos(:,:,3) = frame(:,:,3).*c; %b(:,:,2)=0;%el plano H lo volvemos cero%b(:,:,3)=0; %if (c>=0.2) & (c<=0.3) %la intensidad %imwrite(c,strcat(answer{1},'1','.jpg'))%guarda plano h en el intervalo de intensidad %end imwrite(imgAmarillos,strcat(answer{1},'1','.jpg')) %imwrite(frame,strcat(answer{1},'.jpg'))%guarda el nuevo cambio figure; % la pantalla con las imagenessubplot(2,2,1);% que lleve una imagen a la primera posicion imshow(frame);% mostrar la primera foto en esa primera posicionsubplot(2,2,2);%que lleve una imagen a la segunda posicionimshow(imgAmarillos);%mostrar la imagen amarilla en la segunda posicion %imwrite(planeB,'plano3.jpg'); beep;
No lo he hecho como algunos me sugirieron, pero he logrado un muy buen resultado y tampoco lo he hecho en el plano RGB, pues en este plano, tengo un rango mucho mas grande del color amarillo, lo he logrado en el plano HSV, especificamente en el plano H, espero pues que analicen el código, cualquier duda, será bienvenida, y cualquier sugerencia también.
jonathan2908:
Hola
Al estar revisando el foro veo que me podrias dar una mano, mira me encargaron hcer el recocimiento de los faros de un auto si estos se encuentran encedidos.
y al leer este post creo me podrian orientar por aca tambien. el programa no es muy elavorado las fotos son de autos y estos siempre esan en una pista a la misma altura, bien con los faros encendidos o bien con los faros apagados. mi idea seria algo asi.
1.-Cargar la imagen
2.-aplicar una mascara a mi
3.-Convertirla a escala de grises.
4.-Realizar el histograma de la imagen, dependiendo si hay una cierto valor de blanco dar una respuesta afirmativa.
Ahora con respecto al codigo estoy un poco perdido.
Navegación
[#] Página Siguiente
Ir a la versión completa