Ανάλυση σχήματος

Για την υλοποίηση του αλγορίθμου chain code χρησιμοποιείται ένα σύνολο συναρτήσεων, οι οποίες είναι υλοποιημένες σε διαφορετικά αρχεία. Πιο συγκεκριμένα, ο κώδικας που χρησιμοποιείται για την υλοποίηση του αλγορίθμου chain code είναι ο εξής:

Αρχείο chaincode

clear;

close all;

rgb = imread(‘homework5.bmp’);

imshow(rgb);

%convert RGB values to hue-saturation-value (HSV) color space.

%find out the flame on picture.

%when the brightness of pixel is over 0.999, I define it was the flame.

hsv = rgb2hsv(rgb);

i= hsv(:,:,3);

light=i>0.999;

%remove the redundant parts.

s = ones(3,3);

s1= ones(3,1);

light = imdilate(light,s1,1);

light = imerode(light,s1,1);

a = bwlabel(light);

b = a==1;

b = imdilate(b,s,2);

b = imerode(b,s,1);

b=double(b);

%figure,imshow(i);

figure,imshow(b);

%find out the edge of the flame

edg = edge(b,’canny’);

figure,imshow(edg);

hold on;

%defind the start point

[r c] = find(edg==1);

posit =[r c];

posit= sortrows(posit);

[m n]=size(posit);

plot(posit(1,2),posit(1,1),’-.r*’);

s= posit(1,1);t= posit(1,2);

posit(1,:)=[];

chain=[];

%find out the chain code.

for k =1: m-1

[o p]=size(posit);

for l=1:o

if posit(l,:)==[s t+1] %0

s= posit(l,1);t= posit(l,2);

posit(l,:)=[];

chain= [ chain 0];

break;

elseif posit(l,:)==[s-1 t+1] %1

s= posit(l,1);t= posit(l,2);

posit(l,:)=[];

chain= [ chain 1];

break;

elseif posit(l,:)==[s-1 t] %2

s= posit(l,1);t= posit(l,2);

posit(l,:)=[];

chain= [ chain 2];

break;

elseif posit(l,:)==[s-1 t-1] %3

s= posit(l,1);t= posit(l,2);

posit(l,:)=[];

chain= [ chain 3];

break;

elseif posit(l,:)==[s t-1] %4

s= posit(l,1);t= posit(l,2);

posit(l,:)=[];

chain= [ chain 4];

break;

elseif posit(l,:)==[s+1 t-1] %5

s= posit(l,1);t= posit(l,2);

posit(l,:)=[];

chain= [ chain 5];

break;

elseif posit(l,:)==[s+1 t] %6

s= posit(l,1);t= posit(l,2);

posit(l,:)=[];

chain= [ chain 6];

break;

elseif posit(l,:)==[s+1 t+1] %7

s= posit(l,1);t= posit(l,2);

posit(l,:)=[];

chain= [ chain 7];

break;

end

end

end

disp(chain);

Αρχείο chaincode2

clear;

close all;

rgb = imread(‘example.bmp’);

A=gt_code(rgb);

Η εικόνα πάνω στην οποία πραγματοποιείται η επίδειξη των αλγορίθμων είναι το αρχείο “example.png”. Στην αυθεντική της μορφή η εικόνα έχει ως εξής:

4A16CC7BD5DDCF61_350_0

Στις οθόνες που ακολουθούν, επιστρέφεται διαδοχικά το αποτέλεσμα που προκύπτει από την εφαρμογή του αλγόριθμου chain code στο αρχικό αρχείο.

4A16CC7BD5DDCF61_350_1

4A16CC7BD5DDCF61_350_2

4A16CC7BD5DDCF61_350_3

Για την υλοποίηση του αλγορίθμου differential chain code χρησιμοποιείται ένα σύνολο συναρτήσεων, οι οποίες είναι υλοποιημένες σε διαφορετικά αρχεία. Πιο συγκεκριμένα, υπολογιζεται πρωτα ο chain code και στη συνεχεια ο differential.

Αρχείο gt_code.m

 

function [CH_CODE] = gt_code(IM);

% This function generated the chain code from a binary image;

row = 1; col = 1;

[rr,cc] = size(IM);

% Scanning image to find the object

while IM(row,col) == 0,

if col == cc

