Sunday, December 10, 2017


Antarmuka GUI MATLAB ini dapat dipakai untuk laboratorium sinyal bagi mahasiswa dan untuk menunjang penelitian bagi para peneliti. Anda bisa memesannya pada form pemesanan di bawah ini.













function [kpl,i2] = sift(a)

%menampilkan citra berderau
%axes(handles.axes2); imshow(a,[]); title('Citra');

[brs,kol,plane]=size(a);
if plane==3
a=rgb2gray(a);
end
a=im2double(a);
original=a;
store1=[];
store2=[];
store3=[];
tic
%% pembangkitan oktaf pertama
k2=0;
[m,n]=size(a);
a(m:m+6,n:n+6)=0;
clear c;
for k1=0:3
    k=sqrt(2);
sigma=(k^(k1+(2*k2)))*1.6;
for x=-3:3
    for y=-3:3
        h(x+4,y+4)=(1/((2*pi)*((k*sigma)*(k*sigma))))*exp(-((x*x)+(y*y))/(2*(k*k)*(sigma*sigma)));
    end
end
for i=1:m
    for j=1:n
        t=a(i:i+6,j:j+6)'.*h;
        c(i,j)=sum(sum(t));
    end
end
store1=[store1 c];
end
clear a;
a=imresize(original,1/2);

%% pembangkitan piramida level kedua
k2=1;
[m,n]=size(a);
a(m:m+6,n:n+6)=0;
clear c;
for k1=0:3
    k=sqrt(2);
sigma=(k^(k1+(2*k2)))*1.6;
for x=-3:3
    for y=-3:3
        h(x+4,y+4)=(1/((2*pi)*((k*sigma)*(k*sigma))))*exp(-((x*x)+(y*y))/(2*(k*k)*(sigma*sigma)));
    end
end
for i=1:m
    for j=1:n
        t=a(i:i+6,j:j+6)'.*h;
        c(i,j)=sum(sum(t));
    end
end
store2=[store2 c];
end
clear a;
a=imresize(original,1/4);

%% pembangkitan level ketiga
k2=2;
[m,n]=size(a);
a(m:m+6,n:n+6)=0;
clear c;
for k1=0:3
    k=sqrt(2);
sigma=(k^(k1+(2*k2)))*1.6;
for x=-3:3
    for y=-3:3
        h(x+4,y+4)=(1/((2*pi)*((k*sigma)*(k*sigma))))*exp(-((x*x)+(y*y))/(2*(k*k)*(sigma*sigma)));
    end
end
for i=1:m
    for j=1:n
        t=a(i:i+6,j:j+6)'.*h;
        c(i,j)=sum(sum(t));
    end
end
store3=[store3 c];
end

%% mendapatkan titik kunci dari citra
i1=store1(1:brs,1:kol)-store1(1:brs,kol+1:2*kol);
i2=store1(1:brs,kol+1:2*kol)-store1(1:brs,2*kol+1:3*kol);
i3=store1(1:brs,2*kol+1:3*kol)-store1(1:brs,3*kol+1:4*kol);
[m,n]=size(i2);
kp=[];
kpl=[];
for i=2:m-1
    for j=2:n-1
        x=i1(i-1:i+1,j-1:j+1);
        y=i2(i-1:i+1,j-1:j+1);
        z=i3(i-1:i+1,j-1:j+1);
        y(1:4)=y(1:4);
        y(5:8)=y(6:9);
        mx=max(max(x));
        mz=max(max(z));
        mix=min(min(x));
        miz=min(min(z));
        my=max(max(y));
        miy=min(min(y));
        if (i2(i,j)>mz && i2(i,j)>my) || (i2(i,j)<miz && i2(i,j)<miy)
            kp=[kp i2(i,j)];
            kpl=[kpl i j];
        end
    end
end

%% Menampilkan titik-titik kunci pada citra
for i=1:2:length(kpl);
    k1=kpl(i);
    j1=kpl(i+1);
    i2(k1,j1)=1;
end

%axes(handles.axes4); imshow(i2,[]); title('Citra Dengan Titik-Titik Kunci');
%figure, imshow(i2);
%title('Citra dengan titik-titik kunci yang dipetakan ke dalamnya');

%% Penugasan magnitudo dan arah pada titik-titik kunci
for i=1:m-1
    for j=1:n-1
         mag(i,j)=sqrt(((i2(i+1,j)-i2(i,j))^2)+((i2(i,j+1)-i2(i,j))^2));
         oric(i,j)=atan2(((i2(i+1,j)-i2(i,j))),(i2(i,j+1)-i2(i,j)))*(180/pi);
    end
end

%% Membentuk lingkungan-lingkungan titik kunci
kpmag=[];
kpori=[];
for x1=1:2:length(kpl)
    k1=kpl(x1);
    j1=kpl(x1+1);
    if k1 > 2 && j1 > 2 && k1 < m-2 && j1 < n-2
    p1=mag(k1-2:k1+2,j1-2:j1+2);
    q1=oric(k1-2:k1+2,j1-2:j1+2);
    else
        continue;
    end
    %% Mencari magnitudo dan arah untuk titik kunci
[m1,n1]=size(p1);
arr_cacah_mag=[];
for x=0:10:359
    cacah_mag=0;
for i=1:m1
    for j=1:n1
        ch1=-180+x;
        ch2=-171+x;
        if ch1<0  ||  ch2<0
        if abs(q1(i,j))<abs(ch1) && abs(q1(i,j))>=abs(ch2)
            ori(i,j)=(ch1+ch2+1)/2;
            cacah_mag=cacah_mag+p1(i,j);
        end
        else
        if abs(q1(i,j))>abs(ch1) && abs(q1(i,j))<=abs(ch2)
            ori(i,j)=(ch1+ch2+1)/2;
            cacah_mag=cacah_mag+p1(i,j);
        end
        end
    end
end
arr_cacah_mag=[arr_cacah_mag cacah_mag];
end
[maxvm maxvp]=max(arr_cacah_mag);
kmag=maxvm;
kori=(((maxvp*10)+((maxvp-1)*10))/2)-180;
kpmag=[kpmag kmag];
kpori=[kpori kori];

end


%% Membentuk deskriptor-deskriptor titik kunci
kpd=[];
%% Membentuk lingkungan-lingkungan titik kunci
for x1=1:2:length(kpl)
    k1=kpl(x1);
    j1=kpl(x1+1);
    if k1 > 7 && j1 > 7 && k1 < m-8 && j1 < n-8
    p2=mag(k1-7:k1+8,j1-7:j1+8);
    q2=oric(k1-7:k1+8,j1-7:j1+8);
    else
        continue;
    end
    kpmagd=[];
    kporid=[];
%% Membagi menjadi blok-blok 4x4
for k1=1:4
        for j1=1:4
            p1=p2(1+(k1-1)*4:k1*4,1+(j1-1)*4:j1*4);
            q1=q2(1+(k1-1)*4:k1*4,1+(j1-1)*4:j1*4);
            
        %% Mencari arah dan magnitode untuk titik kunci
        [m1,n1]=size(p1);
        arr_cacah_mag=[];
        for x=0:45:359
            cacah_mag=0;
        for i=1:m1
            for j=1:n1
                ch1=-180+x;
                ch2=-180+45+x;
                if ch1<0  ||  ch2<0
                if abs(q1(i,j))<abs(ch1) && abs(q1(i,j))>=abs(ch2)
                    ori(i,j)=(ch1+ch2+1)/2;
                    cacah_mag=cacah_mag+p1(i,j);
                end
                else
                if abs(q1(i,j))>abs(ch1) && abs(q1(i,j))<=abs(ch2)
                    ori(i,j)=(ch1+ch2+1)/2;
                    cacah_mag=cacah_mag+p1(i,j);
                end
                end
            end
        end
        arr_cacah_mag=[arr_cacah_mag cacah_mag];
        end
        kpmagd=[kpmagd arr_cacah_mag];
        end
    end
    kpd=[kpd kpmagd];
end
fprintf('\n\nWaktu yang dihabiskan untuk menghitung kunci-kunci SIFT dan deskriptornya adalah :%f\n\n',toc);
end


No comments: