Está en la página 1de 7

UNI-CTIC 1

Cálculo de distancias y áreas en una imagen


Canales Cuba, Manolo
Torres Guillén, Diego
Ticse Torres, Royer
Romero Catay, Angelo
Lima, 4 de Agosto del 2009

Resumen—En el siguiente trabajo, se obtuvo un programa sistema de referencia inercial, dado estas consideraciones, el
hecho en Matlab el cual mediante un patrón o escala en 2-D se primer problema a tener es como calibrar la cámara, la cual
puede hallar el tamaño de la longitud o área de un objeto cuya va a ser utilizada para capturar la imagen del objeto, y el
imágen es capturada con una camara que previamente ha sido
calibrada con el patrón inicial. segundo problema a considerar es como crear un programa
o desarrollar un codigo usando Matlab para poder hallar la
Index Terms—Calibración de cámara, Tamaño de objetos en
longitud del objeto a partir de la imagen tomada por la cámara
2-D
previamente calibrada.

I. I NTRODUCCI ÓN IV. D ESCRIPCI ÓN DE DATOS


Supongamos que queremos encontrar el tamaño de la lon- Los datos que se han usado para trabajar provienen de
gitud o área de un objeto, entonces se procede a medir con imágenes en formato .jpg, . Una de entradas que se tiene es
un patrón de longitud o calcular mediante fórmulas el área la imagen capturada por la webcam, es la imagen del objeto
del objeto; si queremos automatizar este proceso, tendremos a analizar en el tablero de ajedrez:
que aprovechar la herramienta del Matlab y su versatilidad en
el tratamiento de imágenes para lograr encontrar la longitud
deseada.
Existen varios métodos o modelos que sirven para este fin, el
que utilizaremos en este proyecto se basa en utilizar un objeto
plano cuadriculado en blanco y negro que viene a ser el patrón,
y mediante una cámara se obtiene una imágen de la cual se
calcúla las distancias(el número de pixeles) entre los pixeles
que tienen el mismo color y comparando esta distancia con el
tamaño real de la cuadrı́cula se puede hallar una relación que
permite calibrar la cámara.
Luego con la misma cámara y en el mismo escenario, se Figura 1. Tablero de ajedrez con el objeto tomada de webcam
obtienen imágenes de objetos y a partir de ellos mediante un
tratamiento se halla el número de pixeles ocupados por el La otra imagen que tenemos es la imagen que ya se tiene
objeto y con la relación hallada previamente se puede calcular archivada, que nos va servir para reconocer el objeto en la
el tamaño de la longitud o área del objeto. imagen anterior:

II. O BJETIVOS
El objetivo general del trabajo es calcular el tamaño de la
longitud o área de objetos simples para lo cual se deberá de-
sarrollar un programa hecho en Matlab que permita hallar, con
la ayuda de una camara, dicho tamaño.

II-A. Objetivos especı́ficos


Diseñar la plantilla bidimensional o patrón. Figura 2. Imagen que sirve con el objeto en el tablero
Calcular los parámetros de la cámara (calibración).
Hallar el tamaño de un objeto. Y finalmente se toma una imagen del tablero solo también:

III. P LANTEAMIENTO DEL PROBLEMA V. P REPARACI ÓN DE DATOS


Para el desarrollo del trabajo se debe tener en cuenta las V-A. Calculo de la longitud del objeto
dimensiones del objeto, el mas simple debe ser lineal y estar De los datos que se tienen como entrada solo dos se
ubicado en forma horizontal o vertical con respecto a un preparan previamente antes de trabajar con ellas.
UNI-CTIC 2

