Ekstraksi Ciri Citra RGB


Berikut ini merupakan contoh pemrograman matlab untuk melakukan proses ekstraksi ciri dari citra rgb. Ciri yang diekstrak adalah berupa ciri statistik dan ciri bentuk. Pada contoh ini digunakan citra fish.jpg di mana foreground adalah berupa ikan sedangkan background adalah berupa air.

Langkah-langkah pemrogramannya adalah sebagai berikut:
1. Membaca dan menampilkan citra asli

clc;clear;close all;

Img = imread('fish.jpg');
figure, imshow(Img), title('original image');

sehingga diperoleh tampilan:

2. Melakukan segmentasi citra untuk memisahkan antara foreground dengan background menggunakan metode k-means clustering. Proses klustering dilakukan dengan cara mengkonversi ruang warna citra yang semula RGB menjadi ruang warna L*a*b. Selanjutnya komponen a dan b dari citra L*a*b digunakan sebagai nilai masukan dalam algoritma k-means.

2.1. Mengkonversi citra RGB menjadi L*a*b

% Color-Based Segmentation Using K-Means Clustering
cform = makecform('srgb2lab');
lab = applycform(Img,cform);
figure, imshow(lab), title('L*a*b color space');

Hasil konversi ruang warna citra RGB menjadi L*a*b

2.2. Melakukan segmentasi citra menggunakan algoritma k-means clustering

ab = double(lab(:,:,2:3));
nrows = size(ab,1);
ncols = size(ab,2);
ab = reshape(ab,nrows*ncols,2);

nColors = 3;
[cluster_idx, cluster_center] = kmeans(ab,nColors,'distance','sqEuclidean', ...
                                      'Replicates',3);

pixel_labels = reshape(cluster_idx,nrows,ncols);
RGB = label2rgb(pixel_labels);
figure, imshow(RGB,[]), title('image labeled by cluster index');

Citra hasil segmentasi yaitu:

2.3. Menampilkan hasil segmentasi pada masing-masing kluster

segmented_images = cell(1,3);
rgb_label = repmat(pixel_labels,[1 1 3]);

for k = 1:nColors
    color = Img;
    color(rgb_label ~= k) = 0;
    segmented_images{k} = color;
end

figure,imshow(segmented_images{1}), title('objects in cluster 1');
figure,imshow(segmented_images{2}), title('objects in cluster 2');
figure,imshow(segmented_images{3}), title('objects in cluster 3');

Tampilan hasil segmentasi pada masing-masing kluster:

Kluster 1

Kluster 2

Kluster 3

3. Memilih kluster yang terdapat foreground (ikan). Pemilihan didasarkan pada kluster yang memiliki luasan objek paling kecil. Setelah diperoleh citra foreground saja, selanjutnya dilakukan operasi morfologi yaitu filling holes untuk menyempurnakan hasil segmentasi dan bwareaopen untuk menghilangkan noise.

% Fish segmentation
area_cluster1 = sum(sum(pixel_labels==1));
area_cluster2 = sum(sum(pixel_labels==2));
area_cluster3 = sum(sum(pixel_labels==3));

[~,cluster_fish] = min([area_cluster1,area_cluster2,area_cluster3]);
fish_bw = (pixel_labels==cluster_fish);
fish_bw = imfill(fish_bw,'holes');
fish_bw = bwareaopen(fish_bw,1000);

fish = Img;
R = fish(:,:,1);
G = fish(:,:,2);
B = fish(:,:,3);
R(~fish_bw) = 0;
G(~fish_bw) = 0;
B(~fish_bw) = 0;
fish_rgb = cat(3,R,G,B);
figure, imshow(fish_rgb), title('the fish only (RGB Color Space)');

Citra ikan hasil segmentasi:

4. Menampilkan histogram citra ikan pada masing-masing kanal warna RGB

% RGB Features Extraction
R_stats = regionprops(fish_bw,R,'PixelValues','MeanIntensity',...
    'MaxIntensity','MinIntensity');
G_stats = regionprops(fish_bw,G,'PixelValues','MeanIntensity',...
    'MaxIntensity','MinIntensity');
B_stats = regionprops(fish_bw,B,'PixelValues','MeanIntensity',...
    'MaxIntensity','MinIntensity');

R_pix_val = R_stats.PixelValues;
G_pix_val = G_stats.PixelValues;
B_pix_val = B_stats.PixelValues;

