Sunteți pe pagina 1din 12

ANALISIS DE IMAGENES Introduccin: El anlisis de imgenes abarca una gran rea del conocimiento y su correcto manejo hace que

diversos problemas puedan solucionarse aplicando diversos algoritmos por medio de software para deteccin de contornos, medicin de longitud y profundidad, suavizado, binarizado, entre otros. Tratamos de mostrar la utilizacin y resultados de la deteccin de contornos utilizando imgenes obtenidas a travs de video, mathlab como herramienta de software utilizando los mtodos ms comunes para la deteccin de contornos Sobel, Roberts, Prewitt entre otros. Los resultados que se obtengan de la aplicacin de estas diversas tcnicas nos guiaran con resultados objetivos a tomar la mejor decisin al momento de aplicar las diversas tcnicas de detecion de bordes al problema especfico que se nos presente. Objetivo: El presente trabajo pretende presentar la implementacin calcular el contorno del arco elctrico presentado en el video ElectricArcE.WMV. Primero hay que convertir el video en una secuencia de imgenes, ya existe software libre para ello, y aplicar deteccin de contornos por los siguientes mtodos: 1. Roberts. 2. Prewitt. 3. Sobel. 4. Isotropic Gradient. 5. Cubic Spline Gradient. Desarrollo: El video del arco elctrico presenta una complejidad extra ya que no solo estamos analizando una imagen sino estamos extrayendo informacin de una serie de imgenes en secuencia con un tiempo determinado lo cual agrega la variable tiempo en el anlisis de las imgenes. El video en cuestin es el proporcionado bajo el nombre de ElectricArcE en formato WMV de 4.7 segundos en el cual se muestra un efecto corona en lo que pareciera ser lneas de alta tensin. Basados en este video se procedi a convertir el video Windows media video (*.WMV) en una secuencia de imgenes del tipo *.jpg. Para realizar esta tarea existe gran variedad de software de tipo libre y de paga utilizado para la edicin de cuadros (frames), insertar secuencias y convertir frames en secuencia y al encontrarme buscando informacin al respecto se encontr que existen herramientas de matlab simulink para el manejo de imgenes de video siendo ms especficos para el manejo de archivos multimedia como se muestra a continuacin.

Dentro de simulink buscamos el bloque para asignar el source del video que queremos convertir en frames dentro de signal procesing blockset\signal processing subset encontramos al bloque from multimedia file este bloque de procesamiento de seales es el encargado de leer frames de video o audio de un archivo para importarlos a simulik pudiendo correr en tiempo real. Este bloque procesa las imgenes o frames de audio y video en matrices tipo [m n] o [m n p] donde p es el numero de planos de color o tambin como matriz RGB o como un vector de audio. Dentro de este bloque se configura la ruta de donde obtendremos el archivo que se desea convertir en este caso ElectricArcE.wmv y si se quiere heredar el tiempo de muestreo del archivo original cosa que en nuestro caso es as. Si se desea mayor o menor tiempo de muestreo no se selecciona esta opcin. A su salida se selecciona un indicador que nos informa si ha concluido el video denominado Output end-of-file indicator (EOF) y por ltimo la salida si deseamos una salida como RGB o como fotogramas de intensidad. Este bloque requiere de un bloque adicional para funcionar denominado video and image procesing blockset este bloque escribe un valor a la imagen entero, flotante, doble, etc. As como su ubicacin color, opacidad. En este caso de desea incrementar el nmero de frame`s para guardarlo independientemente y no sobrescribirlo a este bloque le entra entonces el frame y un contador que lleva la cuenta del numero de frame en el que vamos. Y por ltimo se escoge donde se va a guardar el archivo que contiene al frame con su respectivo numero en este bloque o ndice. se selecciona la ruta y el formato a ser guardado: jpg o bmp entre otros. Este frame es una funcin creada en matlab que se muestra a continuacin: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function imageToFile(image, index) % Allow ourselves to use functions that are not % supported by code generation. eml.extrinsic('fprintf', 'imwrite', 'gcb', ... 'slresolve', 'sprintf'); % Determine the name of the file filename = slresolve('filename', gcb); fullFilename = sprintf(filename, index); fprintf('%s\n', fullFilename); % Write the image. imwrite(image, fullFilename);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 1.- Se declaran funciones extrinsecas para posterior ejecucion en la funcion. 2.-Se asigna el nombre del archivo file al path get path name of current block (GBC) Se salva en la ultima ruta o path que tiene abierto mathlab. 3.- Sscribe el numero de imagen index en la string filename. 4.- Imprime el nombre en una string. 5.-Imprime la imagen en el nombre anteriormente creado. El programa en simulink queda de la siguiente forma: Hecho esto se tiene una serie de imgenes que se guardaron segn la secuencia de video a 5 frames por segundo dando un total de 1237 imgenes de 640x480 pixeles con formato .jpg Izquierda.- Imagen obtenida con software A4video que embebe una imagen que imposibilita la correcta visualizacin de la imagen original. Derecha.- imagen obtenida con matlab con el nmero de frame sobrepuesto en esquina superior izquierda. De estos frames se requiere obtener: 1.-El gradiente de Roberts. Existe una funcin ya implementada en matlab para obtener el resultado casi directamente de la imagen original. Para lo que primeramente se carga la imagen obtenida anteriormente. ImOriginal = imread('ElectricARC_04.jpg'); Convertimos la imagen en una escala de gris: ImGris = rgb2gray(ImOriginal); % Se convierte la imagen de RGB a escala de grises con el comando RGB2GRAY Se filtra la imagen para eliminacin de ruido: Filtro=fspecial('gaussian',8,4); %se aplican filtro 2d predefinido gausiano pasa bajas tamao de h y sigma para suavizar ImFiltrada = imfilter(ImGris,Filtro); %h puede ser un vector que especifica la cantidad de columnas o filas Y aplicamos Roberts para extraer contornos: ImBorde = edge(ImGris,'roberts'); %para extraer los bordes de la imagen se utiliza algn algoritmo Roberts, canny o sobel Seleccionamos humbral: ImUmbral=ImGris>=220; %si se desea una imagen solo con 1 y 0 se utiliza el umbral que define uno (binarizado) Segmentamos: ImSeg=bwselect(8); %con esta opcin podemos seleccionar la parte que queremos que matlab nos separe despus del umbral seleccionada con el ratn (clic derecho, clic

izquierdo) Obteniendo: Donde se observa exclusivamente el haz del efecto corona. Deteccin de bordes. En una imagen, un borde es un cambio significativo en el nivel de intensidad entre dos o ms pxeles adyacentes. Estos cambios estn asociados a valores elevados de la derivada de la imagen. Existen varias tcnicas para procesar imgenes y obtener contornos: * operadores de gradiente (primera derivada) * operadores de segunda derivada * mltiples respuestas a diferentes orientaciones. As como tcnicas de post procesamiento: * operador Canny * relajacin. Los operadores de gradiente como los requeridos por los objetivos de este examen se basan en diferenciar la imagen, es decir, encontrar el gradiente: Df = (df/dx, df/dy) Y la magnitud del gradiente: |Df| = [ (df/dx)2 + (df/dy)2 ]1/2 La aproximacin del gradiente se puede realizar tomando la diferencia de valores contiguos en la imagen. 1,1 1,2 2,1 2,2 -Para una seccin de 2 x 2: df/dx = I 1,2 - I 1,1 df/dy = I 2,1 - I 1,1 -Secciones 3x3 -Diferencias cruzadas -etc. Las aproximaciones anteriores se pueden implementar como filtros espaciales (mscaras) para las derivadas parciales de x y de y. Como: a) Roberts b) Prewitt

c) Sobel d) Frei-chen La deteccin de contornos por medio de los operadores de la primera derivada Se fundamenta como se menciono anteriormente en el cambio abrupto en la imagen, un modelo ideal de cabio intensidad que identifica el contorno de una imagen, se observa en la figura superior de la derecha pero en la vida real se presenta un poco ms borroso o difuminada lo que presenta el principal problema derecha abajo. Dentro de la deteccin de bordes con precisin sub-pixelica se encuentra el filtro Canny, el cual combina un operador diferencial con un filtro gaussiano. Canny propone los siguientes pasos: a) Reduccin de ruido. Se suaviza la imagen con un filtro gaussiano reduciendo el ruido, los detalles y las texturas que no interesan. b) Clculo del gradiente. Para la obtencin del gradiente se aplica el filtro Sobel a la imagen suavizada. c) Supresin de no mximos. Una vez calculado la direccin del gradiente en el paso anterior, se debe encontrar la direccin que mejor se aproxima a la normal al borde. Eliminando los puntos que no tienen un valor mximo de gradiente. 4. Histresis. En este paso se definen los bordes definitivos, seleccionando slo aquellos pxeles cuyo gradiente se encuentra entre dos umbrales establecidos. As al aplicar matlab con el programa mostrado en el anexo como examen01.m a nuestra imagen original obtenemos: Donde se observa que la mscara de Roberts es la ms atenuada y la eliminacin de ruido en contorno es casi total, aun que tambin algunos contornos fueron pasados por alto prewitt, sobel, la del gradiente isotrpico y la de la gradiente cubica entregan resultados muy similares. Este mismo programa nos muestra un ejemplo de la direccin del gradiente, utilizando la funcin quiver (meramente ilustrativo) Medicin subpixelica. Debido a que no pudimos segmentar por color ya que al realizar la umbralizacion de la imagen obtenamos varias tonalidades de blanco como los mostrados en la imagen de adelgazamiento, ni tampoco contbamos con colores para separar por los diversos planos RGB y seleccionar lo que necesitbamos, decidimos utilizar la funcin de seleccin con la que cuenta matlab que utilizando el clic derecho del ratn y despus clic izquierdo para definir solo la medicin del contorno del arco que nos interesa debido a que no queremos medir la altura de los postes ni del cableado electrico, la inconveniente de esto es que no se puede utilizar como un programa automtico dado que requiere que el usuario seleccione el segmento a trabajar. Trabajando nicamente con los tonos grises.

Para obtener contornos tambin probamos con las funcines: %metodo alterno utilizando la funcion edge %Ed01=edge(doubl(w),'roberts'); %Ed02=edge(doubl(w),'prewitt'); %Ed03=edge(doubl(w),'sobel'); %Ed04=edge(doubl(w),'log'); %Ed05=edge(doubl(w),'canny'); Siendo w nuestra imagen filtrada Obteniendo los siguientes resultados anteriores. El programa se encuentra en el anexo como examen01.m La segunda parte del anexo muestra como se realizo la medicin del contorno (pixelicamente) La verdad es que no entend como se haca lo que se solicitaba el examen a pesar de haber ledo bastantes artculos. Se explica acontinuacion lo que e trata en el programa: 1 se carga la imagen 2se convierte a escala de grises 3se aplica un filtro gaussiano del tamao de la matriz con sigma=0.2 4saque las derivadas parciales de x y y para determinar la magnitud del gradiente y su direccin 5 se graficaron todas 6 se aplica un umbral con histresis para eliminar ruido y segmentar solo el rango de imagen minimo y mximo que requerimos para trabajar. Binarizando la imagen. 7ya con el umbral podemos segmentar con la funcin de seleccin bwselect que selecciona objetos en nuestra imagen binaria de donde se selecciona el arco elctrico manualmente 8 podemos utilizar bwtraceboundary para trazar el contorno de los pixeles que no son cero empezando de la esquina superior izquierda. As pixel por pixel de las filas y columnas en direccin de anlisis nor-oeste NW checando su relacin con los 8 pixeles circundantes para definir si pertenece al contorno as hasta completar 406 puntos que es lo que mide el contorno. 9trazamos los puntos ya que se completa toda la matriz 10sobreescribimos con la imagen original de grises para ver si coinciden

Imgenes de seleccin y contorno

Acercamiento a la imagen de contorno Comparacin con la funcion de contorno sobel, canny, ImEdge = edge( double(ImSelect),'mascara');

Se observa el contorno de la mascara utilizada de blanco y nuestro contorno obtenido en azul. Sobel Canny Roberts prewitt Zero cross Log Anexo %%%%%%%%%%%%% examen01.m %%%%%%%%%%%%%%% close all; clear all; Mroberts=[1 0;0 -1]; Mprewitt=[-1 0 1;-1 0 1 ; -1 0 1 ]; Msobel=[-1 0 1; -2 0 2; -1 0 1]; Misotropica=[-1 0 1; -sqrt(2) 0 sqrt(2); -1 0 1]; Mcubica=[-1 0 1; -4 0 4; -1 0 1]; % cargamos en x la imagen principal x=imread('C:\Documents and Settings\pepe\Escritorio\semestre enerojul2010\imagenes\documentos\examen 1 nahum\Electric arc\ElectricARC_20.bmp'); w=rgb2gray(x); %imagen rgb a grises Z=size(w); Filtro=fspecial('gaussian',Z,0.2); %se aplican filtro 2d predefinido gausiano ImFiltrada = filter2(Filtro,w); %pasa bajas tamao de Z y sigma para suavisar

% deteccion del borde en X derivada parcial de x Ix01= conv2(double(ImFiltrada),Mroberts); %convolucion de X con el filtro Ix02= conv2(double(ImFiltrada),Mprewitt); Ix03= conv2(double(ImFiltrada),Msobel); Ix04= conv2(double(ImFiltrada),Misotropica); Ix05= conv2(double(ImFiltrada),Mcubica); % deteccion en Y derivada parcial de y Iy01= conv2(double(ImFiltrada),(Mroberts)'); %convolucion de la Y con el filtro Iy02= conv2(double(ImFiltrada),(Mprewitt)');

Iy03= conv2(double(ImFiltrada),(Msobel)'); Iy04= conv2(double(ImFiltrada),(Misotropica)'); Iy05= conv2(double(ImFiltrada),(Mcubica)'); GRAD01=abs(Ix01)+abs(Iy01); %sacamos el gradiente GRAD02=abs(Ix02)+abs(Iy02); GRAD03=abs(Ix03)+abs(Iy03); GRAD04=abs(Ix04)+abs(Iy04); GRAD05=abs(Ix05)+abs(Iy05); %GRAD01=sqrt(Ix01.*Ix01+Iy01.*Iy01); %otra forma de sacar el gradiente %GRAD02=sqrt(Ix02.*Ix02+Iy02.*Iy02); %GRAD03=sqrt(Ix03.*Ix03+Iy03.*Iy03); %GRAD04=sqrt(Ix04.*Ix04+Iy04.*Iy04); %GRAD05=sqrt(Ix05.*Ix05+Iy05.*Iy05); %metodo alterno utilizando la funcion edge %Ed01=edge(doubl(w),'roberts'); %Ed02=edge(doubl(w),'prewitt'); %Ed03=edge(doubl(w),'sobel'); %Ed04=edge(doubl(w),'log'); %Ed05=edge(doubl(w),'canny'); %direccion de los gradientes theta1=((atan2(Iy01,Ix01)*180)/(pi)); theta2=((atan2(Iy02,Ix02)*180)/(pi)); theta3=((atan2(Iy03,Ix03)*180)/(pi)); theta4=((atan2(Iy04,Ix04)*180)/(pi)); theta5=((atan2(Iy05,Ix05)*180)/(pi)); figure(1); subplot(2,3,1); %ploteamos imshow(w); title('Electric arc'); subplot(2,3,2); image(GRAD01); title('Gradiente Roberts'); subplot(2,3,3); image(GRAD02); title('Gradiente prewitt'); subplot(2,3,4); image(GRAD03);

title('Gradiente sobel'); subplot(2,3,5); image(GRAD04); title('Gradiente isotropica'); subplot(2,3,6); image(GRAD05); title('Gradiente cubica'); figure (2); subplot(2,1,1); imshow(w); title('Electric arc'); %imagen en grises original subplot(2,1,2); imshow(w(1:50,1:50)); hold on; quiver(Ix01(1:50,1:50),Iy01(1:50,1:50)); %muestra el gradiente en la region title('Zoom grad'); % de aqui pa abajo solo es con robertson por que no supe hacer un for.:) % umbral I_max=max(max(GRAD01)); %mximo de la norma del gradiente de robertson I_min=min(min(GRAD01)); %mnimo de la norma del gradiente level=0.1*(I_max-I_min)+I_min; %nivel del umbral alfa=0.1 Ibw=max(GRAD01,level.*ones(size(GRAD01))); %mximo de la norma con una matriz de unos del tamao del delgrad [n,m]=size(Ibw); % Adelgazamiento (Usando interpolacin para encontrar los pixeles donde la %norma del gradiente tiene un mximo local.) for i=2:n-1, for j=2:m-1, if Ibw(i,j) > level, X=[-1,0,+1;-1,0,+1;-1,0,+1]; Y=[-1,-1,-1;0,0,0;+1,+1,+1]; Z=[Ibw(i-1,j-1),Ibw(i-1,j),Ibw(i-1,j+1); Ibw(i,j-1),Ibw(i,j),Ibw(i,j+1); Ibw(i+1,j-1),Ibw(i+1,j),Ibw(i+1,j+1)]; XI=[Ix01(i,j)/GRAD01(i,j), -Ix01(i,j)/GRAD01(i,j)]; YI=[Iy01(i,j)/GRAD01(i,j), -Iy01(i,j)/GRAD01(i,j)]; ZI=interp2(X,Y,Z,XI,YI); if Ibw(i,j) >= ZI(1) & Ibw(i,j) >= ZI(2) I_temp(i,j)=I_max;

else I_temp(i,j)=I_min; end else I_temp(i,j)=I_min; end end end figure (3); imshow(I_temp); title('Adelgazado'); colormap(gray);

%%%%%%%%%%%%%%%%%%%%%%%%examen02.m%%%%%%%%%%%%%% %%%%%%%%% clc; clear all; close all; x = imread ('C:\Documents and Settings\pepe\Escritorio\semestre enerojul2010\imagenes\documentos\examen 1 nahum\Electric arc\ElectricARC_20.bmp'); % Se lee la imagen Original figure(1); subplot(2,2,1); imshow(x); Title ('Imagen Original'); w=rgb2gray(x); Z=size(w); Filtro=fspecial('gaussian',Z,0.2); ImFiltrada = filter2(Filtro,w); subplot(2,2,2); image(ImFiltrada); Title ('Imagen Filtrada') ; [m,n]= size(ImFiltrada); sobel=[-1 0 1;-2 0 2;-1 0 1]; %sobel dx=conv2(double(ImFiltrada),sobel); %derivadas parciales en x y en y dy=conv2(double(ImFiltrada),sobel'); MGrad=abs(dx)+abs(dy); % magnitud del gradiente theta=atan2(dy,dx); %angulo del gradiente subplot(2,2,3);

imshow(MGrad); Title ('Mag del gradiente'); subplot(2,2,4); imshow(theta); Title ('theta'); %umbral con histeresis T1=220 %valor umbral alto T2=210 %valor umbral bajo aboveT2 = ImFiltrada > T2; % puntos sobre el umbral bajo [aboveT1r, aboveT1c] = find(ImFiltrada > T1); % valores que no son cero arriba %del humbral alto % segmentacion que muestra las regiones que conectan arriba de T1 bw = bwselect(aboveT2, aboveT1c, aboveT1r, 8); %conectividad de 8 pixeles alrededor figure(2); subplot(2,2,1); imshow(bw); Title ('Imagen Umbral'); ImSelect=bwselect(8); %seleccion de segmento a trabajar s=size(ImSelect); subplot(2,2,2); imshow(ImSelect); Title ('Imagen Seleccionada'); subplot(2,2,3); imshow(w); Title ('Contorno en Imagen de grises'); for row = 1:s(1) %hasta tamao de row x for col=1:s(2) %hasta tamao de col y if ImSelect(row,col), break; end end contour = bwtraceboundary(ImSelect, [row, col], 'NW', 8, 406); if(~isempty(contour)) %si el arreglo no es cero hold on; %retiene imagen seleccionada

plot(contour(:,2),contour(:,1),'B','LineWidth',2); %imprime una linea end end ImEdge = edge( double(ImSelect),'sobel'); subplot(2,2,4); imshow(ImEdge); Title ('Contornos de sobel');

Referencias: Sub-pixel edge detection, DE NAYER Instituut Onderzoeksgroep Digitale Technieken J. De Nayerlaan 5 B-2860 Sint-Katelijne-Waver Edge Detection & Boundary Tracing EE 528 Digital Image Processing Canni edge detection tutorial Bill Green (2002) http://www.pages.drexel.edu/~weg22/can_tut.html

S-ar putea să vă placă și