jurus-jurus penghalusan citra – jurus 1 : rata-rata tetangga

Penghalusan citra (Image Smoothing) adalah salah satu teknik meningkatkan fitur tertentu (Enhancement) atau bisa juga digunakan dalam menghilangkan derau (denoising). Tulisan ini akan mengawali implementasi jurus untuk menghaluskan citra ke dalam bahasa object pascal (delphi). Tulisan ini akan merujuk ke tulisan sebelumnya tentang mengakses pixel.

jurus 1 : rata-rata tetangga (mean smoothing)

Jurus ini mengganti nilai pixel (intensitas keabuan atau vektor warna) pada suatu titik dengan nilai pixel pada titik-titik lain yang menjadi tetangga titik tersebut. Pemilihan tetangga yang dijadikan pertimbangan ditentukan dengan membentuk sebuah jendela ketetanggaan berbentuk persegi.

misalkan dimensi jendela adalah nxn maka titik yang disebut tetangga titik P(px, py) adalah titik yang berada dalam jangkauan

(x-mid<= x <=x+mid, y-mid <= y <= y+mid)

dengan mid = n div 2

Definisi di atas dibatasi lagi jika titik yang sedang diproses berada di pinggir citra yaitu titik yang jaraknya dari pinggir citra secara horizontal atau vertikal lebih kecil atau sama dengan mid. Penanganan titik pinggir ini bisa dilakukan dengan mengabaikan tetangga semu (titik di luar dimensi citra) atau dengan mengganti tetangga semu dengan nilai intensitas maksimum atau titik di pinggir seberang (misal tetangga semu titik di pinggir kiri diganti dengan titik di pinggir kanan).

Implementasi dari jurus rata-rata ketetanggan dalam delphi adalah sebagai berikut

function clamp(n:integer; limit:integer=255):integer;
begin
  if (n > limit) then result := limit else
    if (n < 0 ) then result := 0 else result := n;
end;

function citra_smoothing_reratatetangga(input_citra:TBitmap;
            lebar_jendela:integer):TBitmap;
var
  i, j, k, l: integer;
  pb : Array of PArrRGB;
  pb2 : PArrRGB;
  b : TBitmap;
  kmid, sumd : integer;
  rsum, gsum, bsum : real;

  function is_ok(x, y:integer):boolean; begin
    result := (x>=0) and (x < b.Width) 
                and (y >=0) and (y < b.Height)
  end;

begin
  b := input_citra;{ alias, untuk mempersingkat kode }
  Setlength(pb, b.Height);
  for i := 0 to b.Height-1 do
    pb[i] := b.ScanLine[i];

    kmid := lebar_jendela div 2;
    result := TBitmap.Create;
    result.Width := input_citra.Width;
    result.Height := input_citra.Height;
    result.PixelFormat := input_citra.PixelFormat;
    { asumsi format pixel input_citra adalah 24 bit (pf24bit) }

    for j := 0 to b.Height-1 do begin
      pb2 := result.ScanLine[j];
      for i := 0 to b.Width-1 do begin
        rsum := 0;
        gsum := 0;
        bsum := 0;
        sumd := 0;

        for l := -kmid to kmid do
          for k := -kmid to kmid do
            if is_ok(i+k, j+l) then begin 
            { gunakan is_ok untuk mengabaikan tetangga semu }
              rsum := rsum + pb[j+l][i+k].r;
              gsum := gsum + pb[j+l][i+k].g;
              bsum := bsum + pb[j+l][i+k].b;
              sumd := sumd + 1;
            end;

        with pb2[i] do begin
          r := clamp(Round(rsum / sumd));
          g := clamp(Round(gsum / sumd));
          b := clamp(Round(bsum / sumd));
        end;{ with }

      end;{ for i }
    end;{ for j }

  { clean-up }
  Setlength(pb, 0);
end;

Kelebihan dari jurus ini adalah kesederhanaan untuk diimplementasikan. bentuk umum dari perata-rataan di atas adalah konvolusi diskret yang mungkin dibahas di tulisan lain. Kelemahan dari jurus ini adalah berlakunya azas sama rata sama rasa sehingga jika ada ketetanggaan dengan 4 elemen memiliki distribusi yang memiliki struktur tertentu (tangga) misal 2 titik intensitas tinggi bertetangga dengan 2 titik berintensitas rendah (255, 255, 0, 0) maka dengan pemberlakuan jurus ini (lebar jendela 3 atau tetangga terdekat) akan menghasilkan distribusi nilai (255, 128, 128, 0). Hal ini tentunya akan mengganggu jika penghalusan yang digunakan untuk menghilangkan derau (noise) dan hasil dari proses denoising akan dilemparkan ke proses pendeteksian tepi (edge detection) karena proses penghalusan dengan menggunakan rata-rata saja dapat menghilangkan struktur (tepi/sudut).

30 comments

  1. foton · April 27, 2007

    mas mo nanya.tapi gak berhubungan dengan tulisan mas diatas. gmn caranya mencari nilai standart deviasi dari 10 data dengan delphi.
    rumusnya sd=(akar(xn-xrata2))/n
    sd=standart deviasi
    xn=data dengan jumlah n
    xrata2= data rata2
    n=jumlah data.
    mencari sd nya dati hasil looping.
    makasih mas

  2. pebbie · April 30, 2007

    untuk mencari standar deviasi sebenarnya skema dasarnya sama seperti mencari rata-rata. hanya saja sekarang nilai yang dijumlahkan pada tiap iterasi adalah selisih nilai pada posisi tsb dikurangi dengan nilai rata-rata yang telah dihitung sebelumnya. setelah keluar dari iterasi perhitungan standar deviasi seperti formula yg bung foton berikan yaitu sqrt(sum)/count

    var
      i : integer;
      jumlah, banyak: single;
      rata, sdev :single;
      arr : array of single;//asumsi isinya 10 elemen
    begin
    jumlah := 0;
    banyak := 0;
    for i := 0 to High(arr) do begin
      jumlah := jumlah + arr[ i ];
      banyak := banyak + 1;
    end;
    rata := jumlah / banyak;

    //dengan skema yang sama kita menghitung standar deviasi
    jumlah := 0;
    banyak := 0;
    for i := 0 to High(arr) do begin
      jumlah := jumlah + sqr(arr[ i ] - rata);
      banyak := banyak + 1;
    end;
    sdev := sqrt(jumlah) / banyak;
    😉

  3. M.Zuhdi effendi · Mei 11, 2007

    mas mo tanya, gmn unit Delphi untuk menghitung nilai intensitas rata-rata foto hitam putih (hasil dari camera digital 10 MegaPixel)? matur suwun sanget ats jwbnya Cz urgent bgt..

  4. pebbie · Mei 11, 2007

    gambarnya hitam putih atau greyscale mas? saya asumsikan greyscale ya dan format pixelnya 24 bit

    var
     i, j : integer;
     p : PArrRGB;//definisinya ada di posting saya sebelumnya tentang mengakses pixel
     sum : cardinal;
     avg : single;
     cnt : cardinal;
    begin
    //asumsi b : TBitmap berisi gambar yang dimaksud dlm format pixel 24 bit (pf24bit)
    sum := 0;
    cnt := 0;
    for j := 0 to b.Height-1 do begin
     p := b.Scanline[ j ];
     for i := 0 to b.Height-1 do begin
      sum := sum + p[i].r;//karena greyscale, nilai r, g, dan b sama
      inc(cnt);
     end;
    end;

    avg := sum / cnt;
    end;

  5. indra · Mei 21, 2007

    salam kenal ya mas
    mo nanya ni, gimana caranya bisa mbuat suatu image yang tersusun dari image kecil-kecil yang bersebelahan? trus nge save nya gimana caranya? makasih banget sebelumnya..

  6. pebbie · Mei 21, 2007

    maksudnya? pengubinan kah?
    ok, asumsi saya pakai TBitmap ya..

    untuk menggambar suatu image ke image lain bisa menggunakan method Draw dari properti Canvas. misalkan bT adalah image tujuan, bU1, bU2, …, bUn adalah image kecil(ubin).


    bT.Canvas.Draw(x, y, bU1);//menggambar image bU1 pada posisi (x, y)

  7. indra · Mei 23, 2007

    wah makasih banget ya…
    oiya, kemarin saya baca artikel mas tentang mengakses piksel. hasilnya kan bertipe byte tuh, trus cara menampilkan hasilnya dalam label ato message box gimana caranya?
    sekalian cara ngrubah tipe data byte menjadi string tu gimana caranya? makasih….

  8. pebbie · Mei 26, 2007

    byte itu kalo dalam helpnya delphi masih bisa dikategorikan integer jadi kalo mau mengonversi ke string bisa pake IntToStr(someint)

  9. indra · Mei 27, 2007

    mo nanya lebih lanjut tentang pengubinan ya mas..
    bisa ga kalo citra ubinnya itu ga melulu kotak, misalnya segi enam ato berbentuk potongan puzzle??
    citranya harus diubah dulu ato ada cara khususnya di delphi?
    trims banget

  10. M.Zuhdi effendi · Mei 29, 2007

    waduu..uh mksh bgt y…..
    tpi sy msh bgg nih,,,,,, ap hitungan intensitas rata-rata tersebut bs di gunakan untuk menghitng intensitas radiasi rata-rata dari penggambilan obyek benda padat?
    ……………………………
    (Knp gambar yg sy ambil hita putih,Cz klo warna nnt mendfinisikan mlh rewet lg)
    (truss knp kok Intensitasnya dlm rata-rata,Cz dlm 1 Gambar kn trdpt ukuran pixel2 ato istilahnya kotak2,makanya intensitasnya dalam rata-rat)
    (dan knp Intensitas berupa Intensitas radiasi rata-rata,Cz nntinya penggamblan gambarnya dilakukan d ruang tertutup,gelap,nnt dengan bantuan sinar-x maka akan kelihatan bahan zat padat,misal almunium,setelah kelihatan baru dilakukan penggambilan gambar dgn Camdi–>naaah menghitung intensitas radiasi rata-ratanya itu untuk KETEBALAN YANG BERBEDA dr bhn tsb!!!)
    Waduuuuu…h sorry klo penjabarannya sgt panjang,Cz berkaitan dengan Tugas Akhir q..
    Swuuuun sing Uuuuuuakeh y pebbie,ats wktu yg d luangkan utk bhs ini….
    Thb4…….

  11. pebbie · Mei 30, 2007

    @indra: bisa saja kalau berbentuk heksagon atau kotak isometrik. kalau bentuk non-reguler seperti potongan puzzle mungkin bisa didekati dengan pendekatan irisan poligon atau irisan raster(sprite). misal untuk ubin berbentuk isometrik, lokasi penggambarannya ditambahkan dengan nilai offset(penggeseran lokal). setiap ubin pada indeks lokasi ganjil (ubin pertama berindeks lokasi 0) digeser sebesar setengah tinggi ke atas dan setengah lebar ke kiri sehingga ubin isometrik yang berbentuk belah ketupat bisa bertumpuk teratur.

    @M.Zuhdi E.:kalau memang nilai intensitas keabuan pada tiap pixel dapat diartikan sebagai ketebalan, bisa saja sih.. tapi asumsi saya sudah dipetakan range intensitas dengan range ketebalan (sudah ada kalibrasi nilai minimum intensitas-nilai minimum ketebalan dan nilai maksimum intensitas-nilai maksimum ketebalan). kalau untuk keperluan ini saya berharap kamera yang digunakan menghasilkan citra dengan range yang besar (HDRI ~ High Dynamic Range Imagery).

    hal lain yang saya pikirkan.. kalau rata-rata yang dihitung terhadap keseluruhan citra, saya berasumsi citra yang diambil menggambarkan sebagian/seluruh bagian benda (hanya berisi benda tanpa ada latar belakang). kalau citra yang didapat tidak hanya berisi objek melainkan ada citra latar belakang yang mungkin ditimbulkan dari objek yang lebih kecil dari daerah yang dapat ditangkap maka intensitas rata-ratanya dihitung dari sebagian daerah citra yang didapat dari hasil segmentasi.

  12. indra · Juni 4, 2007

    mau nanya lagi, bisa ga mas ngasih contoh untuk syntax penggunaan nilai offset pada delphi?
    makasih banyak…

  13. M.Zuhdi Effendi · Juni 23, 2007

    pebie…..,maaf tanya lagi!!!!!
    gmn komponen Delphi untuk mengubah gambar dari format JPEG ke format Bitmap?
    MaturSwuun

  14. pebbie · Juli 4, 2007

    @indra : sorry aku pending dulu ya jawabnya. belum sempat untuk membuat contoh offset.

    @M.Zuhdi Effendi :
    – buka dengan objek dari kelas TJpegImage (unit Jpeg) (misalkan nama objeknya jpg). gunakan method LoadFromFile(namafile)
    – buat objek dari kelas TBitmap (misalkan nama objeknya b) dengan Width dan Height yang sama dengan Width dan Height dari objek jpg.
    – salin isi citra dari objek jpg ke objek b
    b.Canvas.Draw(0, 0, jpg)

    – simpan objek b

    b.SaveToFile(namaFileBMP);

    ket: namaFileBMP adalah string berekstensi .BMP

  15. Ayu FA · Agustus 1, 2007

    mas, saya mau tanya mengenai penggunaan crop pd photoshop. saya ingin mengcrop beberapa citra dr hasil expose. saya menginginkan hasil dr seluruh citra di crop dengan widht dan height yang sama. berhubung citra yang mau d crop tsb berjumlah ratusan dari setiap hasil expose akan sangat sulit bagi saya untuk mengcrop di tempat yang sama dengan meneliti letaknya terlebih dahulu. hasil2 crop tsb akan saya gunakan sebagai proses untuk pererataan citra dengan software yang telah dibuat.
    demikian ptnyaan saya, sekian dan terima kasih.

  16. nomo · April 29, 2008

    Salam kenal..mas sy mau tanya ttg citra tp ga ada hubungannya dgn delphi,bleh kan?Dari yang saya baca mas pebbie org yang pinter..Gini mas, saya punya 5 buah citra intensity dengan ukuran piksel yang berbeda-beda, yang pertama 19×50 dgn size 1.95 KB, kedua 17×41 dgn size 1.53 KB, ketiga 20×48 dgn size 2.02 KB, keempat 21×48 dgn size 2.09 KB dan kelima 19×46 dgn size 1.83 KB..gmana caranya saya mendapatkan nilai rata-rata dari semua citra tsb? Terima kasih

  17. AYoe · Juni 5, 2008

    mas..sy minta tolong diberikan penjelasan mengenai jumlah citra. maksudnya jika sy melakukan expose gambar dan dapat menentukan jumlah citra yang dihasilkan untuk setiap kali expose misalnya untuk mengexpose tiap 0,5 milisekon saya ingin citra yang dihasilkan itu berjumlah 100. pertanyaan saya pengaruhnya jumlah citra pada kualitas citra itu sendiri apa?apa jika semakin saya memperbanyak jumlah citra yang diinginkan, kualitas citra semakin baik?
    demikian pertanyaan saya.terima kasih

  18. pebbie · Juni 5, 2008

    @Ayu FA:maaf saya tidak terlalu paham tentang detil photoshop.

    @nomo:anggap saja tiap citra sebagai koleksi nilai intensitas, lalu gabungkan nilai-nilai tsb dari seluruh citra baru dirata-ratakan.

    @AYoe:IMO, citra yang banyak untuk scene yang sama dapat dimanfaatkan untuk meningkatkan kualitas citra (sebagai pengoreksi), atau membuat efek khusus

  19. Ping-balik: Implementasi Bilateral Filtering di Delphi « GAIBlog
  20. udhin · Juli 10, 2008

    Mas, mau nanya nih?
    Gimana sih caranya ngitung panjang dan lebar dari suatu gambar sehingga di dapatkan ukuran centi meter bukan pixel?
    Tolong mas yaa…!
    Makasih.

  21. Rina · Juli 25, 2008

    Hallo mas, mau tanya nih, dalam program delphi untuk penjualan cara mengisi sintak untuk total, pembayaran dan uang kembali gimana caranya, seperti cash register gitu loe, jadi kalau kita beli barang kita bs tahu berapa uang kembali, and set up printernya gimana, ma kasih jawabannya,tolong kirim di nina_utek@yahoo.com

  22. khalid · Agustus 1, 2008

    mas kalo cara crop image pake delphi gmn sintaknya?
    saya tau di buku ‘pengolahan citra menggunakan delphi’ milik balza itu mengacu pada image dan ada mouse down, up, dan movenya. alhasil citra yang di crop masih terdapat garis tepinya……..terima kasih…

  23. wanda · Desember 25, 2008

    lam knl ya mas. nama saya wanda..
    mas tlng ksh tau dunk caranya mengkonvert file avi ke bmp pakek delphi7. ksh saya source code dengan apllikasinya ya mas..
    makasie banyak..
    tlng krm di giwang2mei@yahoo.com..

  24. andy · Maret 12, 2009

    mas klw saya punya file a.bmp resolusi 1000 x 500 trus saya mao ambil atasnya saja yaitu 500 x 500 gimana ya , code cropnya n savenya makasi

  25. cici · Februari 8, 2010

    mas tolong beri tau saya source code pengolahan citra satelit berformat jpeg menggunakan delphi.

  26. faris · Maret 23, 2011

    slam kenal mas…!!!
    mas saya mau minta tolong, gimana sich caranya menghapus area bayangan pada image dan mengembalikan image tersebut tanpa ada bayangan….!!!! kebetulan saya memakai delphi 7 untuk tools pemrogramanya…!!
    kira-kira proses apa saja yang harus saya lakukan dulu… soalnya saya lagi menyelesaikan tugas akhir saya…!!! atas bantuannya saya ucapkan terima kasih..!!!

  27. Ping-balik: Mean Shift Filtering « GAIBlog
  28. elvi · Desember 19, 2014

    mas mohon banget ni bantuannya, coding k-means clustering menggunakan delphi 7 itu seperti apa ya mas? ada ngga contohnya.. trimakasih

  29. John · Agustus 22, 2015

    is good artikel Thank you so much , Adwin

  30. Arif nurdiansah · Agustus 3

    Permisi mas,numpang tanya. .kalo mau meningkatkan kualitas citra di delphi caranya gimana yah ?
    Kalo ada,saya minta contoh source code nya. .Terimakasih

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s