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).
Filed under: delphi, image processing, programming | 27 Komentar
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
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;
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..
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;
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..
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)
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….
byte itu kalo dalam helpnya delphi masih bisa dikategorikan integer jadi kalo mau mengonversi ke string bisa pake IntToStr(someint)
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
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…….
@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.
mau nanya lagi, bisa ga mas ngasih contoh untuk syntax penggunaan nilai offset pada delphi?
makasih banyak…
pebie…..,maaf tanya lagi!!!!!
gmn komponen Delphi untuk mengubah gambar dari format JPEG ke format Bitmap?
MaturSwuun
@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
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.
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
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
@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
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.
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
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…
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..
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
mas tolong beri tau saya source code pengolahan citra satelit berformat jpeg menggunakan delphi.
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..!!!