Monday, December 11, 2017

Deteksi Keretakan Tulang Berbasis Morfologi Citra


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.












KODE UNTUK SALAH SATU EVENT CALLBACK:

% --- Executes on button press in pushbutton8.
function pushbutton8_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton8 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

set(handles.pushbutton2,'Enable','off');
set(handles.pushbutton4,'Enable','off');
set(handles.pushbutton5,'Enable','off');
set(handles.pushbutton8,'Enable','off');
set(handles.pushbutton9,'Enable','on');

dimensi = str2num(get(handles.edit28,'string'));
panjang = str2num(get(handles.edit27,'string'));
derajat = str2num(get(handles.edit26,'string'));
radius1 = str2num(get(handles.edit25,'string'));
radius2 = str2num(get(handles.edit24,'string'));
tinggi = str2num(get(handles.edit23,'string'));
ukuran = str2num(get(handles.edit22,'string'));
jarak = str2num(get(handles.edit21,'string'));

switch get(get(handles.uipanel12,'SelectedObject'),'Tag')
   case 'radiobutton30',  se=strel('square',dimensi);
   case 'radiobutton29',  se=strel('line',panjang,derajat);
   case 'radiobutton28',  se=strel('disk',radius1);    
   case 'radiobutton25',  se=strel('ball',radius2,tinggi);
   case 'radiobutton26',  se=strel('diamond',ukuran);
   case 'radiobutton27',  se=strel('octagon',jarak);
end

I = getimage(handles.axes8);
ed = imdilate(I,se)-I;

axes(handles.axes14)
imshow(ed);title('Hasil Deteksi Tepi');

I2=getimage(handles.axes1);
[M N]=size(I2);

%menghitung MSE
%MSE_1 terhadap elemet penstruktur square
se=strel('square',dimensi);
ed = imdilate(I,se)-I;
H = fspecial('average');
I2 = imfilter(I2,H,'replicate');
ed2=edge(I2,'canny');
error=double(ed2) - double(ed)
MSE_1=sum(sum(error.* error)) / (M*N)

%MSE_2 terhadap elemet penstruktur line
se=strel('line',panjang,derajat);
ed = imdilate(I,se)-I;
H = fspecial('average');
I2 = imfilter(I2,H,'replicate');
ed2=edge(I2,'canny');
error=double(ed2) - double(ed);
MSE_2=sum(sum(error.*error))/(M*N)

%MSE_3 terhadap elemet penstruktur disk
se=strel('disk',radius1);
ed = imdilate(I,se)-I;
H = fspecial('average');
I2 = imfilter(I2,H,'replicate');
ed2=edge(I2,'canny');
error=double(ed2) - double(ed);
MSE_3=sum(sum(error.*error))/(M*N)

%MSE_4 terhadap elemet penstruktur ball
se=strel('ball',radius2,tinggi);
ed = imdilate(I,se)-I;
H = fspecial('average');
I2 = imfilter(I2,H,'replicate');
ed2=edge(I2,'canny');
figure
imshow(ed2)
error=double(ed) - double(ed2);
MSE_4=sum(sum(error.*error))/(M*N)


%MSE_5 terhadap elemet penstruktur diamon
se=strel('diamond',ukuran);
ed = imdilate(I,se)-I;
H = fspecial('average');
I2 = imfilter(I2,H,'replicate');
ed2=edge(I2,'canny');
error=double(ed2) - double(ed);
MSE_5=sum(sum(error.*error))/(M*N)

%MSE_6 terhadap elemet penstruktur octagon
se=strel('octagon',jarak);
ed = imdilate(I,se)-I;
H = fspecial('average');
I2 = imfilter(I2,H,'replicate');
ed2=edge(I2,'canny');
error=double(ed) - double(ed2);
MSE_6=sum(sum(error.*error))/(M*N)

MSE=[MSE_1 MSE_2 MSE_3 MSE_4 MSE_5 MSE_6];
save mse.mat MSE;


