×

Pengolahan Citra Digital dengan Matlab – Segmentasi

Pengolahan Citra Digital dengan Matlab – Segmentasi

3,542 Views

Sinopsis

Istilah segmentasi dalam pengolahan citra digital sangat luas tapi secara umum digunakan ada 2 yaitu dengan teknik threshholding dan clustering. Operasi thresholding seperti mengubah warna grayscale menjadi hitam putih dengan cara

  1. Menentukan nilai ambang batas secara statis
  2. Ataupun menggunakan teknik otsu

Sedangkan clustering biasa digunakan untuk format truecolor dengan

  1. teknik clustering dan
  2. semantic.

Teknik clustering pun ada beberapa metode yaitu K-Means Clustering, Fuzzy C Means Clustering, sedangkan teknik semantic melihat kepada korelasi tiap objek yang dilatih menggunakan machine learning dan deep learning.

Ref: https://towardsdatascience.com/detection-and-segmentation-through-convnets-47aa42de27ea

Ref: http://vladlen.info/publications/feature-space-optimization-for-semantic-video-segmentation/

 

Ref: https://www.frontiersin.org/articles/10.3389/fonc.2017.00315/full

Begitu pentingnya teknik segmentasi serta penerapan dalam dunia real seperti (mobil otonom), maka kalian harus mempelajari dasar-dasar segmentasi pengolahan citra digital.  Khusus untuk machine learning/deep learning akan dibuat buku khusus karena selain kalian harus mempelajari dasar-dasar pemrograman kalian juga harus memahami simbol persamaan matematika karena merupakan ilmu terapan dari matrix, statistika.

Segmentasi Statis

Segmentasi Statis yang dimaksud yaitu menggunakan nilai T (ambang batas) yang ditentukan secara manual. Secara umum untuk operasi segmentasi yaitu mengubah grayscale ke hitam putih (binary), pada kode dibawah ini menggunakan nilai T=0.35. Penerapan function nya im2bw() yang merupakan function overloading (terdiri dari banyak input argument).

clc;clear all;close all;
I = imread('D:/gambar.jpg');
if ndims(I)==3
 gray = rgb2gray(I);
else
 gray = I;
end
%untuk menerapkan batas secara manual
T = 0.35; %dalam skala 0 s.d 1 
bw = im2bw(gray,T);

figure
imshow(bw),
hold on
colorbar()
hold offhold off

Variabel bw bertype logical atau terdiri dari angka 1 dan 0, dengan 1=putih dan 0=hitam

whos bw

hasil

Name        Size              Bytes  Class      Attributes

bw        296x399            118104  logical

Kalian bisa cek sendiri yang terlihat dari colorbar yang menginformasikan 0 dan 1. Nilai T=0.35 dalam skala grayscale yaitu T=0.35*255 yaitu

    \[T=89.250\]

Atau dibulatkan dalam type uint8 menjadi T=89

Segmentasi Dinamis Adaptive dan Otsu

Operasi segmentasi statis dirasa kurang efektif karena tidak mempertimbangkan kedinamisan sebuah nilai histogram. Kalian bisa cek distribusi histogram

clc;clear all;close all;
I = imread('D:/gambar.jpg');
if ndims(I)==3
 gray = rgb2gray(I);
else
 gray = I;
end

figure
imhist(gray);
xlabel('Nilai Pixel')
ylabel('Frekuensi/Jumlah Kemunculan')

Dari grafik distribusi histogram diatas akan terlihar nilai peak atau disebut titik global minimum yaitu antara 100 s.d 150. Untuk menentukan nilai T tersebut kalian bisa menggunakan metode Otsu. Otsu, N., “A Threshold Selection Method from Gray-Level Histograms.” IEEE Transactions on Systems, Man, and Cybernetics. Vol. 9, No. 1, 1979, pp. 62–66.

Matlab telah menyedian function untuk perhitungan otsu yaitu graythresh yang secara otomatis akan mengubah truecolor menjadi grayscale yang menghasilkan nilai T ataupun penggunakan function im2bw yang secara otomatis menerapkan metode otsu.