figure,
histogram(R_pix_val,256,'FaceColor','r','EdgeColor','r')
set(gca,'XLim',[0 255])
set(gca,'YLim',[0 15000])
grid on
title('Histogram of Red Channel')

figure,
histogram(G_pix_val,256,'FaceColor','g','EdgeColor','g')
set(gca,'XLim',[0 255])
set(gca,'YLim',[0 15000])
grid on
title('Histogram of Green Channel')

figure,
histogram(B_pix_val,256,'FaceColor','b','EdgeColor','b')
set(gca,'XLim',[0 255])
set(gca,'YLim',[0 15000])
grid on
title('Histogram of Blue Channel')

Tampilan histogram pada masing-masing kanal warna RGB

Red Channel
8

Green Channel
9

Blue Channel
10

5. Melakukan ekstraksi ciri citra ikan berdasarkan pada ciri statistik dan ciri bentuk. Ciri statistik yang digunakan adalah nilai mean, max, dan min dari intensitas warna citra RGB dan HSV. Sedangkan ciri bentuk yang digunakan adalah luas, keliling, dan eccentricity.

R_mean = R_stats.MeanIntensity;
G_mean = G_stats.MeanIntensity;
B_mean = B_stats.MeanIntensity;

R_max = R_stats.MaxIntensity;
G_max = G_stats.MaxIntensity;
B_max = B_stats.MaxIntensity;

R_min = R_stats.MinIntensity;
G_min = G_stats.MinIntensity;
B_min = B_stats.MinIntensity;

% HSV features extraction
fish = rgb2hsv(Img);
H = fish(:,:,1);
S = fish(:,:,2);
V = fish(:,:,3);
H(~fish_bw) = 0;
S(~fish_bw) = 0;
V(~fish_bw) = 0;
fish_hsv = cat(3,H,S,V);
figure, imshow(fish_hsv), title('the fish only (HSV Color Space)');

H_stats = regionprops(fish_bw,H,'PixelValues','MeanIntensity',...
    'MaxIntensity','MinIntensity');
S_stats = regionprops(fish_bw,S,'PixelValues','MeanIntensity',...
    'MaxIntensity','MinIntensity');
V_stats = regionprops(fish_bw,V,'PixelValues','MeanIntensity',...
    'MaxIntensity','MinIntensity');

H_mean = H_stats.MeanIntensity;
S_mean = S_stats.MeanIntensity;
V_mean = V_stats.MeanIntensity;

H_max = H_stats.MaxIntensity;
S_max = S_stats.MaxIntensity;
V_max = V_stats.MaxIntensity;

H_min = H_stats.MinIntensity;
S_min = S_stats.MinIntensity;
V_min = V_stats.MinIntensity;

% Shape features extraction
reg_stats = regionprops(fish_bw,'Area','Perimeter','Eccentricity');

area = reg_stats.Area;
perimeter = reg_stats.Perimeter;
eccentricity = reg_stats.Eccentricity;

6. Menampilkan hasil ekstraksi ciri citra pada command windows

% Print the features in the command window.
disp('>>> Features Extracted <<<')
disp('<1> Red Channel')
fprintf('Mean = %6.2f \n',R_mean);
fprintf('Max  = %6.0f \n',R_max);
fprintf('Min  = %6.0f \n',R_min);

disp('<2> Green Channel')
fprintf('Mean = %6.2f \n',G_mean);
fprintf('Max  = %6.0f \n',G_max);
fprintf('Min  = %6.0f \n',G_min);

disp('<3> Blue Channel')
fprintf('Mean = %6.2f \n',B_mean);
fprintf('Max  = %6.0f \n',B_max);
fprintf('Min  = %6.0f \n',B_min);

disp('<4> Hue Channel')
fprintf('Mean = %6.4f \n',H_mean);
fprintf('Max  = %6.4f \n',H_max);
fprintf('Min  = %6.4f \n',H_min);

disp('<5> Saturation Channel')
fprintf('Mean = %6.4f \n',S_mean);
fprintf('Max  = %6.4f \n',S_max);
fprintf('Min  = %6.4f \n',S_min);

disp('<6> Value Channel')
fprintf('Mean = %6.4f \n',V_mean);
fprintf('Max  = %6.4f \n',V_max);
fprintf('Min  = %6.4f \n',V_min);

