Cara Menghitung Nilai MSE, RMSE, dan PSNR pada Citra Digital


Mean Square Error (MSE), Root Mean Squared Error (RMSE), dan Peak Signal-to-Noise Ratio (PSNR) merupakan contoh parameter yang biasa digunakan sebagai indikator untuk mengukur kemiripan dua buah citra. Parameter tsb sering digunakan untuk membandingkan hasil pengolahan citra dengan citra awal atau citra asli. Persamaan yang digunakan untuk menghitung ketiga paramater tersebut adalah sebagai berikut:

MSE dan RMSE tidak memiliki satuan sedangkan satuan dari PSNR adalah desibel. Semakin mirip kedua citra maka nilai MSE dan RMSE nya semakin mendekati nilai nol. Sedangkan pada PSNR, dua buah citra dikatakan memiliki tingkat kemiripan yang rendah jika nilai PSNR di bawah 30 dB.

Berikut ini merupakan contoh pemrograman GUI matlab untuk menghitung nilai MSE, RMSE, dan PSNR. Ketiga nilai tersebut digunakan untuk menghitung tingkat kemiripan citra yang terkontaminasi derau/noise dengan citra asli dan citra hasil restorasi dengan citra asli. Derau aditif ditambahkan pada citra asli antara lain adalah derau impuls (salt & pepper), derau uniform, derau gaussian, dan derau rayleigh. Sedangkan filter yang digunakan untuk merestorasi citra antara lain adalah filter rata-rata dan filter median masing-masing menggunakan kernel berukuran 3 x 3 dan 5 x 5.

1. Tampilan Menu GUI

2. Buka Citra Grayscale Asli

3. Penambahan Derau Impuls dan filtering menggunakan filter rata-rata 3 x 3

4. Penambahan Derau Impuls dan filtering menggunakan filter median 5 x 5

5. Penambahan Derau Uniform dan filtering menggunakan filter rata-rata 5 x 5

6. Penambahan Derau Gaussian dan filtering menggunakan filter median 3 x 3

7. Penambahan Derau Rayleigh dan filtering menggunakan filter rata-rata 3 x 3

Tampilan source code nya adalah sebagai berikut:


function varargout = restorasi_citra_dengan_parameter(varargin)
% RESTORASI_CITRA_DENGAN_PARAMETER MATLAB code for restorasi_citra_dengan_parameter.fig
%      RESTORASI_CITRA_DENGAN_PARAMETER, by itself, creates a new RESTORASI_CITRA_DENGAN_PARAMETER or raises the existing
%      singleton*.
%
%      H = RESTORASI_CITRA_DENGAN_PARAMETER returns the handle to a new RESTORASI_CITRA_DENGAN_PARAMETER or the handle to
%      the existing singleton*.
%
%      RESTORASI_CITRA_DENGAN_PARAMETER('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in RESTORASI_CITRA_DENGAN_PARAMETER.M with the given input arguments.
%
%      RESTORASI_CITRA_DENGAN_PARAMETER('Property','Value',...) creates a new RESTORASI_CITRA_DENGAN_PARAMETER or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before restorasi_citra_dengan_parameter_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to restorasi_citra_dengan_parameter_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help restorasi_citra_dengan_parameter

% Last Modified by GUIDE v2.5 02-Jun-2017 20:30:35

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
    'gui_Singleton',  gui_Singleton, ...
    'gui_OpeningFcn', @restorasi_citra_dengan_parameter_OpeningFcn, ...
    'gui_OutputFcn',  @restorasi_citra_dengan_parameter_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
% End initialization code - DO NOT EDIT

% --- Executes just before restorasi_citra_dengan_parameter is made visible.
function restorasi_citra_dengan_parameter_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to restorasi_citra_dengan_parameter (see VARARGIN)

% Choose default command line output for restorasi_citra_dengan_parameter
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);
movegui(hObject,'center');

% UIWAIT makes restorasi_citra_dengan_parameter wait for user response (see UIRESUME)
% uiwait(handles.figure1);

% --- Outputs from this function are returned to the command line.
function varargout = restorasi_citra_dengan_parameter_OutputFcn(hObject, eventdata, handles)
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;

% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
try
    [filename,pathname] = uigetfile({'*.*'});

    if ~isequal(filename,0)
        axes(handles.axes1)
        cla reset
        set(gca,'XTick',[])
        set(gca,'YTick',[])

        axes(handles.axes2)
        cla reset
        set(gca,'XTick',[])
        set(gca,'YTick',[])

        axes(handles.axes3)
        cla reset
        set(gca,'XTick',[])
        set(gca,'YTick',[])

        set(handles.edit1,'String','')
        set(handles.edit2,'String','')
        set(handles.edit3,'String','')
        set(handles.edit4,'String','')
        set(handles.edit5,'String','')
        set(handles.edit6,'String','')

        Img = imread(fullfile(pathname,filename));
        axes(handles.axes1)
        imshow(Img)
        title('Citra Grayscale Asli')
        handles.Img = Img;
        guidata(hObject, handles)
    else
        return
    end
catch
end

% --- Executes on selection change in popupmenu1.
function popupmenu1_Callback(hObject, eventdata, handles)
% hObject    handle to popupmenu1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: contents = cellstr(get(hObject,'String')) returns popupmenu1 contents as cell array
%        contents{get(hObject,'Value')} returns selected item from popupmenu1

% --- Executes during object creation, after setting all properties.
function popupmenu1_CreateFcn(hObject, eventdata, handles)
% hObject    handle to popupmenu1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: popupmenu controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

% --- Executes on selection change in popupmenu2.
function popupmenu2_Callback(hObject, eventdata, handles)
% hObject    handle to popupmenu2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: contents = cellstr(get(hObject,'String')) returns popupmenu2 contents as cell array
%        contents{get(hObject,'Value')} returns selected item from popupmenu2

% --- Executes during object creation, after setting all properties.
function popupmenu2_CreateFcn(hObject, eventdata, handles)
% hObject    handle to popupmenu2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: popupmenu controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
try
    Img = handles.Img;
    [row,col,~] = size(Img);

    val1 = get(handles.popupmenu1,'Value');

    switch val1
        case 1
            Img_noise = imnoise(Img,'salt & pepper',0.2);
        case 2
            Img_noise = Img+60*rand(row,col);
        case 3
            Img_noise = Img+10*randn(row,col);
        case 4
            Img_noise = Img+raylrnd(20,row,col);
    end

    axes(handles.axes2)
    imshow(Img_noise)
    title('Citra Terkontaminasi Noise')

    MSE = sum((Img-Img_noise)^2)/(row*col);
    RMSE = sqrt(MSE);
    PSNR = 10*log(256*256/MSE);

    set(handles.edit1,'String',MSE)
    set(handles.edit2,'String',RMSE)
    set(handles.edit3,'String',PSNR)

    val2 = get(handles.popupmenu2,'Value');

    switch val2
        case 1
            Img_filter = imfilter(Img_noise,ones(3)/9);
        case 2
            Img_filter = imfilter(Img_noise,ones(5)/25);
        case 3
            Img_filter = medfilt(Img_noise,[3 3]);
        case 4
            Img_filter = medfilt(Img_noise,[5 5]);
    end

    axes(handles.axes3)
    imshow(Img_filter)
    title('Citra Hasil Restorasi')

    MSE = sum((Img-Img_filter)^2)/(row*col);
    RMSE = sqrt(MSE);
    PSNR = 10*log(256*256/MSE);

    set(handles.edit4,'String',MSE)
    set(handles.edit5,'String',RMSE)
    set(handles.edit6,'String',PSNR)
catch
end
function edit4_Callback(hObject, eventdata, handles)
% hObject    handle to edit4 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit4 as text
%        str2double(get(hObject,'String')) returns contents of edit4 as a double

% --- Executes during object creation, after setting all properties.
function edit4_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit4 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

function edit5_Callback(hObject, eventdata, handles)
% hObject    handle to edit5 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit5 as text
%        str2double(get(hObject,'String')) returns contents of edit5 as a double

% --- Executes during object creation, after setting all properties.
function edit5_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit5 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

function edit6_Callback(hObject, eventdata, handles)
% hObject    handle to edit6 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit6 as text
%        str2double(get(hObject,'String')) returns contents of edit6 as a double

% --- Executes during object creation, after setting all properties.
function edit6_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit6 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

function edit1_Callback(hObject, eventdata, handles)
% hObject    handle to edit1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit1 as text
%        str2double(get(hObject,'String')) returns contents of edit1 as a double

% --- Executes during object creation, after setting all properties.
function edit1_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

function edit2_Callback(hObject, eventdata, handles)
% hObject    handle to edit2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit2 as text
%        str2double(get(hObject,'String')) returns contents of edit2 as a double

% --- Executes during object creation, after setting all properties.
function edit2_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

function edit3_Callback(hObject, eventdata, handles)
% hObject    handle to edit3 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit3 as text
%        str2double(get(hObject,'String')) returns contents of edit3 as a double

% --- Executes during object creation, after setting all properties.
function edit3_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit3 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

File source code lengkap beserta citra pada pemrograman di atas dapat diperoleh melalui halaman berikut ini: Source Code

Tutorial mengenai pembuatan App Designer MATLAB untuk restorasi citra digital dapat dilihat pada video berikut ini:

Posted on June 4, 2017, in Pengolahan Citra and tagged , , , , , , , , , , , , , , , , , , , , . Bookmark the permalink. 46 Comments.

  1. Selamat Pagi Bro, Adi Pamungkas
    Salam Sehat selalu, Sukses selalu,

    Terimakasih banyak atas postingan untuk restorasi Citra. Namun setelah saja coba untuk RUN, ada kesalahan : berikut kesalahan tersebut:
    Saya menggunakan Matlab 2014a: Mohon bantuannnya untuk perbaiki error tersebu .

    Makssih banyak salam sukses selalu.

    Salam
    HMS

  2. Berikut error soucecode:

    Error in matlab.hg.internal.openfigLegacy (line 57)
    [fig, savedvisible] = hgload(filename, struct(‘Visible’,’off’));
    Error in gui_mainfcn>local_openfig (line 286)
    gui_hFigure = matlab.hg.internal.openfigLegacy(name, singleton, visible);
    Error in gui_mainfcn (line 158)
    gui_hFigure = local_openfig(gui_State.gui_Name, gui_SingletonOpt, gui_Visible);
    Error in restorasi_citra_dengan_parameter (line 42)
    gui_mainfcn(gui_State, varargin{:});

  3. Selamat pagi Bro Adi Pamungkas

    Bro Adi, Bagaimana menyisipkan watermark pada dua (2) model DWT-SVD, dan hasil dari
    watermarked kemudian di encode dengan QR Code.?

    Mohon bantuannya dan pencerahannya bro Adi,

    Makasih banyak Bro Adi

    salam

    HMS

  4. Selamat pagi Bro Adi Pamungkas

    Bro Adi, Bagaimana menyisipkan watermark pada dua (2) model DWT-SVD, dan hasil dari
    watermarked kemudian di encode dengan QR Code.?

    Ini terkain dengan : Otentikasi Dokument Cetak based on Watermarking Teknik( DWT-SVD..) dan QR Code. agar lebih efesien dan real time.

    Mohon bantuannya dan pencerahannya bro Adi,

    Makasih banyak Bro Adi

    salam

    HMS

  5. Salam mas Adi,
    ini untuk grayscale aja ya, program yg untuk truecolor menghitung mse, rmse, dan psnr ada gk mas di matlab?

  6. mas, kalo MSE dan PSNR untuk citra RGB gimana mas?
    terus MSE dan PSNR bisa digunakan pada dataset video? kalo bisa caranya gimana ya?

    • pada prinsinya cara menghitung MSE dan PSNR pada citra grayscale dan RGB sama saja
      perbedaannya terletak pada jumlah kanal pada citra grayscale ada satu, sedangkan pada citra rgb ada tiga

    • Agus Supriyanto

      berarti (MSE_R+MSE_G+MSE_B)/3 begitu?

    • bisa langsung ditotal MSE nya utk R, G, dan B

    • Agus Supriyanto

      kalau saya mau bandingkan MSE citra hasil dengan MSE citra asli gimana mas?
      cara hitung MSE citra asli bagaimana? adakah referensi

      oh iya sebelumnya, pada penelitian saya.. saya menggunakan dataset video, apakah bisa menggunakan MSE atau mungkin ada metode lain?

      maaf banyak nanya, lagi TA soalnya.. terima kasih sebelumnya

    • Bisa dihitung nilai mse antara citra asli dengan citra hasil pengolahan

    • Agus Supriyanto

      kalo mengukur kecerahan citra gimana mas? saya coba nilai PSNR nya malah mengecil (yang saya baca PSNR itu untuk mengukur seberapa mirip citra hasil dengan citra asli).. maaf kalo bertele-tele

      saya punya penelitian memperbaiki kecerahan video dengan metode MSRCR.. saya mencari metode pengujian untuk mengukur kualitas video hasil saya.. sebelumnya terimakasih banyak atas masukannya

    • MSE dan PSNR merupakan parameter yg dapat digunakan untuk mengukur tingkat kemiripan dua buah citra
      idealnya kita punya citra referensi terlebih dahulu (citra acuan)
      kemudian pengolahan citra dilakukan dengan tujuan untuk menghasilkan citra yang mirip dengan citra referensi

  7. Aldi kurniawan

    assalamu’alaikum mas adi, maaf mengganggu waktu nya… mas adi saya ingin menanyakan rumus MSE… jika kita hitung manual nya…
    untuk rumus MSE itu keterangan nya apa ? dan dapat nya dari mana ya ? terima kasih

  8. assalamualaikum mas, saya ingin menanyan tentang MSE

    [f(i,j)-g(i,j)]^2

    umumnya saya temui pada matlab, coding yang di gunakan adalah :

    (double(f)-double(g))^2

    apakah memang harus menggukan double? dan bisakah di jelaskan kenapa?

    terimakasih atas waktunya

    • waalaikumsalam
      kedalaman bit (bit depth) suatu citra bermacam-macam
      ada yg 8bit, 12bit, 16bit, 24bit, dll
      oleh sebab itu citra harus dikonversi ke dalam kelas double (dengan nilai piksel 0 s.d 1)
      supaya meskipun beragam kelas citra masukan maka hasil perhitungan MSE tidak berubah

  9. asslamualaikum mas
    mau tanya kenapa harus menggunakan noise ?
    kalau misalnya perhitungan dilakukan tanpa noise bisa gak ?
    terima kasih sebelumnya

  10. mas semisal saya ada 3 buah citra
    1. citra murni tanpa ada noise
    2. citra terdapat noise
    3. citra bersih dari noise melalui sistem

    pertanyaan saya untuk mengukur PSNR dan MSE dari keberhasilan sistem saya itu itu menggunakan citra no berapa sama berapa mas?
    kemudian untuk mengukur citra RGB apa harus menghitung masing-masing nilai r, g, dan b?

    trimakasih dan mohon maaf mas.

    • untuk menghitung psnr dan mse dibutuhkan 2 buah citra
      2 buah citra tsb adalah citra yang terdapat noise dengan citra asli
      2 buah citra yg lain adalah citra hasil filtering dengan citra asli
      nilai psnr dan mse dari kedua pasangan citra tersebut dapat dibandingkan

  11. Assalmualaikum mas.

    saya mau tanya kan pnsr,mse untuk mencari perbandingan citra 1 dan 2 .
    yang saya tanyakan bagaimana menentukan nilai pixel dalam suatu citra, soalnya saya disuruh menghitung manual pada nilai pixel citra?
    Terima Kasih

  12. Assalamualaikum mas, maaf mas sebelumnya saya mau nnyk, kalau misalnya citra nya RGB source code MSE sama PSNR nya gmn ya mas? Apakah sama?

  13. assalamualikum mas adi , kalo misalkan mau make MSE PSNRnya aja bagian mana ya yang harus dihilangkan?
    ,terima kasih

  14. Wicaksono Yuli Sulistyo

    Assalamualaikum ,apakah ini bsa digunakan utk mendeteksi citra yang sdh pernah diedit?

  15. Assalamu’alaikum mas..metode apa yg dipakai untuk mendeteksi penyakit pada daun mangga

  16. Pak maaf mau nanya, untuk video untuk menghitung psnr apakah nilai piksel maksimal nya sama saja ya 255?

  17. Pak maaf mau nanya, untuk video untuk menghitung psnr apakah nilai piksel maksimal nya sama saja ya 255?

  18. permisi pak, izin bertanya, kan saya tidak menggunakkan gui, hanya kodingan berupa

    Citra = imread(‘Citra Asli.jpeg’);
    CitraHis =imread (‘Citra Noise.jpeg’);

    [row,col] = size(Citra);

    MSE = sum(sum((Citra-CitraHis).^2))/(row*col)

    tapi kenapa yang muncul ada 3 jenis ya?

    MSE(:,:,1) =

    1.1765

    MSE(:,:,2) =

    0.6431

    MSE(:,:,3) =

    0.9921

    Padahal citra A nya itu warna dan citra B nya sudah Grayscale

  19. klo menentukan SNR dan MSE untuk sinyal bagaimana pak ? liat nya dimana ?

  20. Indah Laksmi

    klo menentukan SNR dan MSE untuk sinyal bagaimana pak ?
    liat nya dimana untuk nilai tersebut?

  21. 100 102 102 102 hitung menggunakan
    100 102 102 104 a.filter rara rata
    102 104 36 104 b.filter batas
    102 104 104 c.filter median

Leave a comment