clc;clear all;close all;
I = imread('panoramic.jpg');
T = graythresh(I)
bw = im2bw(I,T); %atau langsung bw=im2bw(I)
 
figure
imshow(bw);
hold on
colorbar();
hold off;

hasil

T =

    0.5059

nilai T diatas dalam skala uint8 yaitu T=0.5059*255

    \[T=129\]

Persis apa yang telah kita jelaskan diatas bahwa nilai T berada di rentang 100\leq129\leq150. Kalian bisa reverse gambar diatas menggunakan tanda \sim atau disebut negasi

clc;clear all;close all;
I = imread('panoramic.jpg');
bw = im2bw(I);
negasi = ~bw;
figure
hold on
subplot(2,1,1),imshow(bw),title('BW'),colorbar();
subplot(2,1,2),imshow(negasi),title('negasi'),colorbar();
hold off;

Semua operasi diatas adalah segmentasi untuk mengubah grayscale menjadi bw (hitam putih), adapun untuk segmentasi objek dalam sebuah gambar merupakan hal yang sangat rumit bagi sebuah komputer, misalkan untuk menemukan  plate number pada sebuah gambar mobil yang diparkir. Kalian bisa mempelajari teknik haar cascade classifier disini

Operasi Blob / Labeling

Operasi labeling atau disebut blob bekerja dalam format binary alias hitam putih bukan format grayscale yaitu untuk memberi tanda/menghitung sebuah objek melalui nilai ketetanggaan. Misalkan kalian mempunyai objek sebagai berikut

clc;clear all;close all;
BW = logical([1 1 1 0 0 0 0 0
              1 1 1 0 1 1 0 0
              1 1 1 0 1 1 0 0
              0 0 0 0 0 0 1 0
              0 0 0 0 0 0 1 0
              1 1 1 0 0 0 1 0
              1 1 1 0 0 1 1 0
              1 1 1 0 0 0 0 0]);
          
imtool(BW);

Dengan menggunakan toolbar inspect pixel values akan tampil lebih jelas seperti dibawah ini

Kalian bisa menghitung jumlah region objek putih? Kalian bisa cek terdapat 4 region objek putih.

Atau kita pakai nilai ketetanggan 8, akan menghasilkan 3 objek saja yaitu

Nah untuk memahami nilai ketetanggan kalian bisa cek disini http://www.softscients.web.id/2018/08/bab-4-operasi-dasar-olah-citra-digital.html (daripada ditulis ulang). Di Matlab kalian bisa menggunakan function bwlabel

clc;clear all;close all;
BW = logical([1 1 1 0 0 0 0 0
              1 1 1 0 1 1 0 0
              1 1 1 0 1 1 0 0
              0 0 0 0 0 0 1 0
              0 0 0 0 0 0 1 0
              1 1 1 0 0 0 1 0
              1 1 1 0 0 1 1 0
              1 1 1 0 0 0 0 0]);
          
tetangga_4 = bwlabel(BW,4)
tetangga_8 = bwlabel(BW,8)

hasil

tetangga_4 =

     1     1     1     0     0     0     0     0
     1     1     1     0     3     3     0     0
     1     1     1     0     3     3     0     0
     0     0     0     0     0     0     4     0
     0     0     0     0     0     0     4     0
     2     2     2     0     0     0     4     0
     2     2     2     0     0     4     4     0
     2     2     2     0     0     0     0     0


tetangga_8 =

     1     1     1     0     0     0     0     0
     1     1     1     0     3     3     0     0
     1     1     1     0     3     3     0     0
     0     0     0     0     0     0     3     0
     0     0     0     0     0     0     3     0
     2     2     2     0     0     0     3     0
     2     2     2     0     0     3     3     0
     2     2     2     0     0     0     0     0

>>

Tentu dalam prakteknya kalian bisa menghitung sebuah objek seperti berikut contohnya

 

clc;clear all;close all;
I = imread('gambar.png');
bw = im2bw(I);
objek = bwlabel(bw,8);
jumlah_objek = max(objek(:));
figure
imshow(bw),title(['Jumlah objek : ' num2str(jumlah_objek)]);

 

