Implementasi Steganografi Modified Least Significant Bit (MLSB) Untuk Enkripsi Pesan Pada Citra Dengan Algoritma Triple Transposition Vigenere Cipher
77
Lampiran 1. Fungsi Menu Utama
function varargout = menu_utm(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name',
mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn',
@menu_utm_OpeningFcn, ...
'gui_OutputFcn',
@menu_utm_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback',
[]);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State,
varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
function menu_utm_OpeningFcn(hObject, eventdata,
handles, varargin)
handles.output = hObject;
movegui(gcf, 'center');
guidata(hObject, handles);
function varargout = menu_utm_OutputFcn(hObject,
eventdata, handles)
varargout{1} = handles.output;
function btnProsesPenyisipan_Callback(hObject,
eventdata, handles)
figure(prosesPenyisipan);
function btnProsesEkstraksi_Callback(hObject,
eventdata, handles)
figure(prosesEkstraksi);
function btnHitungMSE_Callback(hObject, eventdata,
handles)
Universitas Sumatera Utara
78
figure (hitungMSE);
function btnHitungMSE_CreateFcn(hObject, eventdata,
handles)
function btnKeluar_Callback(hObject, eventdata,
handles)
close all;
Universitas Sumatera Utara
79
Lampiran 2. Fungsi Enkripsi dan Encoding
function varargout = prosesPenyisipan(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name',
mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn',
@prosesPenyisipan_OpeningFcn, ...
'gui_OutputFcn',
@prosesPenyisipan_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback',
[]);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State,
varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
function prosesPenyisipan_OpeningFcn(hObject,
eventdata, handles, varargin)
handles.output = hObject;
guidata(hObject, handles);
btnClear_Callback(handles)
function varargout =
prosesPenyisipan_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
function btnClear_Callback(handles)
axes(handles.picCitraCover);
cla(gca, 'reset');
set(gca,'XTick',[],'YTick',[]);
axes(handles.picCitraStego);
cla(gca, 'reset');
set(gca,'XTick',[],'YTick',[]);
set(handles.txtPesanRahasia,'String','');
set(handles.txtKataKunciPertama,'String','');
Universitas Sumatera Utara
80
set(handles.txtKataKunciKedua,'String','');
set(handles.txtKataKunciKetiga,'String','');
set(handles.lblNamaFile,'String','');
clearvars -global;
function btnPilihCitraCover_Callback(hObject,
eventdata, handles)
[fileGambar, folderGambar] =
uigetfile('*.pgm;*.png;*.tif;*.bmp','Pilih Citra
Cover');
if isequal(fileGambar,0)
return;
end
axes(handles.picCitraStego);
cla(gca, 'reset');
set(gca,'XTick',[],'YTick',[]);
global gmbInput namaFile
pathGambar = [folderGambar fileGambar];
axes(handles.picCitraCover)
cla(gca, 'reset');
imshow(pathGambar);
drawnow;
tmpImg = imread(pathGambar);
gmbInput = tmpImg;
set(handles.lblNamaFile,'String',fileGambar(1:length(fi
leGambar)-4));
namaFile = fileGambar;
function txtPesanRahasia_Callback(hObject, eventdata,
handles)
function txtPesanRahasia_CreateFcn(hObject, eventdata,
handles)
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
Universitas Sumatera Utara
81
function txtKataKunciPertama_Callback(hObject,
eventdata, handles)
function txtKataKunciPertama_CreateFcn(hObject,
eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function txtKataKunciKedua_Callback(hObject, eventdata,
handles)
function txtKataKunciKedua_CreateFcn(hObject,
eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function txtKataKunciKetiga_Callback(hObject,
eventdata, handles)
function txtKataKunciKetiga_CreateFcn(hObject,
eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function btnProsesPenyisipan_Callback(hObject,
eventdata, handles)
global gmbInput gmbOutput
if (isempty(gmbInput))
message = sprintf('Pilih citra cover terlebih
dahulu!');
uiwait(msgbox(message));
return
end
if (isempty(get(handles.txtPesanRahasia,'String')))
message = sprintf('Masukkan pesan rahasia!');
uiwait(msgbox(message));
return
Universitas Sumatera Utara
82
end
if (isempty(get(handles.txtKataKunciPertama,'String')))
message = sprintf('Masukkan kata kunci pertama!');
uiwait(msgbox(message));
return
end
if (isempty(get(handles.txtKataKunciKedua,'String')))
message = sprintf('Masukkan kata kunci kedua!');
uiwait(msgbox(message));
return
end
if (isempty(get(handles.txtKataKunciKetiga,'String')))
message = sprintf('Masukkan kata kunci ketiga!');
uiwait(msgbox(message));
return
end
filterGmbInput = gmbInput;
filterGmbInput(filterGmbInput
bin2dec('00011110');
filterGmbInput(filterGmbInput
bin2dec('00111110');
filterGmbInput(filterGmbInput
bin2dec('01111110');
filterGmbInput(filterGmbInput
bin2dec('11111110');
== bin2dec('00011111')) =
== bin2dec('00111111')) =
== bin2dec('01111111')) =
== bin2dec('11111111')) =
[gmbOutput] = MLSB(true, filterGmbInput,
get(handles.txtPesanRahasia,'String'), ...
get(handles.txtKataKunciPertama,'String'), ...
get(handles.txtKataKunciKedua,'String'), ...
get(handles.txtKataKunciKetiga,'String'));
if ~isempty(gmbOutput)
axes(handles.picCitraStego)
cla(gca, 'reset');
imshow(gmbOutput);
drawnow;
message = sprintf('Proses Penyisipan Berhasil');
uiwait(msgbox(message));
end
function btnSimpanCitraStego_Callback(hObject,
eventdata, handles)
Universitas Sumatera Utara
83
global namaFile gmbOutput
if (isempty(gmbOutput))
message = sprintf('Lakukan proses penyisipan
terlebih dahulu!');
uiwait(msgbox(message));
return
end
nama = namaFile(1:strfind(namaFile, '.')-1);
ekstensi = namaFile(strfind(namaFile, '.'):end);
[fileGambar, folderGambar] = uiputfile([nama '_Stego'
ekstensi],'Save file name');
if ~isequal(fileGambar, 0)
pathGambar = [folderGambar fileGambar];
imwrite(gmbOutput, pathGambar);
end
Universitas Sumatera Utara
84
Lampiran 3. Fungsi Decoding dan Dekripsi
function varargout = prosesEkstraksi(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name',
mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn',
@prosesEkstraksi_OpeningFcn, ...
'gui_OutputFcn',
@prosesEkstraksi_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback',
[]);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State,
varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
function prosesEkstraksi_OpeningFcn(hObject, eventdata,
handles, varargin)
handles.output = hObject;
guidata(hObject, handles);
btnClear_Callback(handles)
function varargout = prosesEkstraksi_OutputFcn(hObject,
eventdata, handles)
varargout{1} = handles.output;
function btnClear_Callback(handles)
axes(handles.picCitraStego);
cla(gca, 'reset');
set(gca,'XTick',[],'YTick',[]);
set(handles.txtKataKunciPertama,'String','');
set(handles.txtKataKunciKedua,'String','');
set(handles.txtKataKunciKetiga,'String','');
set(handles.lblNamaFile,'String','');
set(handles.txtPesanRahasia,'String','');
Universitas Sumatera Utara
85
clearvars -global;
function btnCitraStego_Callback(hObject, eventdata,
handles)
[fileGambar, folderGambar] =
uigetfile('*.pgm;*.png;*.tif;*.bmp','Pilih Citra
Stego');
if isequal(fileGambar,0)
return;
end
set(handles.txtPesanRahasia,'String','');
global gmbInput namaFile
pathGambar = [folderGambar fileGambar];
axes(handles.picCitraStego)
cla(gca, 'reset');
imshow(pathGambar);
drawnow;
tmpImg = imread(pathGambar);
gmbInput = tmpImg;
set(handles.lblNamaFile,'String',fileGambar(1:length(fi
leGambar)-4));
namaFile = fileGambar;
function txtKataKunciPertama_Callback(hObject,
eventdata, handles)
function txtKataKunciPertama_CreateFcn(hObject,
eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function txtKataKunciKedua_Callback(hObject, eventdata,
handles)
function txtKataKunciKedua_CreateFcn(hObject,
eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
Universitas Sumatera Utara
86
set(hObject,'BackgroundColor','white');
end
function txtKataKunciKetiga_Callback(hObject,
eventdata, handles)
function txtKataKunciKetiga_CreateFcn(hObject,
eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function txtPesanRahasia_Callback(hObject, eventdata,
handles)
function txtPesanRahasia_CreateFcn(hObject, eventdata,
handles)
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function btnProsesEkstraksi_Callback(hObject,
eventdata, handles)
global gmbInput
if (isempty(gmbInput))
message = sprintf('Pilih citra stego terlebih
dahulu!');
uiwait(msgbox(message));
return
end
if (isempty(get(handles.txtKataKunciPertama,'String')))
message = sprintf('Masukkan kata kunci pertama!');
uiwait(msgbox(message));
return
end
if (isempty(get(handles.txtKataKunciKedua,'String')))
message = sprintf('Masukkan kata kunci kedua!');
uiwait(msgbox(message));
return
end
if (isempty(get(handles.txtKataKunciKetiga,'String')))
Universitas Sumatera Utara
87
message = sprintf('Masukkan kata kunci ketiga!');
uiwait(msgbox(message));
return
end
[pesan] = MLSB(false, gmbInput, '', ...
get(handles.txtKataKunciPertama,'String'), ...
get(handles.txtKataKunciKedua,'String'), ...
get(handles.txtKataKunciKetiga,'String'));
if ~isempty(pesan)
%Tampilkan pada layar
set(handles.txtPesanRahasia,'String',pesan);
message = sprintf('Proses Ekstraksi Berhasil');
uiwait(msgbox(message));
end
Universitas Sumatera Utara
88
Lampiran 4. Fungsi Means Square Error (MSE)
function varargout = hitungMSE(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name',
mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn',
@hitungMSE_OpeningFcn, ...
'gui_OutputFcn',
@hitungMSE_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback',
[]);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State,
varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
function hitungMSE_OpeningFcn(hObject, eventdata,
handles, varargin)
guidata(hObject, handles);
btnClear_Callback(handles)
function varargout = hitungMSE_OutputFcn(hObject,
eventdata, handles)
varargout{1} = handles.output;
function btnClear_Callback(handles)
axes(handles.picCitraCover);
cla(gca, 'reset');
set(gca,'XTick',[],'YTick',[]);
axes(handles.picCitraStego);
cla(gca, 'reset');
set(gca,'XTick',[],'YTick',[]);
set(handles.lblNamaFileCitraCover,'String','');
set(handles.lblNamaFileCitraStego,'String','');
set(handles.lblMSE,'String','');
clearvars -global;
Universitas Sumatera Utara
89
function btnPilihCitraCover_Callback(hObject,
eventdata, handles)
[fileGambar, folderGambar] =
uigetfile('*.jpg;*.pgm;*.png;*.tif;*.bmp','Pilih Citra
Cover');
if isequal(fileGambar,0)
return;
end
global gmbInput
pathGambar = [folderGambar fileGambar];
axes(handles.picCitraCover)
cla(gca, 'reset');
imshow(pathGambar);
drawnow;
tmpImg = imread(pathGambar);
gmbInput = tmpImg;
set(handles.lblNamaFileCitraCover,'String',fileGambar(1
:length(fileGambar)-4));
function btnPilihCitraStego_Callback(hObject,
eventdata, handles)
[fileGambar, folderGambar] =
uigetfile('*.jpg;*.pgm;*.png;*.tif;*.bmp','Pilih Citra
Cover');
if isequal(fileGambar,0)
return;
end
global gmbOutput
pathGambar = [folderGambar fileGambar];
axes(handles.picCitraStego)
cla(gca, 'reset');
imshow(pathGambar);
drawnow;
tmpImg = imread(pathGambar);
gmbOutput = tmpImg;
%Tampilkan nama file
Universitas Sumatera Utara
90
set(handles.lblNamaFileCitraStego,'String',fileGambar(1
:length(fileGambar)-4));
function btnHitungMSE_Callback(hObject, eventdata,
handles)
global gmbInput gmbOutput
if (isempty(gmbInput))
message = sprintf('Pilih citra cover terlebih
dahulu!');
uiwait(msgbox(message));
return
end
if (isempty(gmbOutput))
message = sprintf('Pilih citra stego terlebih
dahulu!');
uiwait(msgbox(message));
return
end
if length(size(gmbInput)) ~= length(size(gmbOutput))
message = sprintf('Ukuran citra tidak sama!');
uiwait(msgbox(message));
return
end
for i = 1 : length(size(gmbInput))
if size(gmbInput, i) ~= size(gmbOutput, i)
message = sprintf('Ukuran citra tidak sama!');
uiwait(msgbox(message));
return
end
end
for i = 1 : length(size(gmbInput))
tmpMSE = norm(double(gmbInput(:,:,i) gmbOutput(:,:,i)));
mse = mse + (tmpMSE / (size(gmbInput, 1) *
size(gmbInput, 2)));
end
set(handles.lblMSE,'String',['MSE = ' num2str(mse)]);
Universitas Sumatera Utara
Lampiran 1. Fungsi Menu Utama
function varargout = menu_utm(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name',
mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn',
@menu_utm_OpeningFcn, ...
'gui_OutputFcn',
@menu_utm_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback',
[]);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State,
varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
function menu_utm_OpeningFcn(hObject, eventdata,
handles, varargin)
handles.output = hObject;
movegui(gcf, 'center');
guidata(hObject, handles);
function varargout = menu_utm_OutputFcn(hObject,
eventdata, handles)
varargout{1} = handles.output;
function btnProsesPenyisipan_Callback(hObject,
eventdata, handles)
figure(prosesPenyisipan);
function btnProsesEkstraksi_Callback(hObject,
eventdata, handles)
figure(prosesEkstraksi);
function btnHitungMSE_Callback(hObject, eventdata,
handles)
Universitas Sumatera Utara
78
figure (hitungMSE);
function btnHitungMSE_CreateFcn(hObject, eventdata,
handles)
function btnKeluar_Callback(hObject, eventdata,
handles)
close all;
Universitas Sumatera Utara
79
Lampiran 2. Fungsi Enkripsi dan Encoding
function varargout = prosesPenyisipan(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name',
mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn',
@prosesPenyisipan_OpeningFcn, ...
'gui_OutputFcn',
@prosesPenyisipan_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback',
[]);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State,
varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
function prosesPenyisipan_OpeningFcn(hObject,
eventdata, handles, varargin)
handles.output = hObject;
guidata(hObject, handles);
btnClear_Callback(handles)
function varargout =
prosesPenyisipan_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
function btnClear_Callback(handles)
axes(handles.picCitraCover);
cla(gca, 'reset');
set(gca,'XTick',[],'YTick',[]);
axes(handles.picCitraStego);
cla(gca, 'reset');
set(gca,'XTick',[],'YTick',[]);
set(handles.txtPesanRahasia,'String','');
set(handles.txtKataKunciPertama,'String','');
Universitas Sumatera Utara
80
set(handles.txtKataKunciKedua,'String','');
set(handles.txtKataKunciKetiga,'String','');
set(handles.lblNamaFile,'String','');
clearvars -global;
function btnPilihCitraCover_Callback(hObject,
eventdata, handles)
[fileGambar, folderGambar] =
uigetfile('*.pgm;*.png;*.tif;*.bmp','Pilih Citra
Cover');
if isequal(fileGambar,0)
return;
end
axes(handles.picCitraStego);
cla(gca, 'reset');
set(gca,'XTick',[],'YTick',[]);
global gmbInput namaFile
pathGambar = [folderGambar fileGambar];
axes(handles.picCitraCover)
cla(gca, 'reset');
imshow(pathGambar);
drawnow;
tmpImg = imread(pathGambar);
gmbInput = tmpImg;
set(handles.lblNamaFile,'String',fileGambar(1:length(fi
leGambar)-4));
namaFile = fileGambar;
function txtPesanRahasia_Callback(hObject, eventdata,
handles)
function txtPesanRahasia_CreateFcn(hObject, eventdata,
handles)
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
Universitas Sumatera Utara
81
function txtKataKunciPertama_Callback(hObject,
eventdata, handles)
function txtKataKunciPertama_CreateFcn(hObject,
eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function txtKataKunciKedua_Callback(hObject, eventdata,
handles)
function txtKataKunciKedua_CreateFcn(hObject,
eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function txtKataKunciKetiga_Callback(hObject,
eventdata, handles)
function txtKataKunciKetiga_CreateFcn(hObject,
eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function btnProsesPenyisipan_Callback(hObject,
eventdata, handles)
global gmbInput gmbOutput
if (isempty(gmbInput))
message = sprintf('Pilih citra cover terlebih
dahulu!');
uiwait(msgbox(message));
return
end
if (isempty(get(handles.txtPesanRahasia,'String')))
message = sprintf('Masukkan pesan rahasia!');
uiwait(msgbox(message));
return
Universitas Sumatera Utara
82
end
if (isempty(get(handles.txtKataKunciPertama,'String')))
message = sprintf('Masukkan kata kunci pertama!');
uiwait(msgbox(message));
return
end
if (isempty(get(handles.txtKataKunciKedua,'String')))
message = sprintf('Masukkan kata kunci kedua!');
uiwait(msgbox(message));
return
end
if (isempty(get(handles.txtKataKunciKetiga,'String')))
message = sprintf('Masukkan kata kunci ketiga!');
uiwait(msgbox(message));
return
end
filterGmbInput = gmbInput;
filterGmbInput(filterGmbInput
bin2dec('00011110');
filterGmbInput(filterGmbInput
bin2dec('00111110');
filterGmbInput(filterGmbInput
bin2dec('01111110');
filterGmbInput(filterGmbInput
bin2dec('11111110');
== bin2dec('00011111')) =
== bin2dec('00111111')) =
== bin2dec('01111111')) =
== bin2dec('11111111')) =
[gmbOutput] = MLSB(true, filterGmbInput,
get(handles.txtPesanRahasia,'String'), ...
get(handles.txtKataKunciPertama,'String'), ...
get(handles.txtKataKunciKedua,'String'), ...
get(handles.txtKataKunciKetiga,'String'));
if ~isempty(gmbOutput)
axes(handles.picCitraStego)
cla(gca, 'reset');
imshow(gmbOutput);
drawnow;
message = sprintf('Proses Penyisipan Berhasil');
uiwait(msgbox(message));
end
function btnSimpanCitraStego_Callback(hObject,
eventdata, handles)
Universitas Sumatera Utara
83
global namaFile gmbOutput
if (isempty(gmbOutput))
message = sprintf('Lakukan proses penyisipan
terlebih dahulu!');
uiwait(msgbox(message));
return
end
nama = namaFile(1:strfind(namaFile, '.')-1);
ekstensi = namaFile(strfind(namaFile, '.'):end);
[fileGambar, folderGambar] = uiputfile([nama '_Stego'
ekstensi],'Save file name');
if ~isequal(fileGambar, 0)
pathGambar = [folderGambar fileGambar];
imwrite(gmbOutput, pathGambar);
end
Universitas Sumatera Utara
84
Lampiran 3. Fungsi Decoding dan Dekripsi
function varargout = prosesEkstraksi(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name',
mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn',
@prosesEkstraksi_OpeningFcn, ...
'gui_OutputFcn',
@prosesEkstraksi_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback',
[]);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State,
varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
function prosesEkstraksi_OpeningFcn(hObject, eventdata,
handles, varargin)
handles.output = hObject;
guidata(hObject, handles);
btnClear_Callback(handles)
function varargout = prosesEkstraksi_OutputFcn(hObject,
eventdata, handles)
varargout{1} = handles.output;
function btnClear_Callback(handles)
axes(handles.picCitraStego);
cla(gca, 'reset');
set(gca,'XTick',[],'YTick',[]);
set(handles.txtKataKunciPertama,'String','');
set(handles.txtKataKunciKedua,'String','');
set(handles.txtKataKunciKetiga,'String','');
set(handles.lblNamaFile,'String','');
set(handles.txtPesanRahasia,'String','');
Universitas Sumatera Utara
85
clearvars -global;
function btnCitraStego_Callback(hObject, eventdata,
handles)
[fileGambar, folderGambar] =
uigetfile('*.pgm;*.png;*.tif;*.bmp','Pilih Citra
Stego');
if isequal(fileGambar,0)
return;
end
set(handles.txtPesanRahasia,'String','');
global gmbInput namaFile
pathGambar = [folderGambar fileGambar];
axes(handles.picCitraStego)
cla(gca, 'reset');
imshow(pathGambar);
drawnow;
tmpImg = imread(pathGambar);
gmbInput = tmpImg;
set(handles.lblNamaFile,'String',fileGambar(1:length(fi
leGambar)-4));
namaFile = fileGambar;
function txtKataKunciPertama_Callback(hObject,
eventdata, handles)
function txtKataKunciPertama_CreateFcn(hObject,
eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function txtKataKunciKedua_Callback(hObject, eventdata,
handles)
function txtKataKunciKedua_CreateFcn(hObject,
eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
Universitas Sumatera Utara
86
set(hObject,'BackgroundColor','white');
end
function txtKataKunciKetiga_Callback(hObject,
eventdata, handles)
function txtKataKunciKetiga_CreateFcn(hObject,
eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function txtPesanRahasia_Callback(hObject, eventdata,
handles)
function txtPesanRahasia_CreateFcn(hObject, eventdata,
handles)
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function btnProsesEkstraksi_Callback(hObject,
eventdata, handles)
global gmbInput
if (isempty(gmbInput))
message = sprintf('Pilih citra stego terlebih
dahulu!');
uiwait(msgbox(message));
return
end
if (isempty(get(handles.txtKataKunciPertama,'String')))
message = sprintf('Masukkan kata kunci pertama!');
uiwait(msgbox(message));
return
end
if (isempty(get(handles.txtKataKunciKedua,'String')))
message = sprintf('Masukkan kata kunci kedua!');
uiwait(msgbox(message));
return
end
if (isempty(get(handles.txtKataKunciKetiga,'String')))
Universitas Sumatera Utara
87
message = sprintf('Masukkan kata kunci ketiga!');
uiwait(msgbox(message));
return
end
[pesan] = MLSB(false, gmbInput, '', ...
get(handles.txtKataKunciPertama,'String'), ...
get(handles.txtKataKunciKedua,'String'), ...
get(handles.txtKataKunciKetiga,'String'));
if ~isempty(pesan)
%Tampilkan pada layar
set(handles.txtPesanRahasia,'String',pesan);
message = sprintf('Proses Ekstraksi Berhasil');
uiwait(msgbox(message));
end
Universitas Sumatera Utara
88
Lampiran 4. Fungsi Means Square Error (MSE)
function varargout = hitungMSE(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name',
mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn',
@hitungMSE_OpeningFcn, ...
'gui_OutputFcn',
@hitungMSE_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback',
[]);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State,
varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
function hitungMSE_OpeningFcn(hObject, eventdata,
handles, varargin)
guidata(hObject, handles);
btnClear_Callback(handles)
function varargout = hitungMSE_OutputFcn(hObject,
eventdata, handles)
varargout{1} = handles.output;
function btnClear_Callback(handles)
axes(handles.picCitraCover);
cla(gca, 'reset');
set(gca,'XTick',[],'YTick',[]);
axes(handles.picCitraStego);
cla(gca, 'reset');
set(gca,'XTick',[],'YTick',[]);
set(handles.lblNamaFileCitraCover,'String','');
set(handles.lblNamaFileCitraStego,'String','');
set(handles.lblMSE,'String','');
clearvars -global;
Universitas Sumatera Utara
89
function btnPilihCitraCover_Callback(hObject,
eventdata, handles)
[fileGambar, folderGambar] =
uigetfile('*.jpg;*.pgm;*.png;*.tif;*.bmp','Pilih Citra
Cover');
if isequal(fileGambar,0)
return;
end
global gmbInput
pathGambar = [folderGambar fileGambar];
axes(handles.picCitraCover)
cla(gca, 'reset');
imshow(pathGambar);
drawnow;
tmpImg = imread(pathGambar);
gmbInput = tmpImg;
set(handles.lblNamaFileCitraCover,'String',fileGambar(1
:length(fileGambar)-4));
function btnPilihCitraStego_Callback(hObject,
eventdata, handles)
[fileGambar, folderGambar] =
uigetfile('*.jpg;*.pgm;*.png;*.tif;*.bmp','Pilih Citra
Cover');
if isequal(fileGambar,0)
return;
end
global gmbOutput
pathGambar = [folderGambar fileGambar];
axes(handles.picCitraStego)
cla(gca, 'reset');
imshow(pathGambar);
drawnow;
tmpImg = imread(pathGambar);
gmbOutput = tmpImg;
%Tampilkan nama file
Universitas Sumatera Utara
90
set(handles.lblNamaFileCitraStego,'String',fileGambar(1
:length(fileGambar)-4));
function btnHitungMSE_Callback(hObject, eventdata,
handles)
global gmbInput gmbOutput
if (isempty(gmbInput))
message = sprintf('Pilih citra cover terlebih
dahulu!');
uiwait(msgbox(message));
return
end
if (isempty(gmbOutput))
message = sprintf('Pilih citra stego terlebih
dahulu!');
uiwait(msgbox(message));
return
end
if length(size(gmbInput)) ~= length(size(gmbOutput))
message = sprintf('Ukuran citra tidak sama!');
uiwait(msgbox(message));
return
end
for i = 1 : length(size(gmbInput))
if size(gmbInput, i) ~= size(gmbOutput, i)
message = sprintf('Ukuran citra tidak sama!');
uiwait(msgbox(message));
return
end
end
for i = 1 : length(size(gmbInput))
tmpMSE = norm(double(gmbInput(:,:,i) gmbOutput(:,:,i)));
mse = mse + (tmpMSE / (size(gmbInput, 1) *
size(gmbInput, 2)));
end
set(handles.lblMSE,'String',['MSE = ' num2str(mse)]);
Universitas Sumatera Utara