Conteo de Cajas

Anuncio
Dimensión Fractal
Imelda Trejo Lorenzo
8 de junio de 2011
1.
Introducción
Existen diferentes conceptos de dimensión fractal, por ejemplo, dimensión de
Hausdorff, dimensión de auto-similitud y dimensión por conteo de cajas. Matemáticamente la dimensión de Hausdorff es la más aceptable entre la comunidad cientı́fica.
Sin embargo, como esta definición requiere de otras nociones y herramientas matemáticas, esta no es muy usada en las aplicaciones. Por otro lado, la dimensión
fractal de auto-similitud sólo es aplicable a conjuntos u objetos que tienen la propiedad de auto-similitud. En este trabajo presentaremos la definición de dimensión
fractal por conteo de cajas e implementaremos este método en c++. Luego, presentaremos la dimensión por conteo de cajas obtenidas con el programa para algunos
conjuntos. Finalizamos con las conclusiones.
2.
Dimensión por conteo de cajas
Para definir la dimensión por conteo de cajas (box counting) para un subconjunto
A acotado de R2 , supondremos que tenemos la imagen de A. Luego, a esta imagen
la colocaremos en una cuadrı́cula de 1/s2 rectángulos, con 0 < s ≤ 1. Para ser más
exactos, cada rectángulo tendrá de largo la longitud de la imagen multiplicada por
s y tendrá de ancho la longitud del ancho de la imagen multiplicada por s.
La dimensión por conteo de cajas, la cual denotaremos con Db (A) o simplemente
Db , se define como
log(Ns (A))
,
(1)
Db (A) = lı́m
s→∞ log(1/s)
donde Ns (A) es el número de cubos que intersecta con A, siempre que Db (A) exista.
1
Por ejemplo, si A es un cuadrado entonces Db (A) = 2. Porque para todo 0 < s ≤
1, Ns (A) = s12 .
s (A))
para s suficientemente pequeño. Por lo tanto, Db es
Observe que Db ≈ log(N
log(1/s)
el número tal que
1
Ns (A) ≈ D .
s b
3.
Implementación del método
A continuación presentaremos un programa realizado en c++. Este programa da
como salida una aproximación de Db (A) para cada imagen de la estructura de A y
s. Este programa divide la imagen en pequeños rectángulos de dimensión ph y pw
respectivamente. Cuenta el número de cuadros, N , que intersecta con la estructura
s (A))
A e imprime N y Dimensión = log(N
. Para esto, primero se tiene que abrir una
log(1/s)
imagen tipo bmp. Luego, seleccionar con el mouse el color que determina la estructura
de A y finalmente dar click en el botón contar. Si se quiere visualizar la cuadrı́cula
sobre A se deberá seleccionar esta opción. El código del programa se presenta en el
apéndice.
Interfaz gráfica del programa
4.
Análisis del programa
A continuación presentamos algunas corridas del programa para un cuadrado y
una lı́nea.
2
Cuadrado
La dimensión que arroja el programa es 2. Que como ya sabı́amos Db = 2. En
este caso Db coincide con la dimensión euclidiana y por ende con la dimensión de
Hausdorff, DH . Ası́ que, el programa aproxima bien a Db y no importa que tan fina
sea la cuadrı́cula.
Lı́nea
Para la linea la dimensión euclidiana y de Hausdorff es 1. Sin embargo, como
veremos en la siguiente tabla al hacer tender s a cero los resultados que obtenemos
del programa difieren de 1.
s
Db
s
Db
−2
2 =0.25
1
0.1
1
2−3 =0.125
1
0.01 1.150514...
2−4 =0.03125
1
0.001
1.301029
2−5 =0.015625
1
0.0001 1.471622..
2−6 =0.0078125 1.142857..
3
De los datos obtenidos, podemos concluir que el programa no aproxima a DH
cuando s tiende a 0. Esto seguramente se debe a los errores de cálculo que almacena
la maquina, pues está trabajando con cantidades muy pequeñas. Por otro lado, si
s va disminuyendo en potencias de dos entonces tenemos una mejor precisión hasta
n ≤ 5.
5.
Dimensión de ciertos objetos
En esta sección presentaremos algunas aproximaciones de la dimensión de ciertos
conjuntos con s =0.03125. Los cuales los comparamos con la dimensión de Hausdorff.
Conjunto
DH
Db
Curva de Koch
ln 4 /ln 3 = 1.26186...
1.4370
Triı́gulo de Sierpinski ln 3/ ln 2 = 1.58496... 1.716992..
A continuación mostramos las corridas del programa para otros objetos con mayor
irregularidad.
4
6.
Conclusiones
El programa que se implemento no aproxima bien a la dimensión de Hausdorff.
Sin embargo, este programa proporciona una cantidad que de alguna manera mide
la irregularidad de los objetos.
A.
Código
Código del programa principal.
TForm1 *Form1;
//--------------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
5
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
if (OpenPictureDia\log1->Execute()){
Image1->Picture->LoadFromFile(OpenPictureDia\log1->FileName);
// Label1->Caption=IntToStr(Image1->Picture->Bitmap->Width)+"x"+IntToStr(Image1->Pic
}
}
//--------------------------------------------------------------------------void __fastcall TForm1::BitBtn2Click(TObject *Sender)
{
long double d,s,com,pw,ph,x0,y0,x1,y1;
int Bh,Bv,i,j,k,h,ii,jj;
int p0w,p1w,p0h,p1h;
long int cont=0;
Graphics::TBitmap *C1;
Image1->Picture->LoadFromFile(OpenPictureDia\log1->FileName);
Memo1->Lines->Clear();
B1 = new Graphics::TBitmap();
B1->Width=Image1->Picture->Bitmap->Width;
B1->Height=Image1->Picture->Bitmap->Height;
B1->Assign(Image1->Picture->Bitmap);
C1 = new Graphics::TBitmap();
C1->Width=B1->Width;
C1->Height=B1->Height;
C1->Assign(B1);
s = StrToFloat(Edit1->Text);
d = 1/s;
// Tomando los cuadros desde pixel ... a pixel .... --------pw = B1->Width/(d*1.0);
ph = B1->Height/(d*1.0);
6
x0 = 0.0;
x1 = pw;
y0 = 0.0;
y1 = ph;
h=1;
do {
++h;
p0h = int(floor(y0)); p1h = int(ceil(y1));
x0 = 0.0; x1 = pw; k=1;
do {
k++;
p0w = int(floor(x0)); p1w = int(ceil(x1));
// Dibujo de las lı́neas <--------------------------if (CheckBox1->Checked){
C1->Canvas->MoveTo(p1w,p0h);
C1->Canvas->LineTo(p1w,p1h);
C1->Canvas->MoveTo(p0w,p1h);
C1->Canvas->LineTo(p1w,p1h);
}
// Contar cuadros ----------------------------------for (i=p0h;i<p1h;++i){
for (j=p0w;j<p1w;++j){
if (B1->Canvas->Pixels[j][i]==color){
if (CheckBox2->Checked)
Memo1->Lines->Add(IntToStr(h-1)+","+IntToStr(k-1));
cont++;
i=p1h;
break;
}
}
}
x0=x1; x1=pw*k;
} while (x1<=B1->Width);
7
y0=y1; y1=ph*h;
} while (y1<=B1->Height);
// -----------------------------------------------------Label2->Caption=("N="+IntToStr(cont));
Label3->Caption=("Dimensión="+FloatToStr(\log(cont)/\log(1.0/s)));
Image1->Picture->Bitmap->Assign(C1);
delete B1;
delete C1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
Shape1->Brush->Color=Image1->Canvas->Pixels[X][Y];
color=Shape1->Brush->Color;
}
//---------------------------------------------------------------------------
8
Descargar