b r i l l o = imgHsv ( i , j , 3 ) ;
a = 0;
i f ( c o l o r > RangHSV ( 1 ) &&
c o l o r < RangHSV(2))&&
( s a t u r a c > RangHSV ( 3 ) &&
s a t u r a c < RangHSV(4))&&
( ( b r i l l o > RangHSV ( 5 ) &&
b r i l l o < RangHSV ( 6 ) ) )
a = 1;
imgObjet ( i , j ) = a ;
end
end
end
Figura 3. Imagen del tablero solo tomado con webcam.
Luego a la imagen se erosión con el comando imerode
y se la dilata con el comando imdilate, para acentuarla
Imagen del tablero: mas en la figura y que solo se tenga ese objeto blanco
en fondo negro.
Primero a la imagen al pasamos a escala de grises
mediante el comando rgb2gray. VI. P ROCEDIMIENTO DE S OLUCI ÓN
Después para determinar las lı́neas horizontales del Para hallar la solución del problema se ha seguido los
tablero , se pasa la convolución de la imagen mediante la siguientes pasos:
función GradientHorizontalImg ,en donde el parámetro Plantilla bidemencional.
de entrada es la imagen en escala de grises y nos devuelve 1. Deteccion de la imagen del tablero mediante imgTablero
la solo las lı́neas horizontales de la imagen del tablero 2. Calculamos los puntos del tablero PointsChess(), a las
mediante el comando conv2. coordenadas sobre el tablero en unidades de cuadardos
f u n c t i o n Gx = G r a d i e n t H o r i z o n t a l I m g ( i m g G r i s ) las denominaremos u,v y a las coordenadas en pixeles
Gx = conv2 ( i m g G r i s , [ 1 2 1 ] , ’ same ’ ) ; las denominaremos X,Y .
Gx = conv2 ( Gx,[ −1 0 1 ] ’ , ’ same ’ ) ;
3. Identificamos los puntos que forman las rectas horizon-
Para hallar las hallar las lı́neas verticales solo se rota la tales mediante la función Horizontales().
imagen y se hace el mismo procedimiento que el anterior. 4. Hallamos las ecuaciones de las rectas con la función
Mediante la función slimming ,cuya entrada es la unión rectas().
de las dos imágenes sacadas en los pasos anteriores. 5. para las verticales calculamos primero la transpuesta y
Adelgaza las lı́neas obtenidas de la convolución de tal realizamos los pasos anteriores.
manera que sean de ancho un pixel. 6. Determinamos los puntos de interseccion en la función
findPoints().
function imgHoriz = slimming ( imgHoriz ) 7. Pintamos los puntos con la función PrintfPointsBoard().
[ f c ] = s i z e ( imgHoriz ) ;
for k = 1:4 , 8. Calculamos los parametros de la cámara en la matriz
f o r i = 2 : f −1, Ratio mediante la función DetermRatio().
f o r j = 2 : c −1,
i f ( imgHoriz ( i , j ) ) Calculo de la longitud del objeto.
i f ( ( i m g H o r i z ( i −1, j ) 1. Captura de la imagen tablero con objeto Img.
&& i m g H o r i z ( i +1 , j ) ) | |
( k == 4 & i m g H o r i z ( i −1, j ) ) )
2. Identificamos el objeto por el rango usando la función
i m g H o r i z ( i −1, j ) = 0 ; IndentificObject(), esta funcion tambien permite identi-
i m g H o r i z ( i +1 , j ) = 0 ; ficar al objeto con¡mo horizontal o vertical.
end
end
3. El rango HSV del objeto lo determinamos previamente
end usando la función rang hsv()
end 4. Determinamos los puntos extremos del objeto e la matriz
end
PointObject.
5. Identificamos la celda donde se encuentre los puntos
Imagen del tablero: extremos del objeto mediante la función IdentifSquare-
ObjectInTablero().
A esta imagen se le va sacar el objeto para transportarlo 6. Finalmente determinamos la longitud del objeto medi-
a una nueva imagen con las dimensiones de la anterior ante la función lengthObject() usando el parametro Ratio
esto se hace comparándolo con el rango hsv de la figura de la cámara.
de guı́a ( donde esta el objeto del color del mismo de la
imagen) y ası́ se obtiene una imagen binarizada, que es
parte de la función indetificObjec.
for i =1:n ,
f o r j = 1 :m,
c o l o r = imgHsv ( i , j , 1 ) ;
s a t u r a c = imgHsv ( i , j , 2 ) ;
UNI-CTIC 3

Función rectas()
Luego mediante la función rectas(), se toma la imagen en
escala de grises , se calcula el gradiente horizontal usando
la función GradienthorizontalImg() para la imagen en
gris y para la imagen negativa.luego superponemos las
dos imagenes y adelgazamos los contornos horizontales
en (imgHoriz) con esto podemos calcular los puntos que
forman las rectas con la funcion anterior Horizontales(),y
finalmente con esta matriz calculamos la ecuación de la
recta en la función EcuacAdjustm().
f u n c t i o n R e c t a = r e c t a s ( imgRgb , Max Lines , c o r r y x )
i m g G r i s = r g b 2 g r a y ( imgRgb ) ;

Gx = G r a d i e n t H o r i z o n t a l I m g ( i m g G r i s ) ;
G2x = G r a d i e n t H o r i z o n t a l I m g ( 1 − i m g G r i s ) ;

i m g H o r i z = s u p e r P o s i t i o n ( Gx , G2x ) ;
imgHoriz = slimming ( imgHoriz ) ;

M = H o r i z o n t a l e s ( imgHoriz , Max Lines , imgRgb ) ;

R e c t a = E c u a c A d j u s t m (M, c o r r y x ) ;
f u n c t i o n Gx = G r a d i e n t H o r i z o n t a l I m g ( i m g G r i s )
Gx = conv2 ( i m g G r i s , [ 1 2 1 ] , ’ same ’ ) ;
Gx = conv2 ( Gx,[ −1 0 1 ] ’ , ’ same ’ ) ;
f u n c t i o n h o r i z = s u p e r P o s i t i o n ( Gx , G2x )
Bgx = ( Gx > 0 . 9 5 ) ;
Bg2x = ( G2x > 0 . 9 5 ) ;
h o r i z = ( Bgx ) | ( Bg2x ) ;
Figura 4. Diagrama de bloques
f u n c t i o n R e c t a = E c u a c A d j u s t m (M, c o r r y x )
[ n m] = s i z e (M) ;
i f n ==1 ,
VII. S OLUCI ÓN DEL P ROBLEMA d i s p l a y ( ’ no s e e n c o n t r a r o n r e c t a s ’ ) ;
Plantilla bidimencional. return ;
end
Aquı́ explicaremos como se llego a obtener los parametros de q = 1;
la cámara: i f corr yx ,
for i =1:n ,
Primero capturamos la imagen del tablero imgTablero, N( i − 1 + 2∗mod ( i , 2 ) , : ) = M( i , : ) ;
Función Horizontales() end
Mediante la función Horizontales() se identifican los M = N;
end
puntos que forman las rectas horizontales , cuya salida for i =1:2: n ,
es una matriz 2nxm donde hay n rectas con m puntos Sx = M( i , : ) ∗ o n e s (m, 1 ) ;
que lo conforman. Sy = M( i + 1 , : ) ∗ o n e s (m, 1 ) ;
Sxy = (M( i , : ) . ∗M( i + 1 , : ) ) ∗ o n e s (m, 1 ) ;
function List Rectas = Horizontales ( horiz , Sx2 = (M( i , : ) . ∗M( i , : ) ) ∗ o n e s (m, 1 ) ;
Max Lines , imgRgb ) Sy2 = (M( i + 1 , : ) . ∗M( i + 1 , : ) ) ∗ o n e s (m, 1 ) ;
R e c t a ( 1 , q ) = ( Sxy − Sx∗Sy /m ) / ( Sx2 − Sx ˆ 2 /m ) ;
[ f c ] = size ( horiz ); i f ( (m∗Sx2 − Sx ˆ 2 ) == 0 ) ,
STEP LENG = 1 6 ; R e c t a ( 2 , q ) = M( i , 1 ) ;
else
NUMB = [ 1 : STEP LENG + 1 ] ; R e c t a ( 2 , q ) = ( Sy∗Sx2 − Sx∗Sxy ) / ( m∗Sx2 − Sx ˆ 2 ) ;
ONES = o n e s ( 1 , STEP LENG + 1 ) ; end
seguir = 0; q = q + 1;
lineas = 1; end
cont = 0;
max Steps = 15; Función findpoints()
L i s t R e c t a s = zeros ( 1 , max Steps ) ; Luego usando la función findPoints(), hallamos los pun-
i = 3∗STEP LENG ;
Save Index i = 0; tos de intersección de las rectas horizontales y verticales.
w h i l e i <= f −2∗STEP LENG , f u n c t i o n Coor = f i n d P o i n t s ( R e c t a s x , R e c t a s y )
j = 10; [ f n ] = s i z e ( Rectas x ) ;
w h i l e j <= c−2∗STEP LENG , [ f m] = s i z e ( R e c t a s y ) ;
. for i =1:n ,
. f o r j = 1 :m,
. m1 = R e c t a s x ( 1 , i ) ;
end b1 = R e c t a s x ( 2 , i ) ;
i f ( ( l i n e a s −1)/2 >= Max Lines ) m2 = R e c t a s y ( 1 , j ) ;
break ; b2 = R e c t a s y ( 2 , j ) ;
end i f i s n a n ( m1 ) ,
j = j + 1; Coor ( i , j , : ) = [ b1 , b1 ∗m2 + b2 ] ;
UNI-CTIC 4

