Está en la página 1de 3

Calculo de rea usando el teorema de Pick sobre representaciones de

contornos mediante cdigo de cadena de Freeman


Alberto Isaac Prez-Sanpablo

Resumen En el presente trabajo se realiza la


implementacin en MATLAB del teorema de Pick para el
clculo de reas de objetos en base a su representacin de
controno mediante cdigos de cadena de Freeman. El algortimo
implementado para objetos 8 conectados puede extenderse para
objetos 4, 6 y 12 conectados.

I.

INTRODUCCION

El teorema de Pick proporciona un mtodo para calcular


reas del contorno de objetos formados por puntos conectados
en una retcula regular[1]. La ecuacin bsica es la siguiente
Area=GI + *GB-1 (1)
Donde GI es la cuenta de puntos dentro de la figura GB es
la cuenta de puntos del permetro de la figura. El contorno del
objeto puede representarse mediante el cdigo de cadena de
Freeman. As se ha propuesto un algoritmo para calcular reas
sobre el contorno de objetos representados mediante el cdigo
de cadena de Freeman[1]. El contorno de los objetos debe
cumplir ciertas restricciones. Los contornos deben codificarse
en sentido de las manecillas del reloj (el interior del polgono
debe estar a la derecha), los agujeros deben estar unidos al
borde mediante cdigos de cadena. Debe removerse
pennsulas de rea cero (detectadas por cambios de direccin
de 180 en cdigos consecutivos). La cadena debe rotarse de
tal modo que el ltimo cdigo tenga una componente diferente
de cero. Cada cdigo es procesado de manera secuencial
mediante la separacin del cdigo en sus componentes X y Y,
e incrementando la cuenta de puntos GI y GB. La funcin
NC(Y) proporciona la ordenada de los puntos del contorno
sobre la retcula respecto a una referencia Y=0. Despus de
procesar el ltimo cdigo, GB toma el valor de la longitud de
cadena, GI es la longitud de la cadena ms el nmero de puntos
reticulares interiores menos un factor de correccin de la
cuenta total de GB. El teorema original de Pick funciona para
algunos de estos puntos debido a que puntos reticulares
corregidos son contados solo una vez de la siguiente manera
GI=GI-GB (2)
Produce el valor GI para insertarse en las ecuacin (1)
corrigiendo la sobre estimacin del rea en GB.

A. I. Prez-Sanpablo Instituto Nacional de Rehabilitacin Luis


Guillermo Ibarra Ibarra (INR), Ciudad de Mxico, 14389 Mxico; y
Centro de Investigacin y Estudios Avanzados del IPN (CINVESTAV),
Ciudad de Mxico, 07360 Mxico (telfono: +52 (55) 59991000; email: albperez@inr.gob.mx y aperez@ctrl.cinvestav.mx).

II.

METODOLOGA

El algoritmo fue implementado en MATLAB. Primero se


implement una funcin fchaincode para obtener el cdigo de
cadena de Freeman a partir del contorno de una imagen, ver
algoritmo 1.
Algoritmo 1. Funcin fchaincode para obtener el cdigo de cadena
de Freeman a partir del contorno de una imagen
function CC=fchaincode(contest,test)
contestb=diff(contest);
contesta(:,2)=contestb(:,2);
contesta(find(contestb(:,1)==1),1)=-1;%invierte
gradiente en eje vertical
contesta(find(contestb(:,1)==-1),1)=1;%invierte
gradiente en eje vertical
%calcula chaincode de Freeman usando gradiente
de posicin
ccode=4*atan2(contesta(:,1),contesta(:,2))/pi;
ix=find(ccode<0);
ccode(ix)=ccode(ix)+8;
%invierte eje Y de secuencia de pixels de
contorno y define marco de referencia
% con inicio en "cero"
contestb(:,2)=contest(1:end-1,2)-1;
contestb(:,1)=size(test,1)-contest(1:end-1,1);
contestb=[contestb;contestb(1,:)];
CC.contestb=contestb;
CC.contesta=contesta;
CC.ccode=ccode;
end

Posteriormente se implement la funcin areachaincode que


calcula el rea del contorno del objeto mediante el teorema de
Pick, ver Algortimo2.
Algoritmo 2. Funcin areachaincode que calcula el rea del
contorno del objeto mediante el teorema de Pick
function area=areachaincode(CC)
contestb=CC.contestb;
contesta=CC.contesta;
ccode=CC.ccode;
D=contesta;
D2=[D(end,:);D];
ccode2=[ccode(end-1:end);ccode];
contestb2=[contestb(end,:);contestb];
GI=0;
xflag=0;
for i=3:length(ccode2)
if D2(i-1,2)>0 %Dx
GI=GI+contestb2(i,1)+1;disp('A') %Y(i+1)
if xflag==-1
switch ccode2(i)
case 0
if ccode2(i-1)==2
if ccode2(i-2)>=2 &&
ccode2(i-2)<=5
GI=GI+contestb2(i1,1)+1;disp('1A')%1

end
end
if ccode2(i-1)==6
if ccode2(i-2)>=3 &&
ccode2(i-2)<=6
GI=GI+contestb2(i1,1);disp('2A')%2
end
end
case 1
if ccode2(i-1)>=1 &&
ccode2(i-1)<=4
GI=GI+contestb2(i1,1)+1;disp('3A')%1
end
case 7
if ccode2(i-1)==2
if ccode2(i-2)>=2 &&
ccode2(i-2)<=4
GI=GI+contestb2(i1,1)+1;disp('4A')%1
end
end
if ccode2(i-1)==6
if ccode2(i-2)>=4 &&
ccode2(i-2)<=6

GI=GI-contestb2(i1,1)-1;disp('5B')%1
end
end
if (ccode2(i-1)>=5 &&
ccode2(i-1)<=7)|| ccode2(i-1)==0
GI=GI-contestb2(i1,1);disp('6B')%2
end
end
end
else
if D2(i-2,2)~=0
xflag=D2(i-2,2);
end
if (xflag==1 && D2(i-1,1)>0)
GI=GI+1;disp('1C')
elseif (xflag==-1 && D2(i-1,1)<0)
GI=GI+1;disp('2C')
end
end
[GI, xflag]
end
GB=length(ccode)
GIp=GI-GB
area=GIp+0.5*GB-1;

GI=GI+contestb2(i1,1);disp('5A')%2
end
end
if ccode2(i-2)>=4 &&
ccode2(i-2)<=5
GI=GI+contestb2(i1,1);disp('6A')%2
end
end
end
elseif D2(i-1,2)<0 %Dx
GI=GI-contestb2(i,1);disp('B') %Y(i+1)
if xflag==1
switch ccode2(i)
case 4
if ccode2(i-1)==2
if (ccode2(i-2)>=0 &&
ccode2(i-2)<=2) || ccode2(i-2)==7
GI=GI-contestb2(i1,1)-1;disp('1B')%1
end
end
if ccode2(i-1)==6
if (ccode2(i-2)>=0 &&
ccode2(i-2)<=1) || (ccode2(i-2)>=6 && ccode2(i2)<=7)
GI=GI-contestb2(i1,1);disp('2B')%2
end
end
case 3
if ccode2(i-1)>=0 &&
ccode2(i-1)<=3
GI=GI-contestb2(i-1,1)1;disp('3B')%1
end
if ccode2(i-1)==6
if (ccode2(i-2)>=6 &&
ccode2(i-2)<=7)|| ccode2(i-2)==0
GI=GI-contestb2(i1,1);disp('4B')%2
end
end
case 5
if ccode2(i-1)==2
if ccode2(i-2)>=0 &&
ccode2(i-2)<=2

El algoritmo fue probado en una imagen sinttica de un


contorno, ver Algoritmo 3
Algoritmo 3. Prueba de los algoritmos creados en una imagen
sinttica
%% crea imagen sinttica de contorno
test=zeros([4 5]);
test([2 3 5 7 8 9 11 12 14 18 19])=1;
%encuentra secuencia pixels que forman contorno
contest = bwtraceboundary(test,[4
2],'N',8,Inf,'clockwise');
%%
%encuentra gradiente de posicin entre puntos
consecutivos
CC=fchaincode(contest,test);
contestb=CC.contestb;
contesta=CC.contesta;
ccode=CC.ccode;
area=areachaincode(CC)

III.

RESULTADOS

La representacin en cdigo de cadena de Freeman de la


imagen creada se muestra en la Fig. 1.
3

2.5

1.5

0.5

0
1

1.5

2.5

3.5

4.5

Figura 1. Representacin en cdigo de cadena de Freeman de


imagen sinttica.

GI=(13)-(11)=2

La tabla I muestra los resultados parciales del algoritmo para


cada iteracin
Tabla I. Resultados parciales del algoritmo en cada iteracin
Cdigo

Dx

Dy

GI

-1

-1

-1

10

-1

13

16

-1

16

-1

13

-1

-1

12

-1

13

-1

13

Al final de las iteraciones se obtuvo lo siguiente para las


ecuaciones 1 y 2

(2)

Area= (2)+0.5*(11)--1=6.5 (1)


As el valor del rea finalmente obtenido es de 6.5.
IV.

CONCLUSIONES

Se implement satisfactoriamente el teorema de Pick para el


clculo de reas de contornos representados mediante
cdigos de cadena de Freeman. La implementacin se prob
en una cadena de conectividad 8, pero el mtodo puede
implementarse con ciertas modificaciones para cadenas 4, 6
y 12 conectadas.
REFERENCIAS
[1]

M. R. Anstaett and H. Moellering, AREA


CALCULATIONS USING PICKS THEOREM ON
FREEMAN-ENCODED POLYGONS IN
CARTOGRAPHIC SYSTEMS, in Proceedings of
AUTO CARTO 7, 7th international Symposium on
Computer-Assited Cartography, 1985, pp. 1121.

También podría gustarte