Analisis Harmonik Berbasis Transformasi Wavelet Diskret


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.












KODE SUMBER SALAH SATU EVENT CALLBACK:


function pushbutton9_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton9 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
cla(handles.sumbu2,'reset');
cla(handles.sumbu3,'reset');
% Membaca parameter global
banyakCuplik = str2num(get(handles.editCuplik,'String'));
ambangBatas = str2num(get(handles.editLevelD,'String'));
levelMaks = str2num(get(handles.editLevelK,'String'));
Fs2 = str2num(get(handles.editFrekCuplik,'String'));
levelD = str2num(get(handles.editLevelD,'String'));

frekFundamental = str2num(get(handles.editfrekFundamental,'String'));
subTransien = str2num(get(handles.editTransien,'String'));
ampFundamental = str2num(get(handles.editampFundamental,'String'));
posisiSubtransien = str2num(get(handles.editposisiSubtransien,'String'));

level_kontinyu=levelMaks;
thr=ambangBatas;
n=banyakCuplik;

%Posisi subtransien dikonversi menjadi cuplik
posisiSubtransien = round((Fs2) * posisiSubtransien);

%Simpan n dan Fs2 dan levelD
save n.mat n;
save Fs2.mat Fs2;
save levelD.mat levelD;

% Membaca frekuensi-frekuensi harmonisa dan amplitudo
frek100 = str2num(get(handles.edit100,'String'));
frek150 = str2num(get(handles.edit150,'String'));
frek200 = str2num(get(handles.edit200,'String'));
frek250 = str2num(get(handles.edit250,'String'));
 
amp100 = str2num(get(handles.edit101,'String'));
amp150 = str2num(get(handles.edit151,'String'));
amp200 = str2num(get(handles.edit201,'String'));
amp250 = str2num(get(handles.edit251,'String'));
 
% Membaca frekuensi-frekuensi inter-harmonisa dan amplitudo
frek25 = str2num(get(handles.edit25,'String'));
frek75 = str2num(get(handles.edit75,'String'));
frek125 = str2num(get(handles.edit125,'String'));
frek175 = str2num(get(handles.edit175,'String'));
 
amp25 = str2num(get(handles.edit2511,'String'));
amp75 = str2num(get(handles.edit751,'String'));
amp125 = str2num(get(handles.edit1251,'String'));
amp175 = str2num(get(handles.edit1751,'String'));


% Sinyal komposit
% Frekuensi harmonisa dan subtransien
y = ampFundamental*sin(2*frekFundamental.*linspace(0,pi,n))+ amp100* sin(2*frek100.*linspace(0,pi,n))+...
    amp150*sin(2*frek150.*linspace(0,pi,n))+ amp200*sin(2*frek200.*linspace(0,pi,n))+...
    amp250*sin(2*frek250.*linspace(0,pi,n));% + 0.25.*rand(1,n);
y = [y(1:posisiSubtransien-1) subTransien y(posisiSubtransien+1:n)];


%Simpan y dan level_kontinyu
save y1.mat y;
save level_kontinyu.mat level_kontinyu;

% Menampis sinyal komposit
axes(handles.sumbu1);
plot((n/Fs2)*(0:1/n:1-1/n),y, 'y','LineWidth',2); 
grid on
set(gca, 'XColor', 'r')
set(gca, 'YColor', 'r')
xlabel('Detik');ylabel('Amplitudo');
title('Sinyal Harmonik Dengan Gelombang Subtransien')
set(gca,'Color',[0 0 0]);

% Melakukan transformasi wavelet diskrit dengan jenis wavelet sym2.
level_maks = levelD;
[c,l] = wavedec(y,level_maks,'sym2');
lv = length(y);
 