disp('<7> Shape Measurements')
fprintf('Area          = %6.0f \n',area);
fprintf('Perimeter     = %6.2f \n',perimeter);
fprintf('Eccentricity  = %6.4f \n',eccentricity);

Hasil ekstraksi ciri adalah

Source code pada pemrograman matlab di atas dapat dijalankan minimal menggunakan matlab versi r2014b. Source code dan citra yang digunakan dapat diunduh melalui laman berikut ini: Source Code

Advertisements

Posted on November 1, 2016, in Pengenalan Matlab, Pengolahan Citra and tagged , , , , , , , , , , , , , , , , , . Bookmark the permalink. 42 Comments.

  1. assalamualaikum mz saya mau nanya disini sya buat identifikasi jenis burung berdasarkan warna, setelah saya melakukan proses dri mencari nulai RGB dan HSV apakan sudah selesai untuk coding ektraksi ciri warnanya, atau masih ada lagi prosesnya..mohon minta bimbingannya mz atau amsukkannya mz…

    • Waalaikumsalam
      Ekstraksi ciri warna bisa dilakukan di antaranya melalui nilai RGB dan HSV
      Hanya saja idealnya segmentasi dilakukan per bagian tubuh burung karena warna pada masing2 bagian tidak sama

    • terimakasih mz adi masukannaya bang adi sangat bermanfaat. untuk alur pengerjakannya sesudah rgb, hsv, dan segmentasi …mohon masukkannya mz adi tentang alurnya….

    • sistem identifikasi jenis burung dapat dilakukan berdasarkan pada perbedaan warna, bentuk, dan ukuran masing2 jenis burung
      proses segmentasi warna per bagian tubuh burung dapat dilakukan dengan metode clustering contohnya menggunakan algoritma k-means ataupun fuzzy c-means sehingga diperoleh region pada masing2 bagian tubuh
      region pada masing2 bagian tsb kemudian diekstrak ciri warna, bentuk, dan ukurannya sehingga diperoleh matriks ciri yang dapat digunakan untuk membedakan jenis burung
      ciri warna dapat diekstrak menggunakan parameter nilai hsv maupun rgb
      ciri bentuk dapat diekstrak menggunakan parameter nilai metric dan eccentricity
      sedangkan ciri ukuran dapat diekstrak menggunakan parameter nilai luas dan keliling
      matriks ciri tsb selanjutnya digunakan sebagai masukan dalam algoritma klasifikasi citra contohnya menggunakan algoritma berbasis aturan seperti algoritma pohon keputusan/ decision tree

  2. Assalamualaikum..
    mas saya ingin memiliki tugas klasifikasi larva nyamuk dengan knn, saya menggunakan pola bentuk untuk mengenali nya tapi akurasinya hanya 60%. apakah ada pola pengenalan lainnya agar akurasinya bertambah?
    terimakasih, wassalam..

  3. Riventus A H Aritonang

    Assalamualaikum..
    mas saya ingin bertanya… saya Riventus dari mahasiswa UNDIP jurusan Teknik Mesin S1.
    saya ingin tau pada histogram, sumbu x dan Y itu mewakili apa? Bisa tolong dijelaskan sedikit mengenai hal tersebut mas…
    sebelumnya terimakasih.
    Apakah ada kontak line atau Whats app atau media social lain untuk bertanya lebih lanjut…
    sebab saya sedang mengerjakan Tugas Akhir mas… ?

    best regard,

    Riventus

    line: riventus
    email: ventusmn@gmail.com

  4. Riventus A H Aritonang

    terimakasih bnyak mas…. atas infonya…

  5. assalamualaikum mas, untuk cara memilih foregrundnya gimana ya?kalo saya mau ganti foregroundnya bukan gambar ikan bisa ga?maaf mas masih newbie

  6. berarti untuk codingnya yang dirubah yang mananya ya mas?sama saya ada satu pertanyaan lagi,untuk code menentukan standard deviasi sama skewness dari histogram bagaimana ya mas?terima kasih mas atas jawabannya

  7. yang diganti apakah dibagian ini mas? —> [~,cluster_fish] = min([area_cluster1,area_cluster2,area_cluster3]); , sama kira kira untuk menentukan skewness dari histogram codingnya seperti apa ya mas?

  8. assalamualaikum mas,saya ada pertanyaan,ini saya masih newbie banget mas dan tugas akhir saya mengenai ekstraksi ciri citra.Pertanyaan saya apakah bisa metode ini diaplikasikan untuk ektraksi ciri dari foto termal?

  9. mas tujuan koversi dari rgb ke lab itu buat apa ya?sebelumnya terima kasih mas artikelnya sangat membantu

  10. mas itu luas area yang dihitung merupakan luas area foreground kah?

  11. Assalaamu’alaikum mas,saya mau nanya, kenapa source code k-means clustering ini tdk bisa dirunning pada matlab 2013 ke bawah mas, saya coba dg matlab 2015 bisa,,tp kenapa 2013 tidam bisa mas?. Mohon bantuannya mas

    • Waalaikumsalam Melia
      Hal tsb dikarenakan terdapat fungsi histogram yang baru dirilis oleh Matlab sejak tahun 2015

    • Terima kasih mas, tapi saya jadi bingung apa hubungan k-means dengan histogramnya mas?

    • Dalam algoritma k-means memang tidak dilakukan analisis histogram
      Tetapi dalam materi yg saya tulis di atas, algoritma k-means digunakan utk melakukan segmentasi, sedangkan analisis histogram digunakan utk melakukan ekstraksi ciri

    • jadi, kenapa saat di running dengan MATLAB 2013 , selalu error dalam empty cluster mas?
      salahnya disini mas :
      [cluster_idx, cluster_center] = kmeans(ab,nColors,’distance’,’sqEuclidean’, …
      ‘Replicates’,3);
      selalu ada empty cluster kalau dengan matlab 2013 mas, sedangkan dengan matlab 2015 tidak masalah?
      mohon maaf mas, saya banyak nanya, saya masih baru dalam pengolahan citra dengan matlab mas. terima kasih mas

    • Pada komputer saya, koding tsb dapat dijalankan dg baik, baik menggunakan matlab 2013 maupun 2015

  12. Assalaamu’alaikum mas adi, mau tanya mas
    RGB = cat(3,R,G,B);
    [row,col] = find(mask==1);
    h_RGB = imcrop(RGB,[min(col) min(row) max(col)-min(col) max(row)-min(row)]);
    penjelasan koding cropping di atas ini gimana ya mas, mohon bantuannya mas adi
    terima kasih

  13. oh jdi gini ya mas adi, seandainya jika saya lakukan cropping circle dengan ukuran cropping 300 x 300 pada sebuah citra katakanlah 500 x 500 dan saya ubah backgroundnya jadi hijau, apakah background juga akan ikut ter ekstraksi jika saya lakukan ekstraksi rgb mas, mohon bantuannya

    • Sesuai dg penjelasan saya sebelumnya, koding tsb digunakan utk melakukan cropping region hanya pada foreground saja
      Artinya tidak ada background yg tersegmentasi maupun terekstraksi ciri nya

  14. Oh oke” mas adi, makasih banyak yah untuk penjelasannya
    wassalamu’alaikum

  15. mas kira2 mas bisa jasa buatkan program matlab tidak?kalo bisa biayanya berapa ya mas?

  16. assalamualaikum
    mas mau tanya apa maksud dari kodingan berikut :

    ab = double(lab(:,:,2:3));
    nrows = size(ab,1);
    ncols = size(ab,2);
    ab = reshape(ab,nrows*ncols,2);

    terima kasih wassalamualaikum

    • Waalaikumsalam intan
      Koding tsb digunakan utk mengekstrak komponen a dan b dari citra l*a*b, kemudian menjadikan kedua nilai tsb mjd matriks dg 2 kolom
      Di mana kolom pertama berisi komponen a
      Kolom kedua berisi komponen b

  17. Assalaamu’alaikum mas, saya mau nanya, kalau kita mau nyimpan gambar hasil clustering/ segmented_images{k}, tersebut menggunankan imwrite , gimana caranya mas?
    Mohon bantuannya mas

    • Waalaikumsalam melia
      Perintah nya seperti ini

      for k = 1:nColors
      color = Img;
      color(rgb_label ~= k) = 0;
      segmented_images{k} = color;
      imwrite(segmented_images{k},strcat([‘hasil ‘,num2str(k),’.jpg’]))
      end

  18. Terima kasih banyak mas adi.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: