Minggu, 23 Oktober 2016

Konvolusi dan Penggunaan Fungsi Histeq

Konvolusi (convolution) adalah sebuah proses dimana citra dimanipulasi dengan menggunakan eksternal mask / subwindows untuk menghasilkan citra yang baru. Sedangkan Filtering tanpa menggunakan ekternal mask tetapi hanya menggunakan pixel tetangga untuk mendapatkan pixel yang baru.
Histogram
Histogram adalah representasi grafis untuk distribusi warna dari citra digital. Sumbu ordinat vertikal merupakan representasi piksel dengan nilai tonal dari tiap-tiap deret bin pada sumbu axis horizontalnya. Sumbu axis terdiri dari deret logaritmik bindensitometry yang membentuk rentang luminasi atau exposure range yang mendekati respon spectral sensitivity visual mata manusia. Deret bin pada density yang terpadat mempunyai interval yang relatif sangat linear dengan variabel mid-tone terletak tepat di tengahnya.
Pada umumnya, sebuah histogram hanya memetakan seluruh nilai tonal dari citra digital pada bin luminasi masing-masing. Nilai tonal tersebut telah tersedia dalam color space yang umum digunakan adalah sRGB dan AdobeRGB yang mempunyai nilai gamma γ = 2,2.
Informasi yang didapat dari Histogram:
  • Puncak histogram → intensitas pixel yangpaling menonjol.
  • Lebar puncak → rentang kontras.
  • Over‐exposed (terlalu terang) dan under‐exposed (terlalu gelap) memiliki rentang kontras sempit.
  • Citra yang baik mengisi daerah derejatkeabuan secara penuh dan merata pada setiap nilai intensitas pixel.
 Contoh penggunaan Histeq pada Matlab:
  1. Buka Matlab (saya menggunakan versi R2015a)
  2. Buat script baru , New -> Script (atau Ctrl + N)
  3. Copy dan paste code berikut ini
    im = imread('foto.jpg');
    figure;
    subplot(2,1,1);
    imshow(im);
    subplot(2,1,2);
    imhist(im);
    out = histeq(im, 256); %//or you can use my function: out = hist_eq(im);
    figure;
    subplot(2,1,1);
    imshow(out);
    subplot(2,1,2);
    imhist(out);
  4. Hasilnya seperti ini: 

     Contoh 2 Penggunaan Histeq
    Copy dan paste code berikut ini
    GIm=imread('foto.jpg');
    numofpixels=size(GIm,1)*size(GIm,2);
    figure,imshow(GIm);
    title('Original Image');
    HIm=uint8(zeros(size(GIm,1),size(GIm,2)));
    freq=zeros(256,1);
    probf=zeros(256,1);
    probc=zeros(256,1);
    cum=zeros(256,1);
    output=zeros(256,1);
    %freq counts the occurrence of each pixel value.
    %The probability of each occurrence is calculated by probf.
    for i=1:size(GIm,1)
    for j=1:size(GIm,2)
    value=GIm(i,j);
    freq(value+1)=freq(value+1)+1;
    probf(value+1)=freq(value+1)/numofpixels;
    end
    end
    sum=0;
    no_bins=255;
    %The cumulative distribution probability is calculated.
    for i=1:size(probf)
    sum=sum+freq(i);
    cum(i)=sum;
    probc(i)=cum(i)/numofpixels;
    output(i)=round(probc(i)*no_bins);
    end
    for i=1:size(GIm,1)
    for j=1:size(GIm,2)
    HIm(i,j)=output(GIm(i,j)+1);
    end
    end
    figure,imshow(HIm);
    title('Histogram equalization');
    %The result is shown in the form of a table
    figure('Position',get(0,'screensize'));
    dat=cell(256,6);
    for i=1:256
    dat(i,:)={i,freq(i),probf(i),cum(i),probc(i),output(i)};
    end
    columnname =   {'Bin', 'Histogram', 'Probability', 'Cumulative histogram','CDF','Output'};
    columnformat = {'numeric', 'numeric', 'numeric', 'numeric', 'numeric','numeric'};
    columneditable = [false false false false false false];
    t = uitable('Units','normalized','Position',[0.1 0.1 0.4 0.9], 'Data', dat,'ColumnName', columnname,'ColumnFormat', columnformat,'ColumnEditable', columneditable,'RowName',[]);
    subplot(2,2,2); bar(GIm);
    title('Before Histogram equalization');
    subplot(2,2,4); bar(HIm);
    title('After Histogram equalization');
    Hasilnya



    Terima kasih

Jumat, 14 Oktober 2016

Citra Digital dengan Matlab

Citra digital adalah gambar dua dimensi yang bisa ditampilkan pada layar komputer sebagai himpunan/ diskrit nilai digital yang disebut pixel/ picture elements. Dalam tinjauan matematis, citra merupakan fungsi kontinu dari intensitas cahaya pada bidang dua dimensi. Citra digital adalah citra f(x,y) dimana dilakukan diskritisasi koordinat sampling/ spasial dan diskritisasi tingkat kwantisasi (kabuan/ kecemerlangannya). Citra digital merupakan fungsi intensitas cahaya f(x,y), dimana harga x dan harga y adalah koordinat spasial. Harga fungsi tersebut di setiap titik (x,y) merupakan tingkat kecemerlangan citra pada titik tersebut. 

Citra digital merupakan suatu matriks dimana indeks baris dan kolomnya menyatakan suatu titik pada citra tersebut dan elemen matriksnya (yang disebut sebagai elemen gambar/ pixel/ piksel/ pels/ picture element) menyatakan tingkat keabuan pada titik tersebut. FORMAT CITRA DIGITAL. Matrik yang dinyatakan Citra digital yaitu dengan matriks berukuran N (baris/tinggi) x M (kolom/lebar). N = jumlah baris 0 = y = N – 1. M = jumlah kolom 0 = x = M – 1. L = maksimal warna intensitas 0 = f(x,y) = L – 1. (gray level/ derajat keabuan) 


Citra RGB merupakan citra yang tersusun oleh tiga kanal warna yaitu kanal merah, kanal hijau, dan kanal biru. Pada citra RGB 24-bit, masing-masing kanal warna memiliki nilai intensitas piksel dengan kedalaman bit sebesar 8-bit yang artinya memiliki variasi warna sebanyak 2^8 = 256 derajat warna (0 s.d 255). Setiap piksel pada citra RGB memiliki nilai intensitas yang merupakan kombinasi dari nilai R, G, dan B. Variasi warna pada setiap piksel pada citra RGB adalah sebanyak 256 x 256 x 256 = 16.777.216.

Sedangkan citra grayscale merupakan citra yang hanya memiliki satu kanal warna. Pada citra grayscale 8-bit, setiap piksel memiliki nilai intensitas warna yang memiliki variasi sebanyak 2^8 = 256 derajat warna (0 s.d 255). Nilai intensitas pada citra ini merupakan representasi dari derajat keabuan di mana nilai 0 menyatakan warna hitam sempurna dan nilai 255 menyatakan warna putih sempurna. Nilai intensitas antara 0 s.d 255 merupakan warna abu-abu.

Sama seperti citra grayscale, citra biner juga merupakan citra yang hanya memiliki satu kanal warna. Citra biner memiliki kedalaman bit sebesar 1-bit. Nilai intensitas warna pada setiap piksel citra biner dibagi menjadi 2^1 = 2 warna yaitu warna hitam yang dinyatakan oleh nilai 0 dan warna putih yang dinyatakan oleh nilai 1.

Berikut ini merupakan tutorial cara membuat citra berwarna (RGB) menjadi hitam putih (biner) menggunakan Graphical User Interface  (GUI) MATLAB
Langkah-langkahnya seperti berikut ini:
1. Buka aplikasi Matlab dari  Windows ==> All Programs ==> MATLAB ==> R2009a ==> MATLAB R2009a
 
2. Setelah aplikasinya dibuka akan muncul tampilan seperti ini
 
3. Pilih New ==> grafik User Interface
 
4. Akan muncul tampilan GUIDE Quick Start kemudian pilih Blank GUI (Default) lalu klik OK
5. Akan muncul popup tampilan baru lagi, kemudian pilih bagian icon di sebelah kiri, buat  2 axes, 3 pushbutton, 1 slider, dan 1 edit text
6. Ubah masing-masing properti yang sudah dibuat dengan mengganti nilainya seperti berikut ini

7. Pada Axes setelah di double klik akan muncul tampilan seperti berikut
8. Klik Icon pada xTrick dan hapus semua nilainya yang ada dengan klik angka yang muncul, kemudia klik delete dan setelah selesai klik ok
9. Nilai value pada XTick menjadi kosong, kemudian ulangi hal yang sama pada YTick dan ZTick
10. Pada pushbutton mengganti nilai string dengan double klik iconnya kemudian akan muncul popup baru seperti berikut
11. Ganti nilai String menjadi "Buka Gambar" dan kemudian klik OK.
12. Hasilnya sebagai berikut nilai string sudah berubah. Ulangi hal yang sama pada pushbutton2 dan pushbutton3
13. Pada bagian slider ubah nilainya seperti berikut
14. Setelah semuanya selesai tampilannya akan menjadi seperti ini
15. Klik kanan pada pushbutton ==> PilihView Callbacks ==> Calback

16. Akan muncul tampilan popup untuk save file anda dan masukkan namanya sesuai dengan keinginan kemudian klik Save
17. Akan muncul form baru yang berisi codingan untuk menjalankan program palikasinya
18. Ubah hasil codingannya menjadi berikut ini untuk pushbutton1 (Buka Gambar)


% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
[name_file1,name_path1] = uigetfile( ...
    {'*.bmp;*.jpg;*.tif','Files of type (*.bmp,*.jpg,*.tif)';
    '*.bmp','File Bitmap (*.bmp)';...
    '*.jpg','File jpeg (*.jpg)';
    '*.tif','File Tif (*.tif)';
    '*.*','All Files (*.*)'},...
    'Open Image');

if ~isequal(name_file1,0)
    handles.data1 = imread(fullfile(name_path1,name_file1));
    guidata(hObject,handles);
    axes(handles.axes1);
    imshow(handles.data1);
else
    return;
end
% 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)


19. Ubah hasil codingannya menjadi berikut ini untuk pushbutton1 (Hitam Putih)


% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
image1 = handles.data1;
gray = rgb2gray(image1);
axes(handles.axes2);
imshow(gray);
handles.data2 = gray;
guidata(hObject,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)


20. Ubah hasil codingannya menjadi berikut ini untuk Slider
% --- Executes on slider movement.
function slider1_Callback(hObject, eventdata, handles)
gray = handles.data2;
value = get(handles.slider1,'value');
thresh = imcomplement(im2bw(gray,value/255));
axes(handles.axes2);
imshow(thresh);
handles.data3 = thresh;
guidata(hObject,handles);
set(handles.edit1,'String',value)
% hObject    handle to slider1 (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,'Value') returns position of slider
%        get(hObject,'Min') and get(hObject,'Max') to determine range of slider


21. Ubah hasil codingannya menjadi berikut ini untuk pushbutton3 (Simpan)
% --- Executes on button press in pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles)
thresh = handles.data3;
[name_file_save,path_save] = uiputfile( ...
    {'*.bmp','File Bitmap (*.bmp)';...
    '*.jpg','File jpeg (*.jpg)';
    '*.tif','File Tif (*.tif)';
    '*.*','All Files (*.*)'},...
    'Save Image');
if ~isequal(name_file_save,0)
    imwrite(thresh,fullfile(path_save,name_file_save));
else
    return
end
% hObject    handle to pushbutton3 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)


