clear all; close all; clc;

% Image Processing Program version 1.0
% Imagem exemplo do painel da Semana de IC

% Carrega imagem

Image=imread('6a.jpg');

% Invertendo imagem

ImgInverted=imcomplement(Image);

% Correcao de luminosidade

H = fspecial('gaussian', 10, 4);
ImageInBlur = imfilter(ImgInverted, H , 'replicate');

ImgBackground = imopen(ImageInBlur,strel('disk',50));
ImgCorrected = imsubtract(ImageInBlur,ImgBackground); 

% Melhorando contraste

ImgContrasted=imadjust(ImgCorrected ,stretchlim(ImgCorrected),[0 1]);

% Mostrando as quatro imagens

subplot(2,2,1),imshow(Image),title('Imagem AFM')
subplot(2,2,2),imshow(ImgInverted),title('Imagem Invertida')
subplot(2,2,3),imshow(ImageInBlur),title('Remocao de Informacao de fundo')
subplot(2,2,4),imshow(ImgBackground),title('Informacao de Fundo')

% Segmentacao da imagem 
% Parametro de conversao para binaria

level=graythresh(ImgContrasted);

% Binarizacao

ImgBinaria=im2bw(ImgContrasted,level);

% Pos-processamento
% Retirada de objetos que tocam as bordas

NoBorder=imclearborder(ImgBinaria,8);

% Remocao de pequenos fragmentos

NoFrag=bwmorph(NoBorder,'open',3);

% Elemento struturante

el=[0,1,0;1,1,1;0,1,0];

% Correcao por dilatacao

ImgDilated=imdilate(NoFrag,el);

% Mostrando as outras 4 imagens

figure(2),subplot(2,2,1),imshow(ImgBinaria),title('Imagem Binaria')
figure(2),subplot(2,2,2),imshow(NoBorder),title('Remocao de objetos das bordas')
figure(2),subplot(2,2,3),imshow(NoFrag),title('Remocao de pequenos fragmentos')
figure(2),subplot(2,2,4),imshow(ImgDilated),title('Dilatacao')

% Labelizacao

[Label,Total]=bwlabel(ImgDilated,4);

% Extracao de infomacoes uteis

Atributes=regionprops(Label,'all');

Area=[Atributes.Area];
BoundingBox=[Atributes.BoundingBox];
SubarrayIdx=[Atributes.SubarrayIdx];
MajorAxisLength=[Atributes.MajorAxisLength];
MinorAxisLength=[Atributes.MinorAxisLength];
Eccentricity=[Atributes.Eccentricity];
Orientation=[Atributes.Orientation];
Solidity=[Atributes.Solidity];

% Informacoes de Area

AreaMax=max(Area);
AreaMin=min(Area);
AverageArea=mean(Area);
AreaStrDeviation=std(Area);

% Informacoes de BoudingBox

AverageBB=mean(BoundingBox);
BBStrDeviation=std(BoundingBox);

% Informacoes de Eixos

AverageMajorAxis=mean(MajorAxisLength);
AverageMinorAxis=mean(MinorAxisLength);

% Informacao de Ecentricidade

AvarageEc=mean(Eccentricity);

% Informacao de Orientacao

AvarageOrient=mean(Orientation);

% Gravando dados para arquivo de texto

a=Area
bb=BoundingBox
mja=MajorAxisLength
sub=SubarrayIdx
mna=MinorAxisLength
ecc=Eccentricity
ori=Orientation
sol=Solidity
GM=[a,bb,mja,sub,mna,ecc,ori,sol]
fid=fopen('Grandezas_Metricas.txt','w')
fprintf(fid,'%6.5f\n',GM)
fclose(fid)