else La primera parte del problema es preparar a la imagen


Coor ( i , j , : ) = [ ( b2−b1 ) / ( m1−m2 ) , . . . del tablero más la imagen (img) para ser trabajada, cosa
( b2 ∗m1−b1 ∗m2 ) / ( m1−m2 ) ] ;
end que ya explicamos anteriormente.
end La parte que continua es ya con la imagen que sale
end después del proceso anterior, en esta parte se pasa deter-
minar el rectángulo donde esta encerrado el objeto. Para
Función printPointBoard()
esto se hallan los puntos medios de los lados horizontales
Con esta función pintamos los puntos de interseccion de
del cuadrado y esas coordenadas se almacenan en un
color azul
matriz p1. Además se determina si el objeto esta vertical
f u n c t i o n imgRgb = P r i n t f P o i n t s B o a r d ( Coor , imgRgb ) o horizontalmente puesto dándole valeres de 1 o 0 a H
[ n m p ] = s i z e ( Coor ) ; y V según corrsponda.
for i =1:n ,
f o r j = 1 :m, mx = min ( v e c ( 1 , : ) ) ;
imgRgb= p r i n t P o i n t ( round ( Coor ( i , j , 1 ) ) , Mx = max ( v e c ( 1 , : ) ) ;
round ( Coor ( i , j , 2 ) ) , imgRgb , ’ b ’ ) ;
end my = min ( v e c ( 2 , : ) ) ;
end My = max ( v e c ( 2 , : ) ) ;

i f ( abs ( mx−Mx) > abs ( my−My) )