22. Codingan lengkapnya seperti berikut ini:
function varargout = Tugas1_JokoSantoso(varargin)
% TUGAS1_JOKOSANTOSO MATLAB code for Tugas1_JokoSantoso.fig
%      TUGAS1_JOKOSANTOSO, by itself, creates a new TUGAS1_JOKOSANTOSO or raises the existing
%      singleton*.
%
%      H = TUGAS1_JOKOSANTOSO returns the handle to a new TUGAS1_JOKOSANTOSO or the handle to
%      the existing singleton*.
%
%      TUGAS1_JOKOSANTOSO('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in TUGAS1_JOKOSANTOSO.M with the given input arguments.
%
%      TUGAS1_JOKOSANTOSO('Property','Value',...) creates a new TUGAS1_JOKOSANTOSO or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before Tugas1_JokoSantoso_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to Tugas1_JokoSantoso_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 Tugas1_JokoSantoso

% Last Modified by GUIDE v2.5 15-Oct-2016 10:22:32

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @Tugas1_JokoSantoso_OpeningFcn, ...
                   'gui_OutputFcn',  @Tugas1_JokoSantoso_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 Tugas1_JokoSantoso is made visible.
function Tugas1_JokoSantoso_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 Tugas1_JokoSantoso (see VARARGIN)

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

% Update handles structure
guidata(hObject, handles);

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


% --- Outputs from this function are returned to the command line.
function varargout = Tugas1_JokoSantoso_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)
[name_file1,name_path1] = uigetfile( ...
    {'*.bmp;*.jpg;*.tif','Files of type (*.bmp,*.jpg,*.tif)';
    '*.bmp','File Bitmap (*.bmp)';...
    '*.jpg','File jpeg (*.jpg)';
    '*.tif','File Tif (*.tif)';
    '*.*','All Files (*.*)'},...
    'Open Image');

if ~isequal(name_file1,0)
    handles.data1 = imread(fullfile(name_path1,name_file1));
    guidata(hObject,handles);
    axes(handles.axes1);
    imshow(handles.data1);
else
    return;
end
% 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)


% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
image1 = handles.data1;
gray = rgb2gray(image1);
axes(handles.axes2);
imshow(gray);
handles.data2 = gray;
guidata(hObject,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)


% --- Executes on slider movement.
function slider1_Callback(hObject, eventdata, handles)
gray = handles.data2;
value = get(handles.slider1,'value');
thresh = imcomplement(im2bw(gray,value/255));
axes(handles.axes2);
imshow(thresh);
handles.data3 = thresh;
guidata(hObject,handles);
set(handles.edit1,'String',value)
% hObject    handle to slider1 (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,'Value') returns position of slider
%        get(hObject,'Min') and get(hObject,'Max') to determine range of slider


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

% Hint: slider controls usually have a light gray background.
if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor',[.9 .9 .9]);
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


% --- Executes on button press in pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles)
thresh = handles.data3;
[name_file_save,path_save] = uiputfile( ...
    {'*.bmp','File Bitmap (*.bmp)';...
    '*.jpg','File jpeg (*.jpg)';
    '*.tif','File Tif (*.tif)';
    '*.*','All Files (*.*)'},...
    'Save Image');
if ~isequal(name_file_save,0)
    imwrite(thresh,fullfile(path_save,name_file_save));
else
    return
end
% hObject    handle to pushbutton3 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

 23. Jalankan program yang sudah dibuat dengan klik tombol Run
24. Akan muncul windows baru kemudian klik tombol buka gambar
25. Pilih file gambar yang diinginkan kemudian klik Open
26. Gambar yang dibuka akan muncul, kemudian klik tombol Hitam putih dan akan muncul gambar baru
27. Geser slider untuk mengubah hasil gambarnya kemudian isikan nama file di edit text kemudian klik save untuk menyimpannya
28. Nama file yang sudah dibuat akan muncul di folder tempat anda menyimpan filenya
29. Ketika gambarnya di klik hasilnya akan sama seperti hasil gambar setelah diubah dari gambar aslinya.

Referensi:
http://www.temukanpengertian.com/2013/08/pengertian-citra-digital.html
https://pemrogramanmatlab.wordpress.com/2016/09/30/thresholding_citra/#more-17

Sekian tutorial yang bisa saya buat, semoga bisa bermanfaat untuk kita semuanya.

TERIMA KASIH