% Mengekspansi koefisien-koefisien wavelet diskrit untuk ditampilkan.
cfd = zeros(level_maks,lv);
for k = 1:level_maks
d = detcoef(c,l,k);
d = d(ones(1,2^k),:);
cfd(k,:) = wkeep(d(:)',lv);
end
cfd = cfd(:);
I = find(abs(cfd)<sqrt(eps));
cfd(I)=zeros(size(I));
cfd = abs(reshape(cfd,level_maks,lv));
save cfd1.mat cfd;
 
% Menampilkan koefisien-koefisien diskrit
axes(handles.sumbu2), colormap(pink(64));
img = image(flipud(wcodemat(cfd,64,'row')));
set(get(img,'parent'),'YtickLabels',[]);
grid on
set(gca, 'XColor', 'r')
set(gca, 'YColor', 'r')
title('Koefisien Absolut dari Transformasi Wavelet Diskrit.')
ylabel('Frekuensi')
set(gca,'XTick',[0 0.1*n 0.2*n 0.3*n 0.4*n 0.5*n 0.6*n 0.7*n 0.8*n 0.9*n 1*n] );
set(gca,'XTickLabel',(n/Fs2)*[0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1] );

set(gca,'YTick',levelD*[0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1] );
set(gca,'YTickLabel',(Fs2/2)*[1 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0] );
 
% Melakukan transformasi wavelet kontinyu dengan sym2 pada semua
% skala integer dari 1 sampai level_kontinyu.
axes(handles.sumbu3),
ccf1 = abs(cwt(y,1:0.5*Fs2/level_kontinyu:0.5*Fs2,'sym2','plot','scalCNT'));
%axis off
set(gca,'XTick',[0 0.1*n 0.2*n 0.3*n 0.4*n 0.5*n 0.6*n 0.7*n 0.8*n 0.9*n 1*n] );
set(gca,'XTickLabel',(n/Fs2)*[0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1] );
grid on
set(gca, 'XColor', 'r')
set(gca, 'YColor', 'r')
%axis([50 100 axislims(3) axislims(4)]);
title('Koefisien Absolut dari Transformasi Wavelet Kontinyu.')
colormap(pink(64));
ylabel('Frekuensi')
xlabel('Waktu(Detik)');

%Menyimpan koefisien-koefisien wavelet kontinyu
save ccf1.mat ccf1;

set(handles.teks_jumlah_data,'String',num2str(n)); 
set(handles.teks_jumlah_level,'String',num2str(level_kontinyu));
set(handles.teks_levelD,'String',num2str(levelD));
set(handles.FrekCuplik,'String',num2str(Fs2));

%Menampilkan figure baru
figure, 
colormap(pink(64));
img = image(flipud(wcodemat(cfd,64,'row')));
set(get(img,'parent'),'YtickLabels',[]);
grid on
set(gca, 'XColor', 'r')
set(gca, 'YColor', 'r')
title('Koefisien Absolut dari Transformasi Wavelet Diskrit.')
ylabel('Frekuensi')
set(gca,'XTick',[0 0.1*n 0.2*n 0.3*n 0.4*n 0.5*n 0.6*n 0.7*n 0.8*n 0.9*n 1*n] );
set(gca,'XTickLabel',(n/Fs2)*[0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1] );
set(gca,'YTick',levelD*[0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1] );
set(gca,'YTickLabel',(Fs2/2)*[1 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0] );


figure,
ccf = cwt(y,1:0.5*Fs2/level_kontinyu:0.5*Fs2,'sym2','plot','scalCNT');
grid on
set(gca, 'XColor', 'r')
set(gca, 'YColor', 'r')
%axis off
set(gca,'XTick',[0 0.1*n 0.2*n 0.3*n 0.4*n 0.5*n 0.6*n 0.7*n 0.8*n 0.9*n 1*n] );
set(gca,'XTickLabel',(n/Fs2)*[0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1] );

%axis([50 100 axislims(3) axislims(4)]);
title('Koefisien Absolut dari Transformasi Wavelet Kontinyu.')
colormap(pink(64));
ylabel('Frekuensi')
xlabel('Waktu(Detik)');


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



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.














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.