Función DetermRatio : me = round ( ( my + My ) / 2 ) ;
p1 ( 1 , : ) = [ mx , me ] ;
p1 ( 2 , : ) = [Mx, me ] ;
Esta función tiene como entrada , la matriz Coor y nos H = 0;
devuelve una matriz con la relación centı́metro/ pı́xel V = 1;
(Ratio(i,j)) en cada celda del tablero . else
me = round ( ( mx + Mx ) / 2 ) ;
Para hallar tal relación se ubican en un punto de la celda p1 ( 1 , : ) = [ my , me ] ;
y la recorren hallando su perı́metro , como ya es sabido p1 ( 2 , : ) = [My, me ] ;
que cada celda tiene 8 cm de perimeto , entonces se H = 1;
V = 0;
calcula relación (8/perimetro). end
r e t = { p1 H V}
f u n c t i o n R a t i o = D e t e r m R a t i o ( Coor )
[ n m r ] = s i z e ( Coor ) ;
f o r i = 1 : n −1, Función IdentifSquareOfObjectInTablero :
f o r j = 1 :m−1,
p e r i m e t r o = s q r t ( ( ( [ Coor ( i , j , 1 ) ,
Coor ( i , j , 2 ) ] − [ Coor ( i +1 , j , 1 ) , Coor ( i , j , 2 ) ] ) . ˆ 2 ) Esta función tiene como parámetros de entrada las coor-
∗ ones ( 2 , 1 ) ) ; denadas de todos los puntos de intersección de las lı́neas
perimetro = perimetro + horizontales y verticales que conforman el tablero (Coor)
s q r t ( ( ( [ Coor ( i +1 , j + 1 , 1 ) , Coor ( i +1 , j + 1 , 2 ) ]
− [ Coor ( i +1 , j , 1 ) , Coor ( i +1 , j , 2 ) ] ) . ˆ 2 ) y la matriz p1 (PointObject), y tiene como salida una
∗ ones ( 2 , 1 ) ) ; matriz que contiene los puntos que determinan la celda
perimetro = perimetro + donde se encuentran los extremos del objeto.Para esto se
s q r t ( ( ( [ Coor ( i , j + 1 , 1 ) , Coor ( i , j + 1 , 2 ) ] −
[ Coor ( i +1 , j + 1 , 1 ) , Coor ( i +1 , j + 1 , 2 ) ] ) . ˆ 2 ) halla busca la menor distancia entre la los extremos del
∗ ones ( 2 , 1 ) ) ; objeto (determinado por p1) y la celdas.
perimetro = perimetro +
s q r t ( ( ( [ Coor ( i , j , 1 ) , Coor ( i , j , 2 ) ] − function
[ Coor ( i , j + 1 , 1 ) , Coor ( i , j + 1 , 2 ) ] ) . ˆ 2 ) p= I d e n t i f S q u a r e O f O b j e c t I n T a b l e r o ( Coor , P o i n t O b j e c t )
∗ ones ( 2 , 1 ) ) ; [ n m r ] = s i z e ( Coor ) ;
Ratio ( i , j ) = 8/ perimetro ; for q =1:2 ,
end d = 100;
end for i =1:n ,
j = 1;
f o r j = 1 :m,
Por ultimo para el calculo de longitud utilizaremos esta i f ( ( P o i n t O b j e c t ( q , 1 ) − Coor ( i , j , 1 ) ) > 0 &
matriz Ratio, que servirá para la transformacion de ( P o i n t O b j e c t ( q , 2 ) − Coor ( i , j , 2 ) ) > 0 ) ,
pixeles a centı́metros por cada celda. d1 = abs ( P o i n t O b j e c t ( q , 1 ) − Coor ( i , j , 1 ) ) ;
d2 = abs ( P o i n t O b j e c t ( q , 2 ) − Coor ( i , j , 2 ) ) ;
Longitud del Objeto. i f ( d > s q r t ( d1 ˆ 2 + d2 ˆ 2 ) )
Función IndentificObject : d = s q r t ( d1 ˆ 2 + d2 ˆ 2 ) ;
p(q , : ) = [ i j ];
end
Mediante esta función, vamos a determinar la posición end
end
del objeto en el tablero ubicándolo dentro de un rectángu- end
lo. Esta función tiene como parámetros de entrada la end
imagen con el objeto de guı́a (RanbgHSV) y la imagen
del tablero con el objeto (img), y tiene como salida una Función lengthObject :
matriz double 2x2 (p1) y dos parámetros H y V double
(con valores 1 o 0). Esta función tiene varias partes la Esta función determina la longitud del objeto dependi-
cual pasaremos a explicar. endo en que posición se encuentre (ya sea vertical o
UNI-CTIC 5

horizontal). VIII. E XPERIMENTO


Para medir la longitud del objeto esta función lo hace por Primero corremos el programa ObjectDetected(x,y) donde x
pedazos , ya que la relación centı́metro /pı́xel depende e y son para indicar que se quiere detectar x por y puntos del
de la celda en la que se encuentre ese pedazo de objeto. tablero si tenemos un objeto relativamente grande entonces
Ası́ se recorre el objeto celda a celda hasta fin y en debemos colocar valores x e y de manera que podamos
cada medida se hace uso de Ratio(i,j) correspondiente.Por asegurar que el objeto esta dentro del conjunto de puntos
ejemplo si es vertical: sobre el tablero pero si no queremos preocuparnos de ello
i f (V) entonces simplemente podemos poner x e y en valores altos
j = p(1 ,2); por ejemplo: x = 15, y = 15 para asi asegurarnos que
f o r i =p ( 1 , 1 ) : p ( 2 , 1 ) ,
i f ( i ˜= p ( 2 , 1 ) ) hallemos todos los puntos.
v1 = P o i n t O b j e c t ( 2 , : ) − p o i n t ; Capturas de programa.
v2 = [ Coor ( i +1 , j , 1 ) , Coor ( i +1 , j , 2 ) ] − Entrada:
[ Coor ( i +1 , j + 1 , 1 ) , Coor ( i +1 , j + 1 , 2 ) ] ;
A = [ v2 ’ , − v1 ’ ] ;
b = ( p o i n t −[Coor ( i +1 , j + 1 , 1 ) , Coor ( i +1 , j + 1 , 2 ) ] ) ’ ;
Lanm = A\b ;
p o i n t I n t e r = p o i n t + Lanm ( 2 ) ∗ v1 ;
long = long +
R a t i o ( i , j ) ∗ s q r t ( ( p o i n t I n t e r −p o i n t )
. ˆ 2 ∗ ones ( 2 , 1 ) ) ;
point = pointInter ;
else
long = long +
R a t i o ( i , j ) ∗ s q r t ( ( p o i n t −P o i n t O b j e c t ( 2 , : ) )
. ˆ 2 ∗ ones ( 2 , 1 ) ) ;
end
end
end

Análogo si es horizontal.
Función rang hsv:
Figura 5. Tablero

Esta función nos va dar el rango hsv de el objeto guı́a


que nos va servir para comparar con el objeto que esta Entrada del objeto:
en el tablero.

f u n c t i o n v = rang hsv ( cad ) ;


img = double ( imread ( cad ) ) . / 2 5 5 ;
hsv = rgb2hsv ( img ) ;
v = [];
for i =1:3 ,
h1 = min ( min ( hsv ( : , : , i ) ) ) ;
h2 = max ( max ( hsv ( : , : , i ) ) ) ;
v = [ v h1 h2 ] ;
end

Figura 6. Tablero + Objeto

Captura de puntos del tablero:


Podemos observar como se hace la captura de puntos, esto
para x = 15, y = 15 , asi aseguramos todo el espacio de
trabajo.
UNI-CTIC 6

ANEXO

X. P ROGRAMA P RINCIPAL

function ObjectDetected (x , y )
close all

i m g T a b l e r o = d o u b l e ( i m r e a d ( ’ \ I m a g e n e s \ img16 . j p g ’ ) ) ;

Coor = P o i n t s C h e s s ( x , y , i m g T a b l e r o ) ;

img = d o u b l e ( i m r e a d ( ’ . . \ I m a g e n e s \ img9 . j p g ’ ) ) . / 2 5 5 ;

RangHSV = r a n g h s v ( ’ . . \ I m a g e n e s \ o b j e t c o l o r . JPG ’ ) ;

h = I n d e n t i f i c O b j e c t ( RangHSV , img ) ;
Figura 7. Captura de puntos

P o i n t O b j e c t = h {1};
IX. C ONCLUSIONES H = h {2};
V = h {3};
Se logró implementar una plantilla bidimensional con
cuadrı́culas de 2 cm2 . P o i n t O b j e c t I n U V = I d e n t i f S q u a r e O f O b j e c t I n T a b l e r o ( Coor
PointObject );
Con la ayuda de la plantilla se pudo calibrar la cámara
web. R a t i o = D e t e r m R a t i o ( Coor ) ;
Con el desarrollo de un programa hecho en Matlab se
l o n g = l e n g t h O b j e c t ( Coor , P o i n t O b j e c t ,
pudo hallar la longitud de objetos lineales en posición P o i n t O b j e c t I n U V , R a t i o , H, V)
horizontal y vertical.

R EFERENCIAS XI. IDENTIFICA EL OBJETO POR RANGO HSV


[1] [R. C. González, R. E. Woods; Digital image processing; Addison- f u n c t i o n r e t = I n d e n t i f i c O b j e c t ( RangHSV , img )
Wesley, 2007 ]
[2] [J. R. Parker; Algorithms for image processing and computer vision; imgHsv = rgb2hsv ( img ) ;
Wiley, 1997.] [ n m p ] = s i z e ( imgHsv ) ;
[3] [E.Cuevas, D. Zaldivar, Visión por computa- for i =1:n ,
dor utilizando Matlab ] disponible en la web: f o r j = 1 :m,
http://www.scribd.com/doc/23371/Procesamiento-de-imagenes-con- c o l o r = imgHsv ( i , j , 1 ) ;
Matlab s a t u r a c = imgHsv ( i , j , 2 ) ;
b r i l l o = imgHsv ( i , j , 3 ) ;
a = 0;
i f ( c o l o r > RangHSV ( 1 ) &&
c o l o r < RangHSV(2))&&
( s a t u r a c > RangHSV ( 3 )
&& s a t u r a c < RangHSV(4))&&
( ( b r i l l o > RangHSV ( 5 ) &&
b r i l l o < RangHSV ( 6 ) ) )
a = 1;
imgObjet ( i , j ) = a ;
end
end
end

imgErode = i m e r o d e ( i m g O b j e t , o n e s ( 3 ) ) ;
i m g D i l a = i m d i l a t e ( imgErode , o n e s ( 3 ) ) ;
[ n m] = s i z e ( i m g D i l a ) ;
vec = [ ] ;
for i = 1: n ,
f o r j = 1 :m,
i f imgDila ( i , j ) ,
vec = [ vec [ i j ] ’ ] ;
end
end
end
mx = min ( v e c ( 1 , : ) ) ;
Mx = max ( v e c ( 1 , : ) ) ;

my = min ( v e c ( 2 , : ) ) ;
My = max ( v e c ( 2 , : ) ) ;
UNI-CTIC 7

i f ( abs ( mx−Mx) > abs ( my−My) ) Lanm = A\b ;


me = round ( ( my + My ) / 2 ) ; p o i n t I n t e r = p o i n t + Lanm ( 2 ) ∗ v1 ;
p1 ( 1 , : ) = [ mx , me ] ; long = long + Ratio ( i , j )ˆ2∗ ones ( 2 , 1 ) ) ;
p1 ( 2 , : ) = [Mx, me ] ; point = pointInter ;
H = 0; else
V = 1; long = long + Ratio ( i , j )∗ ones ( 2 , 1 ) ) ;
else end
me = round ( ( mx + Mx ) / 2 ) ; end
p1 ( 1 , : ) = [ my , me ] ; end
p1 ( 2 , : ) = [My, me ] ;
H = 1;
V = 0;
end
r e t = { p1 H V} ;
f u n c t i o n p = I d e n t i f S q u a r e O f O b j e c t I n T a b l e r o ( Coor , . . .
PointObject )
[ n m r ] = s i z e ( Coor ) ;
for q =1:2 ,
d = 100;
for i =1:n ,
j = 1;
f o r j = 1 :m,

i f ( ( P o i n t O b j e c t ( q , 1 ) − Coor ( i , j , 1 ) ) > 0
& ( P o i n t O b j e c t ( q , 2 ) − Coor ( i , j , 2 ) ) > 0 ) ,

d1 = abs ( P o i n t O b j e c t ( q , 1 ) − Coor ( i , j , 1 ) ) ;
d2 = abs ( P o i n t O b j e c t ( q , 2 ) − Coor ( i , j , 2 ) ) ;

i f ( d > s q r t ( d1 ˆ 2 + d2 ˆ 2 ) )
d = s q r t ( d1 ˆ 2 + d2 ˆ 2 ) ;
p(q , : ) = [ i j ];
end
end
end
end
end

XII. F UNCION R ATIO


f u n c t i o n R a t i o = D e t e r m R a t i o ( Coor )
[ n m r ] = s i z e ( Coor ) ;

f o r i = 1 : n −1,
f o r j = 1 :m−1,
p e r i m e t r o = s q r t ( ( ( [ Coor ( i , j , 1 )
[ Coor ( i +1 , j , 1 ) , Coor ( i , j , 2 ) ] ) . ˆ 2 ) ∗ o n e s ( 2 , 1 ) ) ;
perimetro = perimetro +
Coor ( i +1 , j , 2 ) ] ) . ˆ 2 ) ∗ o n e s ( 2 , 1 ) ) ;
perimetro = perimetro +
Coor ( i +1 , j + 1 , 2 ) ] ) . ˆ 2 ) ∗ o n e s ( 2 , 1 ) ) ;
perimetro = perimetro +
Ratio ( i , j ) = 8/ perimetro ;
end
end

XIII. D ETERMINANDO LA LONGITUD DEL OBJETO ,


CUANDO ESTE ESTA VERTICAL

f u n c t i o n l o n g = l e n g t h O b j e c t ( Coor , P o i n t O b j e c t , p , R a t i o , H, V)
long = 0;
point = PointObject ( 1 , : ) ;

i f (V)
j = p(1 ,2);
f o r i =p ( 1 , 1 ) : p ( 2 , 1 ) ,
i f ( i ˜= p ( 2 , 1 ) )
v1 = P o i n t O b j e c t ( 2 , : ) − p o i n t ;
v2 = [ Coor ( i +1 , j , 1 ) , Coor ( i +1 , j , 2 ) ] ;
A = [ v2 ’ , −v1 ’ ] ;
b = ( p o i n t − [ Coor ( i +1 , j + 1 , 1 ) ’ ;