تحلیل برخال (فراکتال) تصاویر
مقدمه ای بر فرکتالها
هندسه فرکتالی اولین بار توسط آقای پروفسور مندلبروت (Benoit Mandelbrot) در 1975 ارائه شد، این تئوری که به دلیل ناتوانی هندسه اقلیدسی در محاسبه و توصیف اجسام فرکتالی بیان شده است و بخوبی می تواند این اجسام را توصیف کند؛ فرکتالها (در فارسی: برخال) دارای ساختارهایی هستند که خود را در مقیاس کوچکتر تکرار می کنند این یکی از ویژگی های مهم فرکتال ها می باشد. بطور کلی تعریف فرکتال به شرح زیر است:
هر شیی که دارای سه ویژگی زیر باشد فرکتال می باشد
1- دارای ساختاری خودمتشابه باشد، یعنی قسمتهایی از تصویر همانند بخش های بزرگتری از تصویر باشد مانند گل کلم
2- بصورت تکراری قابل تولید باشد یعنی با تکرار بتوان آن شی را بازتولید کرد
3- بُعد آن شی اعشاری باشد (برای درک بهتر باید بدانیم خط دارای بعد یک است، صفحه بعد دو دارد و اشیاء یا حجم بعد سه دارند)
به ویژگی اول Self-Similarity ویژگی دوم Iterative Formation و ویژگی سوم Fractional Dimension می گوییم.
تشابه:
در واقع تشابه به یکسانی اجسام در اندازه های متفاوت گفته می شود بعبارت ساده تر اگر بتوان دو جسم را با کوچک یا بزرگ کردن بر هم منطبق کرد گوییم آن دو جسم متشابه هستند. باید توجه داشت شرط تشابه برای فرکتالها شرط لازم ولی غیرکافی است یعنی اجسام زیادی وجود دارند که متشابه هستند ولی فرکتال نیستند.
محاسبه بُعد فرکتالی
روش های زیادی (بیش از 6 روش) برای محاسبه بعد فرکتالی موجود می باشد که ساده ترین آنها روش Box Counting (شمارش جعبه) می باشد که بشرح زیر می باشد.
تصویر شیی را در نظر بگیرید و آن تصویر را چنان مشبک فرض کنید که اندازه هر سلول برابر s (واحد) باشد، سپس سلول هایی را که شی یا بخشی از شی در آن قرار دارد را بشمارید تا مثلا عدد x1 بدست آید، سپس در گام دوم همین کار را مجدد تکرار کنید بنحویکه مقدار s را تغییر داده اید (مثلا دوبرابر شود) پس از حداقل 3 مرتبه، آنچه حاصل می شود شمارش باکس هایی است که با اندازه های متفاوت محاسبه شده اند.
فرض کردیم با سه مقیاس s1, s2, s3 کار شمارش جعبه های متاثر از شی را شمردیم و سه مقدار x1, x2, x3 را بدست آوردیم سپس مقدار log x و log s را برای هر سه مقیاس محاسبه میکنیم و در دستگاه متناظر رسم می کنیم، شیب خط گذرنده از نزدیکترین فاصله ممکن از این سه نقطه برابر بعد فرکتالی جسم موجود در آن تصویر می باشد. در این باره ویکیپدیا را ببینید.
در جزئیات پیاده سازی توجه کنید که معمولا شی را از پس زمینه در تصویر جدا می کنیم و سپس بُعد فرکتالی آن را محاسبه می کنیم با این حال می توان با یک حدآستانه بسادگی مفهومی مشابه (ولی نه چندان صحیح!) را به اجرا درآورد.
قطعه کد زیر یک الگوریتم مقدماتی و بهینه نشده برای محاسبه بُعد فرکتالی تصاویر می باشد، توجه شود بدلیل آنکه قصد نداشتیم به بحث تشخیص و جداسازی اشیاء وارد شویم از حد آستانه 128 در تصاویر دیجیتال استفاده کرده ایم.
clear all;
clc;
InPic=imread('C:\test.jpg');
[MM,NN,ZZ] = size(InPic);
if(ZZ>1)
pic=uint8(rgb2gray(InPic));
else
pic=uint8(InPic);
end;
%========================================================
% Preprocessing: Binarized input image
%========================================================
for i=1:MM-40
for j=1:NN-40
if(pic(i+20,j+20)<128)
imgBinary(i,j)=0;
end;
if(pic(i+20,j+20)>=128)
imgBinary(i,j)=255;
end;
end;
end;
%========================================================
% Computing fractal dimension with 5 scales
%========================================================
imgBinary=mat2gray(imgBinary);
imshow(imgBinary);
[M,N]=size(imgBinary);
for k=1:5 % scale
Sz=2*k;
sum=0;
for i=1:Sz:M-Sz
for j=1:Sz:N-Sz
flag=0;
mask((1:Sz),(1:Sz))=imgBinary((1:Sz)+i-1,(1:Sz)+j-1);
for p=1:Sz
for q=1:Sz
if(mask(p,q)==0)
flag=flag+1;
end;
end;
end;
if(flag>=Sz)
sum=sum+1;
end;
end;
end;
w(k,1)=Sz;
w(k,2)=sum;
x(k,1)=log10(1/Sz);
y(k,1)=log10(sum);
end;
m = robustfit(x,y) ;
%figure,plot(x,y,'o');
%figure,plot(x,y,'-');
result=m(2,1);
disp(result);