row = row+1;col = 1;

else

col = col+1;

end

end

first_pt = [row,col]; % First point of the image

i = [0 1 1 1 0 -1 -1 -1];

j = [1 1 0 -1 -1 -1 0 1];

x = 0;

xm = mod(x,8)+1;

count = 0; % For stopping loop in case of just one pixal

%next_row = row + i(x); next_col = col + j(x);

while ( (IM(row+i(xm),col+j(xm)) == 0) & (count < 4) ), % Finding first element of chain code

x = x+1;

xm = mod(x,8)+1;

count = count + 1;

end

if count >= 4 % When image is just one point

CH_CODE = [];

DF_CODE = [];

else

CH_CODE = [x]; % First member of chain code

row = row + i(xm); col = col + j(xm);

% [row col]

x = x-2; %start checking for contour from this direction

xm = mod(x,8)+1;

count = 0;

while ( ((row ~= first_pt(1)) | (col ~= first_pt(2))) & (count < 8) ),

while ( (IM(row+i(xm),col+j(xm)) == 0) & (count < 8) ),

x = x+1; xm = mod(x,8)+1;

count = count+1;

end

CH_CODE = [CH_CODE x];

row = row + i(xm); col = col + j(xm);

% [row col]

x = x-2; xm = mod(x,8)+1;

count = 0;

end

end

Αρχείο gt_diff.m

 

function [x2,y] = gt_diff(IM);

% Get chain code of an image using get_code function

% Get differential chain code from the chain code

% The chain code is first resampled so that we get a constan size chain code.

x = gt_code(IM);

M = 128; % Length of difference code

N = length(x);

x2 = resample(x(1:N),M,N);

% x2 = round(x2);

% x2 = ((x2 <= 7) .* x2) + ((x2 > 7) .* 7);

% x2 = ((x2 >= 0) .* x2);

y(1) = x2(1) – x2(end);

nn = 2:length(x2);

y(nn) = x2(nn) – x2(nn-1);

y = mod(y+4,8)-4;

%y = x2;

Αλγόριθμος υπολογισμού κεντρικών και αναλλοίωτων ροπών και να γίνει επίδειξη της λειτουργίας του σε εικόνες.

Το σύνολο των ροών μιας φραγμένης συνάρτησης f(x,y) ορίζεται από τη σχέση:

4A16CC7BD5DDCF61_350_4 ,

όπου οι δείκτες j,k λαμβάνουν όλες τις μη αρνητικές ακέραιες τιμές. Το σύνολο όλων των ροπών 4A16CC7BD5DDCF61_350_5 , j,k={0,1,2,…..} προσδιορίζει πλήρως και μονοσήμαντα τη συνάρτησηf(x,y). Με τη βοήθεια των συντεταγμένων κέντρου βάρους, υπολογίζονται οι κεντρικές ροπές από την εξής σχέση:

4A16CC7BD5DDCF61_350_6

όπου x’ , y’ οι συντεταγμένες του κέντρου βάρους και άκρα ολοκλήρωσης +∞ και -∞ . Στην συνάρτηση αυτή λοιπόν, περνάμε σαν παράμετρο μια εικόνα και τις τιμές των j,k .

Το βασικότερο πλεονέκτημα των κεντρικών ροπών είναι το γεγονός πως παραμένουν αναλλοίωτες σε μεταβολές της θέσης του αντικειμένου.

[παραπομπή]

Για την υλοποίηση ο αλγόριθμος υπολογισμού κεντρικού ροπών με τη βοήθεια του MATLAB, χρησιμοποιείται ένα σύνολο συναρτήσεων, οι οποίες είναι υλοποιημένες σε διαφορετικά αρχεία. Πιο συγκεκριμένα, ο κώδικας που χρησιμοποιείται για την υλοποίηση του αλγορίθμου υπολογισμού κεντρικών ροπών είναι ο εξής:

 

Αρχείο centralmoments.m

 

% gets a given central moment value

function muv = centralmoments (Image,u,v)

[r,c] = find(Image==1); % get (r,c) of region’s pixels

rbar = mean(r);

cbar = mean(c);

n = length(r);

momlist = zeros(n,1);

for i = 1 : n

momlist(i) = (r(i) – rbar)^u * (c(i) – cbar)^v;

end

muv = sum(momlist);