Setiap objek diatas mempunyai beberapa informasi yang dapat digali seperti

  1. centroid : menggunakan teknik center of gravity, kalian bisa baca link berikut https://www.softscients.web.id/2018/11/bab-4-moment-invariant.html
  2. Area: luas area dalam satuan pixel
  3. Perimeter : menggunakan teknik edge detection/keliling objek
  4. Ataupun bounding box nya

Dan masih banyak yang lainnya lho, untuk hal tersebut kalian bisa pelajari Measure properties of image regions

Measure properties of image regions Region Properties

Setiap objek binary (hitam putih) dapat kita analisis informasi banyak sekali yaitu

  1. Area (luas)
  2. EulerNumber
  3. Orientation (rotasi sudut, kalian bisa pelajari disini)        
  4. BoundingBox
  5. Extent
  6. Perimeter    (kalian bisa pelajari disini deteksi tepi)
  7. Centroid    (kalian bisa pelajari disini)     
  8. Extrema
  9. PixelIdxList
  10. ConvexArea
  11. FilledArea
  12. PixelList
  13. ConvexHull
  14. FilledImage
  15. Solidity
  16. ConvexImage
  17. Image
  18. SubarrayIdx
  19. Eccentricity
  20. MajorAxisLength
  21. EquivDiameter
  22. MinorAxisLength

Ntar kalian juga paham juga pengertian masing-masing diatas, untuk Measure properties of image regions kalian harus pastikan bahwa image nya dalam bentuk BW/Binary ya. Function yang digunakan yaitu untuk Measure properties of image regions yaitu regionprops.

Kalian ingin mendapatkan informasi objek diatas seperti area,centroid,boundingbox,perimeter. Contoh kodenya seperti berikut

clc;clear all;close all;
I = imread('gambar2.png');
bw = im2bw(I);
region = regionprops(bw,'area','centroid','boundingbox','perimeter',’image’);

Kalian jangan lupa pelajari lagi cara kerja tipe data struct di matlab yaitu dasar dasar pemrograman matlab di https://www.softscients.web.id/2020/01/dasar-dasar-pemrograman-matlab-struct.html karena untuk aksesnya menggunakan cara kerja struct. Misalkan untuk mendapatkan area/luas objek gambar, kalian bisa ketikan berikut

>> region.Area
ans =
       14430
ans =
        6110
ans =
        1361
ans =
       10921

Kalian tentu masih bingung, mana saja objek-objek yang dimaksud, maka kalian bisa tandai dengan centroid yang berfungsi untuk menentukan lokasi tengah objek. Gunakan kode berikut

clc;clear all;close all;
I = imread('gambar2.png');
bw = im2bw(I);
region = regionprops(bw,'area','centroid','boundingbox','perimeter','image');
 
figure
imshow(bw);
hold on;
for i=1:length(region)
    lokasi = region(i).Centroid;
    x = lokasi(1);
    y = lokasi(2);
    text(x,y,num2str(i),'Color','red','FontSize',14);
end
hold off;

Perhatikan objek no 3 dan 4 yang bukan merupakan square, maka boundingbox nya akan terlihat seperti berikut

>> region(3).BoundingBox
ans =
  299.5000  141.5000   51.0000   45.0000
>> region(4).BoundingBox
ans =
  376.5000   31.5000  116.0000  120.0000
>>

Dengan susunan [X,Y, X',Y'], Kode yang digunakan yaitu

clc;clear all;close all;
I = imread('gambar2.png');
bw = im2bw(I);
region = regionprops(bw,'area','centroid','boundingbox','perimeter','image');
 
 
no_objek = 3;
box = region(no_objek).BoundingBox;
lokasi = region(no_objek).Centroid;
x = lokasi(1);
y = lokasi(2);
 
figure
imshow(bw)
hold on;
text(x,y,num2str(no_objek),'Color','red','FontSize',14);
rectangle('Position',box,'Curvature',0.2,'EdgeColor','r','LineWidth',2);
hold off;

Sedangkan untuk menampilkan objek/image tertentu, bisa kalian gunakan Image

imshow(region(3).Image)

Kalian bisa coba sendiri untuk masing-masing properties nya.

You May Have Missed