Pengolahan Citra Digital dengan Matlab – Segmentasi
Sinopsis
Contents
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
- Menentukan nilai ambang batas secara statis
- Ataupun menggunakan teknik otsu
Sedangkan clustering biasa digunakan untuk format truecolor dengan
- teknik clustering dan
- 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 . Penerapan function nya 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 bertype logical atau terdiri dari angka 1 dan 0, dengan dan
whos bw
hasil
Name Size Bytes Class Attributes bw 296x399 118104 logical
Kalian bisa cek sendiri yang terlihat dari yang menginformasikan 0 dan 1. Nilai dalam skala grayscale yaitu yaitu
Atau dibulatkan dalam type menjadi
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 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 yang secara otomatis akan mengubah truecolor menjadi grayscale yang menghasilkan nilai ataupun penggunakan function 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 diatas dalam skala uint8 yaitu
Persis apa yang telah kita jelaskan diatas bahwa nilai berada di rentang . Kalian bisa reverse gambar diatas menggunakan tanda atau disebut
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
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
- centroid : menggunakan teknik center of gravity, kalian bisa baca link berikut https://www.softscients.web.id/2018/11/bab-4-moment-invariant.html
- Area: luas area dalam satuan pixel
- Perimeter : menggunakan teknik edge detection/keliling objek
- 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
- Area (luas)
- EulerNumber
- Orientation (rotasi sudut, kalian bisa pelajari disini)
- BoundingBox
- Extent
- Perimeter (kalian bisa pelajari disini deteksi tepi)
- Centroid (kalian bisa pelajari disini)
- Extrema
- PixelIdxList
- ConvexArea
- FilledArea
- PixelList
- ConvexHull
- FilledImage
- Solidity
- ConvexImage
- Image
- SubarrayIdx
- Eccentricity
- MajorAxisLength
- EquivDiameter
- 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 .
Kalian ingin mendapatkan informasi objek diatas seperti . 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 , 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.