mengakses pixel

Pada pertemuan pertama dalam kuliah grafika komputer ada satu hal penting yang ditanyakan (dijadikan tugas 🙂 ) yaitu bagaimana caranya menampilkan titik dengan warna tertentu di layar monitor (dengan mengakses framebuffer) dan mendapatkan deskripsi tentang warna dari titik dengan koordinat tertentu di layar. Dalam dunia DOS dulu, hal ini mudah saja (dalam berbagai asumsi) untuk dilakukan yaitu dengan mengakses memori pada alamat $A0000 dengan data yang dapat diakses tergantung dari mode grafik yang sedang aktif.

Lalu bagaimana melakukan hal ini di delphi (misal menampilkan titik berwarna tertentu pada form)? hal ini bisa dilakukan melalui Property Pixels milik objek bertipe TCanvas yang umumnya merupakan milik dari kelas turunan TWinControl seperti TForm. contoh penggunaan Pixels adalah sebagai berikut :

{ menampilkan titik berwarna merah di koordinat (10, 10) }
Form1.Canvas.Pixels[10,10] := clRed;
{ atau }
Form1.Canvas.Pixels[10, 10] := RGB(255, 0, 0);

{ mendapatkan pixel dari koordinat tertentu (10, 10) }
var p : TColor; r, g, b : byte;
{ ... }
p := Form1.Canvas.Pixels[10, 10]
{ mendapatkan komponen warna merah, hijau, dan biru }
r := GetRValue(p);
g := GetGValue(p);
b := GetBValue(p);

Cara di atas merupakan cara termudah untuk mengakses pixel pada suatu koordinat di layar (maksudnya form, hehehe) namun bukan merupakan cara tercepat. Masih ada cara lain yang lebih cepat. saya pertama kali merasakan lambatnya Pixels ketika mengikuti kuliah Grafika Komputer (3 tahun yang lalu) dan membuat tugas menggunakan Delphi (tadinya pakai turbo pascal 7) tapi akhirnya mengikuti anggota kelompok lain yang lebih akrab dengan Delphi daripada turbo pascal.

Cara lainnya untuk mengakses pixel adalah dengan menggunakan properti scanline dari kelas TBitmap. Kenapa menggunakan TBitmap? awalnya sih karena untuk menampilkan gambar di Delphi saya menggunakan komponen TImage dan di dalam TImage ada properti Picture yang kemudian properti Bitmap yang merupakan kelas bertipe TBitmap (garing hehehe..) yang akhirnya sampai sekarang saya gunakan untuk keperluan pengolahan citra ataupun menggambar (grafika). Untuk menggunakan scanline dengan nyaman ada beberapa hal yang perlu untuk dideklarasi terlebih dahulu.

type
{ asumsi PixelFormat yang digunakan adalah 24 bit (pf24bit) }
  TWarnaRGB = packed record
  b, g, r : Byte;
  end;
{ packed; jadi 1 record ukurannya persis 3 byte, 
klo nggak pake packed nanti ukurannya 
di-align ke 4 byte jadinya 4x3 = 12 byte; }
TArrRGB = array[0..65535] of TWarnaRGB;
  PArrRGB = ^TArrRGB; { tipe properti scanline adalah Pointer }

Tipe data bentukan di atas akan digunakan dalam potongan kode berikut:

procedure PutPixel(b:TBitmap; x, y:integer; rr, gg, bb : byte);
  var p : PArrRGB;
begin
  p := b.Scanline[y];{ 10 adalah baris/ordinat(y) pada Bitmap }
  with p[x] do begin
    r := rr;
    g := gg;
    b := bb;
  end;
end;

procedure GetPixel(b:TBitmap; x, y:integer; var r, g, b : Byte);
  var p : PArrRGB;
begin
  p := b.Scanline[y];
  r := p[x].r; 
  g := p[x].g; 
  b := p[x].b;
end;

Kode di atas mengasumsikan properti PixelFormat milik TBitmap bernilai pf24bit yang artinya Bitmap menyimpan informasi gambar sebanyak 3 byte per titik (r, g, dan b). Jika bitmap yang dimiliki tidak dalam format 24 bit maka ubah saja ke dalam format 24 bit dengan kode berikut (sedikit maksa).

var b : TBitmap;
{ .. }
b.PixelFormat := pf24bit;

150 comments

  1. mia · April 5, 2007

    Halow Peb! pa kabar?
    sip sip! sering2 bagi cerita ke-gaibannya ;D
    ku link blognya yaa.. 😀

  2. tris · April 14, 2007

    mas…say amo tanya. klo pengen mendapatkan matriknya rgb dari gambar bagaimana caranya?truz ditampilkan di stringgrid.coz aq masih bingung. trimakasih ya mas.

  3. pebbie · April 16, 2007

    @tris: gambarnya di iterate aja

    var
    i,j:integer;
    p : PArrRGB;
    b:TBitmap; { gambarnya }
    sg : TStringgrid; { gridnya }
    { .. }
    for j := 0 to b.Height-1 do begin { iterate row }
    p := b.Scanline[j];
    for i := 0 to b.Width-1 do begin { iterate column }
    sg.Cells[i, j] := IntToStr(p[i].r)+','+IntToStr(p[i].g)+','+IntToStr(p[i].b);
    end;
    end;

  4. qoy · April 16, 2007

    klo untuk mengakses gambar dari web camera gimana ya caranya?

  5. pebbie · April 17, 2007

    untuk mengakses gambar dari Web Cam, saya pakai komponen DSPack dari progdigy.com di situ ada komponen TFrameGrabber
    ada method untuk GetBitmap (cara halus)

    cara kasarnya(tanpa pakai FrameGrabber tapi nyuri dari canvas TVideoWindow):

    BitBlt(VideoWindow1.Canvas.Handle, 0, 0, VideoWindow1.Width, VideoWindow1.Height, MyBitmap.Canvas.Handle, 0, 0, pmSrcCopy);//klo ga salah lo ya.. coba cek di help Win32 SDK

  6. triswantoro · April 17, 2007

    mas, aku nyoba pakek looping sampai Height-1 dan Width-1. tp kok nge-run nya lama?
    gmn cara agar dapet RGB tp gak selama itu?
    trimakasih banyak atas bantuannya ya mas

  7. pebbie · April 17, 2007

    tris:lamanya mungkin karena dimasukkan ke dbgrid mas, perlu konversi dari bilangan bulat ke string karakter, trus update data di stringgrid. memang harus ke string grid ya mas? hehe.. kalo memang harus, mendingan sementara ditampung dulu ke stringlist of stringlist

    var i,j:integer;
      p : PArrRGB;
      b:TBitmap;//gambarnya
      s1, s2 : TStrings;
      sg : TStringgrid;//gridnya

    s1 := TStringlist.Create;
    s2 := TStringlist.Create;
    for j := 0 to b.Height-1 do begin //iterate row
      p := b.Scanline[j];
      s2.Clear;
      for i := 0 to b.Width-1 do begin //iterate column
        s2.Add(IntToStr(p[i].r)+','+IntToStr(p[i].g)+','+IntToStr(p[i].b));//simpan di stringlist
      end;
      s1.Add(s2.CommaText);
    end;
    //sekarang dikopi ke string grid
    sg.RowCount := s1.Count+sg.FixedRows;
    for j := 0 to s1.Count-1 do //iterate row
     sg.Rows[sg.FixedRows+j].CommaText := s1[j];

    semoga berhasil! 😉

  8. no skill · April 27, 2007

    Peb, mo nanya nih! gw pernah baca di buku teknik pengolahan citra digital menggunakan delphi, tentang binarisasi karya Balza Achmad. begini bunyinya:

    var
    i,j,Ambang,gray:integer;
    PC,PH:Pbytearray;
    begin
    Ambang:=128;
    if(form4.Image.Picture.Bitmap.PixelFormat=pf24bit) then
    for i:=0 to form4.Image.Picture.Height-1 do
    begin
    PC:=form4.Image.Picture.Bitmap.ScanLine[i];
    PH:=form4.Image.Picture.Bitmap.ScanLine[i];
    for j:=0 to form3.Image.Picture.Bitmap.Width-1 do
    begin
    gray:=round((PC[3*j]+PC[3*j+1]+PC[3*j+2])/3);
    if (gray

  9. no skill · April 27, 2007

    if (gray

  10. no skill · April 27, 2007

    Jelasin gw dunk maksudnya?? Gw ga ngerti jalan pikirannya terutama di bagian scanline ama di bagian PC/PH, yang ada tulisan [3*j] ato[3*j+1] ??? gunanya apa ya?
    Trus maksud n guna pbytearray ama Array of array of byte tu apa ya???
    MOhon bantuannya. Tenkyu Bro!!!

  11. pebbie · April 30, 2007

    umm, gw coba dikit2 y… rada bingung jg nih..

    bedanya pbytearray dengan PArrRGB gw itu :
    klo pbytearray itu menunjuk record yang ukurannya 1 byte. sedangkan pArrRGB gw itu menunjuk record yang ukurannya 3 byte. sebenarnya sama, hanya saja.. gw nggak harus mengalikan dengan 3 dan menambah 1 dan 2 untuk mengakses nilai green, dan red. soalnya udah dibungkus sama record TWarnaRGB.

    dengan asumsi urutan penyimpanan elemen pixel di windows adalah bgr bukan rgb maksud pernyataan di atas spt ini:

    PC[3*j] itu untuk mengakses elemen blue yang ke-j
    PC[3*j+1] untuk mengakses elemen green yang ke-j
    PC[3*j+2] untuk mengakses elemen red yang ke-j

    dikalikan 3 karena tiap pixel membutuhkan tempat penyimpanan sebesar 3 x 1 byte per elemen (b 1 byte, g 1 byte, r 1 byte). jadi ketika mengalikan j (iterator kolom) dengan 3, nilai yang ditunjuk oleh PByteArray adalah nilai blue, nilai green dan red adalah 1-2 byte setelah posisi blue tsb.

    pointer yang gw gunakan adalah pointer of array of record (bgr) bukan pointer of array of byte. jadi, dari struktur record itu udah ada offset dari pointer untuk merujuk ke elemen yang gw maksud (r, g, b) dan pengaksesan nilai masing-masing elemen sudah dibuat oleh compiler jadi tidak perlu lagi susah-susah melakukan operasi aritmatika terhadap alamat pointer (pointer arithmetic)

  12. $^$ · Mei 6, 2007

    alow kk pebbie…
    aku mao nanya…gimana caranya dapetin nilai koordinat dari pixel? misalnya ada gambar kotak yang warnanya hitam smua…trus gimana caranya ngedapetin koordinat dari keempat sudut kotak tersebut???

    Makasih banyak yah….

  13. pebbie · Mei 7, 2007

    kalau untuk mencari sudut dari kotak bisa didapat dari kombinasi nilai elemen bounding box-nya.

    tapi untuk mendapatkan kotaknya bisa digunakan segmentasi dengan CCL (Connected Component Labelling), yaitu memberi label kepada komponen (pixel) yang berhubungan. keterhubungan antar pixel bisa merupakan terhubung ke 4 atau 8 tetangga. untuk melakukan CCL bisa secara iteratif atau memodifikasi dari algoritma fill (mis. floodfil).

    cara yang lebih ringan untuk kasus mencari sudut adalah menelusuri pantai/tembok. jadi seolah-olah ada robot yang memproses pixel. robot tersebut mulai dari salah satu tepian region (mis. kotak) lalu bergerak menelusuri tepian tersebut. 😉

    untuk menentukan region yang diproses kotak atau bukan bisa menggunakan properti width to height ratio (kotak normal) atau axis-aligned bounding box (kotak yang terputar).

  14. $^$ · Mei 7, 2007

    saya ud pake cara tersebut…saya gunakan 3 buah scanline (atas,tengah,bawah)…..
    akan tetapi…masalahnya…ko fungsi scanlinenya error yah??? apa memang nga bisa digunakan secara bareng kk?? saya bingung niy…
    ato kk pebbie ada usul yang lebih baik?

    potongan programnya kira2 begini:
    (PA–>BarisAtas;PT–>BarisTengah;PB–>BarisBawah)

    for i:=0 to image1.picture.height-1 do
    begin
    PA:=image1.picture.bitmap.scanline[i];
    PB:=image1.picture.bitmap.scanline[i+1];
    PC:=image1.picture.bitmap.scanline[i+2];

    Tapi kok error yah…delphi said that scanline was out of index ???
    Trims

  15. $^$ · Mei 7, 2007

    saya ud pake cara tersebut…saya gunakan 3 buah scanline (atas,tengah,bawah)…..
    akan tetapi…masalahnya…ko fungsi scanlinenya error yah??? apa memang nga bisa digunakan secara bareng kk?? saya bingung niy…
    ato kk pebbie ada usul yang lebih baik?

    potongan programnya kira2 begini:
    (PA–>BarisAtas;PT–>BarisTengah;PB–>BarisBawah)

    for i:=0 to image1.picture.height-1 do
    begin
    PA:=image1.picture.bitmap.scanline[i];
    PT:=image1.picture.bitmap.scanline[i+1];
    PB:=image1.picture.bitmap.scanline[i+2];

    Tapi kok error yah…delphi said that scanline was out of index ???
    Trims

  16. pebbie · Mei 8, 2007

    hoho.. ya jelas saja akan error..
    ketika nilai i mencapai Image1.Picture.Height-1 maka scanline[i+1] dan scanline[i+2] akan menunjuk ke baris scanline yang tidak terdefinisi. karena nilai maksimum untuk mengakses scanline hanya sampai Image1.Picture.Height-1. perlu ditambahkan analisa kasus untuk memeriksa apakah pengaksesan scanline valid atau tidak. 😉

    misal bisa saja nilai maksimum untuk iterasi for hanya sampai Image1.Picture.Height-3 atau ditambahkan IF di dalam iterasi FOR

  17. ayat · Mei 10, 2007

    mas, saya mau tanya, kalo mau fliping horisontal & vertikal gambar (putar), sitaknya bagaimana yach…

    tirima kasih nich sebelumnya

  18. pebbie · Mei 10, 2007

    untuk melakukan image flipping hanya diperlukan pertukaran pixel. misal untuk flip horizontal maka pixel pada koordinat [i, j] ditukar dengan pixel pada koordinat [i, image.height-j] untuk i bernilai dari 0 sampai image.width-1 dan j dari 0 sampai image.height div 2. untuk vertical flip yang ditukar adalah pixel yang berada di atas dengan di bawah garis tengah horizontal.

    //vertical flip
    var
     i, j : integer;
     b : TBitmap;
     p, p2 : PArrRGB;
     w : TWarnaRGB;
    begin

    for j := 0 to (b.Height div 2)-1 do begin
     p := b.scanline[j];
     p2 := b.scanline[b.Height-1-j];
     for i := 0 to b.Width-1 do begin
      //tukar
      w := p[i];
      p[i] := p2[i];
      p2[i] := w;
     end;
    end;

    end;

    untuk horizontal flip yang ditukar adalah pixel kiri dengan kanan garis tengah vertikal.

    //horizontal flip
    var
     i, j : integer;
     b : TBitmap;
     p : PArrRGB;
     w : TWarnaRGB;
    begin

    for j := 0 to b.Height-1 do begin
     p := b.scanline[j];
     for i := 0 to (b.Width div 2)-1 do begin
      //tukar
      w := p[i];
      p[i] := p[b.Width-1-i];
      p2[b.Width-1-i] := w;
     end;
    end;

    end;

    untuk melakukan putaran lebih enak menggunakan dua buah image. pemetaan pixel dapat dilakukan secara maju (forward mapping) atau terbalik (backward mapping). pemetaan maju memetakan posisi tiap pixel di citra sumber ke posisi baru di citra tujuan dengan nilai pixel di posisi baru adalah nilai pixel di citra asal. fungsi yang digunakan adalah fungsi transformasi geometrik rotasi biasa. sedangkan untuk pemetaan mundur tiap posisi pixel di citra tujuan dipetakan menggunakan fungsi invers rotasi sehingga menghasilkan posisi titik yang bersesuaian pada citra asal. nilai pixel yang digunakan tetap dari citra asal.

  19. gal · Mei 11, 2007

    Mas saya lagi coba mbuat program deteksi warna RGB pake TImage
    Kenapa ya, warna yang terdeteksi Cuma bagian kiri dari image.???
    Misalnya image yang diambil bentuknya kotak berwarna merah bagian kiri 25% dan 75% berwarna biru disebelah kanannya.
    Walaupun image yang dimbil 75% berwarna biru tapi nilai R selalu lebih tinggi, kenapa ya……???
    Listing programnya gini
    var
    x,y: integer;
    R, G, B, jmlpixel : longint;

    begin
    R := 0;
    G := 0;
    B := 0;
    jmlpixel := 0;
    for x := 0 to image1.Height-1 do
    for y := 0 to image1.Width-1 do
    begin
    R := R + GetRValue(Image1.Picture.Bitmap.Canvas.Pixels[x,y]);
    G := G + GetGValue(Image1.Picture.Bitmap.Canvas.Pixels[x,y]);
    B := B + GetBValue(Image1.Picture.Bitmap.Canvas.Pixels[x,y]);
    jmlpixel := jmlpixel + 1;
    end;
    R := round(R/jmlpixel);
    G := round(G/jmlpixel);
    B := round(B/jmlpixel);
    Edit1.Text := intToStr(R);
    Edit2.Text := intToStr(G);
    Edit3.Text := intToStr(B);
    End;
    Da saran ga…..
    Maksih ya……….

  20. pebbie · Mei 11, 2007

    kebalik tuh

    for x := 0 to image1.Height-1 do
    for y := 0 to image1.Width-1 do

    semestinya

    for y := 0 to image1.Height-1 do
    for x := 0 to image1.Width-1 do

  21. Gal · Mei 12, 2007

    oh… ya… sorry saya yang salah ketik.
    saya dah bikin kaya itu tapi tetep aja.
    kalo ingin mengetahui besarnya komponen RGB dari image yang di ambil dari WEBCam gimana?
    saya pake TVideoGrabber.
    tolong ya…..Ga bisa-bisa nih.maklum masih awam…
    thanks…..

  22. nuzul · Mei 18, 2007

    Mohon bantuannya mas. Saya mau tanya nehh. Bagaimana caranya ya, menghitung tingkat/kuantitas pixel di dalam satu area gambar hitam putih/biner (koordinat kita tentukan) dengan metode yang cukup cepat, sehingga kita dapat mengetahui dari hasil hitung tersebut daerah tersebut dihitamkan atau diberi isian. Terus terang ini yang saya tanyakan ini sangat erat hubungannya dengan pembuatan aplikasi optical mark recognition (OMR) yang sepertinya tidak disebarkan ke publik atau mungkin hanya sedikit orang yang mengetahuinya. Sebelumnya, terima kasih jika anda dapat membantu.

  23. pebbie · Mei 18, 2007

    itu disebut CCL (Connected Component Labeling)
    cara yang paling sederhana (menurut saya) pakai algoritma flood-fill (seperti pada Paint).

  24. no skill · Mei 19, 2007

    Peb, mau nanya nih, kali ini tentang konsep dasar:
    1. Apa sih bedanya BMP dan JPEG ? dari buku2 sih bilangnya kalo BMP adalah format yang belum dimampatkan. Lalu kenapa image processing lebih sering menggunakan format BMP, apakah JPEG tidak bisa diolah secara langsung seperti halnya BMP? Truz JPEG itu masih ada informasi RGBnya ga sih?

    2. Saya agak bingung mengenai format BMP 8 bit. Buku2 bilang kalo 8 bit itu artinya grayscale.
    Apakah di 8 bit itu masih terdapat informasi RGB? Tapi kenapa saya masih menemukan citra berformat 8bit yang berwarna-warni dengan kualitas gambar seperti 24bit?

    Thank’s!

  25. pebbie · Mei 21, 2007

    saya coba jawab yah..

    1. BMP dan JPEG hanya berbeda format penyimpanan aja. BMP juga ada yang dimampatkan, biasanya sih pakai Run-Length Encoding walaupun pada umumnya BMP adalah format tidak termampat yang artinya informasi pixel di simpan mentah-mentah. kalau JPEG itu format yang disusun sebagai standar, sesuai kepanjangan JPEG (Joint Photographic Expert Group). dikompresi dengan huffman coding, tapi sebelumnya ditransformasi ke domain spasial dengan transformasi kosinus diskret (DCT)(agak mirip dengan MP3 untuk suara). FYI, JPEG2000 menggunakan DWT (Discrete Wavelet Transform) untuk mengurangi kelemahan diskretisasi DCT.

    2. untuk bitmap dengan format pixel 8 bit. tiap pixelnya adalah index ke tabel lookup(palet warna) yang berisi informasi RGB. jadi jumlah warna yang mungkin untuk bitmap 8 bit adalah 256 warna. kualitasnya kemungkinan besar tidak sama seperti 24 bit karena ada kuantisasi dari 2 milyar warna ke 256 warna.

    semoga menjawab..

  26. no skill · Mei 21, 2007

    Tenkyu peb!
    Mo nanya lagi ni (sory nanya mulu, maklum ‘no skill’ hehe..)
    Gmn yah cara ngubah warna citra (kita batasin format .bmp 24 bit aj) dari grayscale (hitam..abu..putih) menjadi spektrum color/pelangi (me..ji..ku..hi..bi..ni..u).
    Maksudnya gini, misal: yang tadinya warna kehitam2an jadi sekitar warna merah, trus yang warna keabu2an mgkn jd sekitar warna kuning/hijau, yg warna keputihan menjadi sekitar warna ungu .
    Dengan kata lain, gw pengen ngubah pallete color gambarnya.
    Thanks sebelumnya!

  27. pebbie · Mei 26, 2007

    hmm.. mungkin bisa dicoba dari model warna HSV/HSI (Hue-Saturation-Value) komponen Hue itu klo tidak salah pola warna pelangi.

    jadi pertama bikin gradasi mejikuhibinu dari model HSV yang dikonversi ke RGB (H bervariasi 0-255, S=255, V=127, CMIIW). lalu disampling dari gradasi mejikuhibinu tsb diasosiasikan dengan tingkat 0-255 dari greyscale.


    type
     warnargb=packed record
      b, g, r : byte;
     end;
    var
     paletrgb:array [0..255] of warnargb;
     h,s,v:byte;
    begin
     s := 255;
     v := 127;
     for h := 0 to 255 do begin
     //konversi hsv ke rgb
     paletrgb[h] := hsv_to_rgb(h, s, v);//saya lupa definisinya
     end;
    end;
    //apply paletrgb ke palet bitmap greyscale ;)

  28. mia · Mei 26, 2007

    mau nanya ni mas..
    mas udah pernah nyoba pake sqlite?
    kira-kira cocok ga sqlite digunakan untuk nyimpen data citra? kelebihan & kekurangannya apa ya?
    oiya, satu lagi, gimana caranya nyari warna dominan dari suatu citra. misalnya ada suatu citra laut, warna dominannya kan biru tuh, tp gimana cara ngitungnya??
    mohon petunjuk…
    makasih banget

  29. pebbie · Mei 26, 2007

    hmm.. kalo nyoba untuk aplikasi sendiri sih belum pernah, tapi kalo nyoba aplikasi contoh dari xampp pake php pernah.. sepertinya sama saja dengan mysql 😀

    kalau untuk penyimpanan cocok atau tidak saya pikir kembali ke tujuannya ya.. tergantung sqlite itu akan digunakan untuk apa dan citra yang disimpan ke basis data akan digunakan untuk apa..

    yang pasti kalau ingin menyimpan citra dalam field di basis data biasanya disimpan sebagai BLOB. kalau untuk ukuran penyimpanan kembali lagi pada format pemampatan citra yang digunakan sebelum disimpan sebagai BLOB. kalau tidak dimampatkan saya pikir percuma saja kecuali kalau memang dibutuhkan pencarian terhadap koleksi basis data citra yang amat banyak (misal untuk aplikasi GIS yang menyimpan data raster/citra yang diindeks secara spasial seperti pada google earth.. ups, nyebut merk hehehe.. :D).

    kalau untuk mencari warna dominan dari suatu citra bisa saja menggunakan rata-rata dari seluruh pixel. mungkin jika diperlukan rata-rata yang diambil dalam model ruang warna tertentu (mis RGB, CMY, HSV, YIQ, YUV, dll). jadi setelah dikonversi ke ruang warna yang diinginkan, dihitung rata-rata dari tiap komponen pixel (misal rata-rata merah, hijau, dan biru untuk model ruang warna RGB)..

  30. mia · Mei 27, 2007

    waduh2… kok aku rada bingung ya?? ;(
    kalo dalam delphi, syntaxnya untuk pencarian warna dominan gimana mas?
    makasih…

  31. $^$ · Mei 30, 2007

    Peb… mao nanya lagi niy…gimana si cara menentukan letak suatu pixel perspketif dari suatu gambar???
    Maksudnya gini…..
    Misalnya dalam suatu gambar ada 3 benda….benda 1 letaknya paling depan, benda 2 dibelakang benda 1, dan benda 3 letaknya dibelakang benda 2….
    Trus gimana mengakses pixel agar ketahuan letak ketiga benda tersebut klo benda 3 letaknya dibalakang benda 2, benda 2 letaknya diblakang benda 1, dan benda 1 letaknya paling depan….

    Makasih banyak lho….

  32. pebbie · Mei 30, 2007

    @mia:coba lihat posting saya tentang jurus rata-rata untuk penghalusan citra. ada yang bertanya pada bagian komentar untuk menghitung intensitas rata-rata. algoritmanya kira-kira begini:

    - konversi citra dari model RGB ke HSV
    - hitung intensitas rata-rata dari komponen H (Hue)
    - untuk mendapatkan warna RGB dari hasil nilai rata-rata tsb dikonversi lagi ke RGB dengan nilai S dan V yang sudah ditentukan (konstan)

    atau bisa berdasarkan himpunan warna yang menjadi kandidat warna dominan. dihitung rata-rata ‘jarak’ antara vektor warna tiap pixel dengan vektor warna kandidat. lalu kandidat dipilih berdasarkan perhitungan jarak minimum.

    @$^$: umm.. klo tanpa punya informasi priori tentang gambar yang diambil (blind) susah juga menentukan letak pixel secara perspektif.. cara computer vision baru bisa menentukan objek secara general (bukan titik) dari analisis scene

  33. $^$ · Mei 31, 2007

    Waduh…jadi analisa secara global yah…bukan titik per titik dari pixel???
    Mungkin kk pebbie ada usul ato cara sederhananya gitu…buat tau yang mana letak benda di belakang ma yg di depan???
    Thx

  34. $^$ · Mei 31, 2007

    Oh ya… klo akses webcam pake DSP Pack bisa akses pixel secara langsung nga???
    Maksudnya gini… setelah preview dari webcam muncul kita langsung dapat akses pixel secara langsung tanpa save dulu ke image(bmp, jpeg, dll)…. misalnya kita mao grayscaling gambar preview webcam secara langsung…. gimana yah???

    Thx

  35. Bianca · Juni 2, 2007

    Hay Pebbie, ikutan tanya yach..
    Aku lagi coba tentang konversi warna, tentang colormap untuk citra hasil infrared termography. Contoh kasusnya untuk penskalaan temperatur, topografi peta, x-ray melalui warna. Aku bingung banget ni buat listing programnya, apalagi ada kalibrasinya juga tuh kayaknya. Bisa bantu aku nggak???
    Kalau enggak keberatan pebbie bisa liat contoh kasusnya di
    http://www.google.co.id –> search gambar:infrared image.
    Tolong ya Peb…

  36. no skill · Juni 9, 2007

    Peb, Mo Nanya:
    1. dpi(dot per inch) itu apa sih?
    2. kalo hubungan antara panjang citra (mis:dalam centimeter)dengan pixel itu gimana ya? maksudnya begini, misal:suatu citra di print ternyata memiliki ukuran panjang 5 cm, berapakah besarnya dalam pixel, bagaimana relasinya ???
    Tenkyu Peb!

  37. lyly · Juli 3, 2007

    Ass
    mo nanya mas,….
    saya lg nyusun tugas akhir nich n sgt btuh bantuan dari mas feb….
    judulx penentuan morfologi sel darah merah berbasis pengolahan citra dan jaringan syafaf tiruan, sofware yg saya pake borland delphi
    nach… yg saya mo tanyakan gimsns menerapkan algoritma jaringan syaraf tiruan dengan delphi, gimana menentukan jumlah pixel dari citra digital dgn delphi, thx bgt b4 , mas feb.

  38. nita · Juli 3, 2007

    saya lg enyelesaikan TA ttg animasi gerak peluru dgn 2 dimensi dengan menggunakan delphi dan saya kesulitan utk penskalaan hasil grafik animasi ( saya diminta utk memperkecil hasil grafik jika melewati area gambar dan memperbesar hasil grafik jika hasil tampak kecil di area gambar). Saya sudah pernah mencoba tetapi haol untuk sudut malah salah (Sudut 60 derajat sama besar dengan sudut2 lainnya) jadi saya mohon bantuannya..trimakasih

  39. pebbie · Juli 4, 2007

    sebelumnya saya mohon maaf karena belum bisa menjawab pertanyaan teman-teman.. saya akhir-akhir ini sedang sibuk menyelesaikan tugas akhir (sidang) dan ada beberapa proyek yang harus diselesaikan. saya coba jawab sedikit dulu ya.

    @ lyly : algoritma jaringan syarafnya ingin diaplikasikan seperti apa ya? saya masih kurang mengerti dengan judulnya penentuan morfologi. coba kirimkan ke e-mail saya saja. algoritma jaringan syaraf tiruan yang pernah saya buat dengan delphi baru algoritma propagasi balik dan waktu itu saya gunakan untuk pengenalan wajah untuk tugas besar kuliah pembelajaran mesin.

    @nita : proses yang nita maksud adalah pengendalian area pandang? kalau demikian, sebelum digambar koordinat-koordinat tersebut ditransformasi dulu dengan transformasi area pandang (view transform).

    – terima kasih masukannya, saya akan coba bahas algoritma (backpropagation+viewing transform) dan implementasinya dalam delphi dalam posting berikutnya. 😉

    @$^$ : mungkin bisa coba kirim sampel gambar yang ingin dianalisis. siapa tahu ada cara sederhananya. kirimnya ke alamat ini : peb_ra at yahoo dot com
    – sebenarnya bisa tanpa harus disimpan dulu ke dalam file, tetapi disimpan ke memori dalam bentuk TBitmap sehingga dapat diakses. coba eksplorasi tentang ‘Grabber’ di salah satu program kecil pada contoh DSPack.

    @bianca : maaf baru bisa berkomentar. saya sudah lihat contoh gambarnya, tapi saya agak kebingungan juga untuk lebih detilnya. mungkin bisa diceritakan lebih lanjut (via e-mail)?

    @no skill : pertanyaan nomor dua sebenarnya jawaban pertanyaan nomor 1. dpi itu adalah ukuran penskalaan resolusi citra (biasanya digunakan dalam pencetakan/penampilan pada monitor). resolusi dpi citra pada umumnya 72(untuk penampilan pada monitor). maksud dari 72 dpi adalah 72 pixel pada citra dapat dianggap sebanding dengan ukuran 1 inchi.

    Wassalam,
    Peb

  40. $^$ · Juli 4, 2007

    Saya uda coba pake DSP pack tapi ternyata tidak bisa akses 2 camera secara langsung…. jadi saya memakai komponen lain….
    Mungkin nga yah misalnya di program saya sudah muncul preview dari webcam trus itu preview ditampung di suatu tempat tapi tanpa menjadikannya dalam format gambar sehinnga langsung dapat diproses…. kk pebbie coba cek web ini yah http://www.roborealm.com saya ingin membuat gambar menjadi grayscale langsung seperti program roborealm tersebut.
    Oh ya saya sudah mencoba properti dari canvas tapi ternyata hasilnya nihil….T_T

    Mohon bantuannya yah….
    Makasih banyak….
    -$^$-

  41. no skill · Juli 8, 2007

    Peb, sori kalo mengganggu (just 4 hobby):
    Pengen nanya nih.. Kalo cara buat sejenis multimedia interactive futuristik dengan TAMPILAN DOS pakai software apa ya? Saya ingin buat TAMPILAN dan cara kerjanya se-tipe dengan yang ada di film2 (box translucent, layar background hitam, tulisan biasanya berwarna hijau menyala, bunyi tit ketika searching), ya kira2 kalo di film tuh adegannya saat seorang intelligen mencari buronan di komputer, atau seorang hacker menerobos password rahasia.
    Kalo tau software ato cara bwtnya toong kasi tau ya Peb.
    Thanks.

  42. indra · Juli 16, 2007

    mo nanya lagi ni mas..

    kok citra pengubinan saya yang saya buat dengan perintah
    ‘somebitmap’.Canvas.Draw(x,y,’somebitmap’);
    kalo digabungkan (blending) dengan image yang lain kok selalu muncul noise y??

    untuk fungsi gabungnya kira-kira seperti ini :

    procedure Tform1.Gabung(im1,im2 : TImage);
    var
    i, j,posisi : integer;
    PC, PC2, PH : PByteArray;
    w1,w2 : real;
    begin
    w1 :=trackbar1.Position;
    w1 := w1/10;
    w2 := 1-w1;

    im2.Picture.Bitmap.Height := im1.Picture.Bitmap.Height;
    im2.Picture.Bitmap.Width := im1.Picture.Bitmap.Width;

    progressbar5.Min := 0;
    progressbar5.Max := (im1.Picture.Bitmap.Width-1)*(im1.Picture.Bitmap.Height-1);

    if (im1.Picture.Bitmap.PixelFormat = pf8bit) then
    begin
    for i := 0 to im1.Picture.Bitmap.Height-1 do
    begin
    PC := im1.Picture.Bitmap.ScanLine[i];
    PC2 := im2.Picture.Bitmap.ScanLine[i];
    PH := image1.Picture.Bitmap.ScanLine[i];
    for j := 0 to im1.Picture.Bitmap.Width-1 do
    PH[j] := Round(PC[j]*w1+PC2[j]*w2);
    posisi := i*j;
    progressbar5.Position := posisi;
    end;
    end;
    if (im1.Picture.Bitmap.PixelFormat = pf24bit) then
    begin
    for i := 0 to im1.Picture.Bitmap.Height-1 do
    begin
    PC := im1.Picture.Bitmap.ScanLine[i];
    PC2 := im2.Picture.Bitmap.ScanLine[i];
    PH := image1.Picture.Bitmap.ScanLine[i];
    for j := 0 to im1.Picture.Bitmap.Width-1 do
    begin
    PH[3*j] := Round(PC[3*j]*w1+PC2[3*j]*w2);
    PH[3*j+1] := Round(PC[3*j+1]*w1+PC2[3*j+1]*w2);
    PH[3*j+2] := Round(PC[3*j+2]*w1+PC2[3*j+2]*w2);
    posisi := i*j;
    progressbar5.Position := posisi;
    end;
    end;
    end;
    end;

    ada solusi??
    makasih banyak sebelumnya

  43. pebbie · Juli 17, 2007

    ada 2 masalah yang saya lihat :
    pf8bit : pengaksesan pixel untuk 8 bit tidak menghasilkan nilai RGB melainkan indeks ke palet 256 warna (tabel 256 elemen RGB). untuk melakukan blending pada citra 256 warna berpalet, setelah nilai RGB hasil blending didapat, indeks pada palet yang memiliki nilai RGB ‘terdekat’ dengan RGB hasil blending yang digunakan sebagai nilai pixel hasil.

    pf24bit : sebaiknya dilakukan clamping yaitu pembatasan nilai ke batas bawah dan batas atas untuk menghindari overflow. jadi kalau hasil rounding bernilai < 0 maka dibulatkan ke 0 sebaliknya jika hasil rounding > 255 maka dibulatkan ke 255.

  44. lyly · Juli 18, 2007

    gmana kbrx mas feb….
    saya dah kirimx email, tp gak nyambung2x…
    alamatx cocok ya peb@pebbie.net

  45. Andy NR · September 12, 2007

    Mau nanya nih, saya lagi buat image encoding dengan metode lsb. Pertama saya scanline image untuk dapetin RGBnya, kemudian nilai rgb saya ubah menjadi biner. dari biner tadi saya buat rgb baru yang jadi warna hitam per 3 nilai biner.
    Saya menggunakan string grid. SG untuk menyimpan nilai rgb perpiksel, SG1 untuk menyimpan nilai biner per piksel, SG3 untuk memcah nilai biner menjadi satu-satu. dan SG4 untuk mengambil nilai biner menjadi RGB baru per pixel. Kemudian dari SG4 di scanline menjadi gambar hitam.
    Tapi yang jadi masalah, waktunya terlalu lama dan sering out of memory. ada ide gimana caranya untuk mempercepat dan meminimalisasi penggunaan memory. Soalnya saya kurang bisa menggunakan TStrings. berikut contoh program yang saya buat.

    procedure TFEncode.GetRgb;
    var i,j:integer;
    marr : PRGBArray;
    begin
    LProses.Caption:=’Process : Retrieving Image RGB’;
    LProses.Refresh;
    Eimage.Picture.Bitmap.PixelFormat:= pf24bit;
    sg.RowCount:=Eimage.Picture.Bitmap.Height;
    sg.ColCount:=Eimage.Picture.Bitmap.Width;

    for j := 0 to Eimage.Picture.Bitmap.Height-1 do begin //iterate row
    marr := Eimage.Picture.Bitmap.Scanline[j];
    for i := 0 to Eimage.Picture.Bitmap.Width-1 do begin //iterate column
    sg.Cells[i,j]:=IntToStr(marr[i].Red)+’,’+IntToStr(marr[i].Green)+’,’+IntToStr(marr[i].Blue);
    end;
    end;
    end;

    procedure TFEncode.GetBiner;
    var
    i,j : integer;
    hasil : TStringList;
    t1,t2,t3,KATA, data:STRING;
    begin
    LProses.Caption:=’Process : Convert Image RGB to Binary’;
    LProses.Refresh;
    sg1.ColCount:=sg.ColCount;
    sg1.RowCount:=sg.RowCount;
    for i:=0 to sg.RowCount-1 do begin
    for j:=0 to sg.ColCount-1 do begin
    kata:=sg.Cells[j,i];
    hasil:=split(kata,’,’);
    t1:=IntTobin(StrToInt(hasil[0]));
    t2:=IntTobin(StrToInt(hasil[1]));
    t3:=IntTobin(StrToInt(hasil[2]));
    data:=t1+’,’+t2+’,’+t3;
    sg1.Cells[j,i]:=data;
    end;
    end;
    end;

    procedure TFEncode.GetLsb;
    var
    i,j,x,y,z : integer;
    hasil : TStringList;
    KATA,temp:STRING;
    begin
    LProses.Caption:=’Process : Encode The Binary’;
    LProses.Refresh;
    sg3.ColCount:=sg1.ColCount*24;
    sg3.RowCount:=sg1.RowCount;
    for i:=0 to sg1.RowCount-1 do begin
    y:=0;
    for j:=0 to sg1.ColCount-1 do begin
    kata:=sg1.Cells[j,i];
    hasil:=split(kata,’,’);
    for z:=0 to 2 do begin
    temp:=hasil[z];
    for x:=0 to 7 do begin
    sg3.Cells[y,i]:=copy(temp,x+1,1);
    y:=y+1;
    end;
    end;
    end;
    end;
    end;

    procedure TFEncode.NewRgb;
    var
    i,j,y : integer;
    t1,t2,t3,data:STRING;
    begin
    LProses.Caption:=’Process : Make The Black Image RGB’;
    LProses.Refresh;
    sg4.ColCount:=sg3.ColCount div 3;
    sg4.RowCount:=sg3.RowCount;
    for i:=0 to sg3.RowCount-1 do begin
    y:=0;
    j:=0;
    repeat
    t1:=sg3.Cells[j,i];
    t2:=sg3.Cells[j+1,i];
    t3:=sg3.Cells[j+2,i];

    data:=t1+’,’+t2+’,’+t3;
    sg4.Cells[y,i]:=data;
    j:=j+3;
    y:=y+1;

    until j>sg3.ColCount;
    end;
    end;

    procedure TFEncode.GetBImage;
    var mbmp : TBitmap;
    size, mw, mh, x, y : integer;
    marr : PRGBArray;
    KATA:STRING;
    hasil : TStringList;
    begin
    LProses.Caption:=’Process : Making Black Image’;
    LProses.Refresh;
    mbmp := TBitmap.Create;
    mbmp.PixelFormat := pf24bit;
    mbmp.Width := sg4.ColCount;
    mbmp.Height := sg4.RowCount;
    mw := mbmp.Width; mh := mbmp.Height;
    marr := mbmp.ScanLine[0];
    size := Integer(mbmp.ScanLine[1]) – Integer(mbmp.ScanLine[0]);

    for y := 0 to (mh – 1) do begin
    for x := 0 to (mw – 1) do begin
    //the heart of our mechanism – this loop goes through pixels of each row
    //and we can modify contents of each pixel’s color data
    kata:=sg4.Cells[x,y];
    hasil:=split(kata,’,’);
    marr^[x].Red :=strtoint(hasil[0]);
    marr^[x].Green := strtoint(hasil[1]);
    marr^[x].Blue := strtoint(hasil[2]);
    end;
    Integer(marr) := Integer(marr) + size;
    end;
    EHasil.Picture.Graphic:=mbmp;
    HW.Caption:=inttostr(mbmp.Width);
    HH.Caption:=inttostr(mbmp.Height);

    mbmp.Free;
    end;

  46. pebbie · September 13, 2007

    Tapi yang jadi masalah, waktunya terlalu lama dan sering out of memory. ada ide gimana caranya untuk mempercepat dan meminimalisasi penggunaan memory.

    hehehe.. pake stringgrid sih..
    terlalu banyak konversi string to integer dan sebaliknya yang jadi lama

    langsung nyemplung ke scanline aja dan beroperasi pada tipe data numerik (integer)..

  47. nonik · September 16, 2007

    mas bagaimana cara mendapatkan nilai pixels biner atau monochrom

  48. pebbie · September 17, 2007

    @nonik: cara sederhananya (walau kurang efisien secara memori) dengan mengonversi bitmap dari format pixel pf1bit atau pf4bit menjadi pf24bit. untuk bitmap yang format aslinya adalah biner maka nilai pixel RGB yang ada hanya (0, 0 ,0) dan (255, 255, 255). untuk memeriksa cukup menggunakan properti r (warna merah).

  49. nonik · September 17, 2007

    mas,maksud saya tu bagaimana caranya untuk mendapatkan nilai pixels biner(monochrome) dengan nilai 0 untuk warna hitam dan 1 untuk warna putih,tolong dijawab ya dan kasi tau programnya yang lengkap!!! Makasih banyak ya mas Peb…tak doain semoga cepet selesai TA-nya

  50. arfan · September 17, 2007

    mas,boleh ga’ kalo saya nanya’ yang bukan masalah citra digital tapi masalah bahasa automata dan teknik kompilasi karena saya bingung harus nanya ke siapa, yang saya tau cuma GAIBlog ini ja, dan kayaknya semua tanya jawab disini cuma mengenai masalah citra digital, makanya saya nanya’ gitu!?! gimana mas?atau kalo mas tau soal tanya jawab masalah bahasa automata dan kompilasi, tolong mas kasi tau! Makasih…

  51. yadi · September 19, 2007

    Mas pebbie..saya minta tolong ni…
    saya buat fungsi untuk baca image bmp grayscale kemudian saya mau ubah nilai matriks pixel bmp ke dalam baris(array) dengan metode zig-zag misalnya.
    matriks 4 x 4
    23 10 3 1
    9 7 2 0
    8 1 0 0
    4 1 0 0

    jadi kalo di ubah ke dalam baris [23 10 9 8 7 3 1 2 1 4 1 0 0 0 0 0]

    saya udah coba buat fungsi untuk matrik ke baris dan posting di delphi-id juga tapi
    dengan metode berurutan yaitu baris1 lanjut baris selanjutnya.

    gimana mas peb ya kalo dengan metode zig-zag tersebut buat ubah nilai pixel ke baris dengan metode zig-zag……mohon bantuannya mas peb..

    unit UnitBacaImage;
    interface
    uses Unit1,Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, ExtCtrls, ComCtrls, Buttons, StdCtrls, ExtDlgs;

    Function BacaImage(x :Timage): Pmatrik;
    implementation
    Function BacaImage(x :Timage): Pmatrik;
    var
    h,w,i,j : integer;
    grey : PMatrik;
    PH :PbyteArray;
    begin
    h := x.Picture.Height;
    w := x.Picture.Width;
    setlength(grey,h,w);
    for i:= 0 to h – 1 do
    begin
    PH := x.Picture.Bitmap.ScanLine[i];
    for j:= 0 to w – 1 do
    begin
    grey[i,j]:= PH[j];
    End;
    End;
    BacaImage := Grey;
    end;
    end.

    unit UnitMatrikJadiBaris;
    interface
    uses Unit1,Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,
    Dialogs,ExtCtrls,ComCtrls,Buttons,StdCtrls,ExtDlgs;

    function matrikjadibaris(B : PMatrik) : PArray;
    implementation
    function matrikjadibaris(B : PMatrik) : PArray;
    var
    i, j, baris, kolom : integer;
    indeks : integer;
    deret : PArray;
    begin
    setlength(deret, length(B)*length(B[0]));
    baris := length(B);
    kolom := length(B[0]);
    indeks := 0;
    for i := 0 to baris – 1 do
    begin
    for j := 0 to kolom – 1 do
    begin
    deret[indeks] := B[i][j];
    inc(indeks);
    end;
    end;
    matrikjadibaris := deret;
    end;
    end.

    procedure TForm1.BitBtnWatermarkingClick(Sender: TObject);
    var
    hasilpixel : PArray;
    k : integer;
    ww : textfile;
    begin
    data1 := BacaImage(formcitra.Image1);
    barispixel := matrikjadibaris(data1);
    end;
    end.

    mungkin ini saja mas pebbie…mohon maaf, terima kasih….

  52. pebbie · September 24, 2007

    @nonik : sudah cari di google dulu? keywordnya image thresholding

    @arfan : boleh-boleh saja diskusi tentang otomata dan kompilasi. silakan tulis di bagian request.

    @yadi : hoo.. maksudnya yang di delphi-id itu toh.. oke saya coba dulu di rumah deh.. lagi di warnet nih.. baru bisa online lagi..

  53. Ping-balik: Zig-Zag Image Scanning « GAIBlog
  54. yadi · September 25, 2007

    asswrwb
    Mas pebbie..saya lagi sedang ngerjain juga…
    kebetulan dapet algoritma di matlabnya…untuk scan matriks zigzag(M x N)..
    dan udah saya terjemahanin ke delphinya…
    cuman masih ada hangnya aja…setelah di running…
    saya akan coba terus mas pebbie…
    doain ya mas pebbie….
    terima kasih…jadi malu ni….
    wasswrwb…

  55. yadi · September 25, 2007

    Terima kasih banyak mas pebbie….
    aduh udah hampir sepekan saya nih ngerjainnya…
    alhamdulilllah akhirnya ada solusinya juga…
    sekali lagi terima kasih mas pebbie..
    good success selalu buat mas peb..aminn…ya rabbal ‘alamin.

  56. mukti · Desember 26, 2007

    mas mau nanya nih gimna cara buat program dg delpi untuk nampilkan matrik dari gambar bitmap? Thanks sblmnya

  57. yadi · Januari 17, 2008

    Mau nanya ni…
    Saya ubah gambar RGB ke grayscale / keabuan pakai metode YIQ, sehinggan natinya yang diambil adalah komponen Y saja untuk gambar keabuannya menurut teori yang ada, formulanya dapet dari matlab.
    kalo di buku pengolahan citra pake delphi (pak ahmad balzah ada) cuman harus pake metode YIQ ini
    Tapi kenapa hasil konversinya itu bukan seperti gambar grayscale melainkan seperti gambar klise Photo( gambar negatif album photo)

    Saya deklarasikan tipe
    type
    PMatrik = array of array of real;
    DWarna = record
    biru : PMatrik;
    hijau : PMatrik;
    merah : PMatrik;
    end;
    YIQ = record
    Y : PMatrik;
    I : PMatrik;
    Q : PMatrik;
    end;
    public
    pixelRGB : Dwarna;
    keabuan : YIQ;
    pixelkeabuan,pixelkeabuan2 : PMatrik;

    Fungsinya seperti ini :
    function RGBtoYIQ(X : DWarna): YIQ;
    var
    y : YIQ;
    h,w,j,i : integer;
    begin
    h := length(x.biru);
    w := length(x.biru[0]);
    setlength(y.Y,h,w);
    setlength(y.I,h,w);
    setlength(y.Q,h,w);
    for i:= 0 to h – 1 do
    for j:= 0 to w – 1 do
    begin
    y.Y[i,j] := 0.299*(x.merah[i,j]) + 0.857*(x.hijau[i,j]) + 0.114*(x.Biru[i,j]);
    y.I[i,j] := 0.596*(x.merah[i,j]) – 0.274*(x.hijau[i,j]) – 0.322*(x.Biru[i,j]);
    y.Q[i,j] := 0.211*(x.merah[i,j]) – 0.523*(x.hijau[i,j]) + 0.312*(x.Biru[i,j]);
    end;
    RGBToYIQ := y;
    End;

    Kemudian saya load gambar RGB
    procedure TFormUtama.Button6Click(Sender: TObject);
    var
    fcrgb : string ;
    begin
    if (openpicturedialog2.Execute) then
    begin
    if (form2 = nil ) then
    application.CreateForm(TForm2, form2);
    form2.Image1.Picture.LoadFromFile(openpicturedialog2.FileName);
    form2.ClientHeight := form2.Image1.Picture.Height;
    form2.ClientWidth := form2.Image1.Picture.Width;
    form2.ClientHeight := form2.Image1.Picture.Height;
    case
    (form2.Image1.Picture.Bitmap.PixelFormat) of
    pf1bit : fcrgb := ‘biner’;
    pf8bit : fcrgb := ‘keabuan’;
    pf24bit : fcrgb := ‘true color’;
    end;
    end;
    end;

    kemudian lakukan konversi RGB ke grayscale
    procedure TFormUtama.Button7Click(Sender: TObject);
    begin
    pixelRGB := BacaImageRGB(form2.Image1);
    keabuan := RGBtoYIQ(pixelRGB);
    pixelkeabuan2 := keabuan.Y;
    edit4.Text := inttostr(length(keabuan.I));

    if (form3 = nil) then
    application.CreateForm(TForm3, form3);
    form3.Left := form3.Left + 120;
    form3.Top := form3.Top – 25;
    end;

    di form3nya untuk menampilkan citra grayscalenya listingnya seperti ini :
    unit Unit3;
    interface
    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, ExtCtrls;
    type
    logpal = record
    lpal : Tlogpalette;
    entry : array [0..255] of TPaletteEntry;
    end;
    type
    TForm3 = class(TForm)
    Image1: TImage;
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;
    var
    Form3: TForm3;
    paletkeabuan : logpal;
    implementation
    uses
    unitutama;
    {$R *.dfm}

    Procedure GambarIDwt(y:PMatrik;x:Timage);
    var
    PH : PbyteArray;
    bitmap2 :Tbitmap;
    i,j,p :integer;
    begin
    x.Height :=length(y);
    x.Width :=length(y[0]);
    bitmap2 := Tbitmap.Create;
    bitmap2.Height :=length(y);
    bitmap2.Width :=length(y[0]);
    x.Picture.Graphic := bitmap2;
    x.Picture.Bitmap.PixelFormat:= pf8bit;
    x.Picture.Bitmap.Palette := createpalette(paletkeabuan.lpal);
    for i:= 0 to length(y)- 1 do
    begin
    PH := x.Picture.Bitmap.ScanLine[i];
    for j:= 0 to length(y[0])- 1 do
    begin
    p := round(y[i,j]);
    PH[j]:= p;
    end;
    end;
    end;

    procedure TForm3.FormCreate(Sender: TObject);
    var
    i :integer;
    begin
    paletkeabuan.lpal.palVersion := $300;
    paletkeabuan.lpal.palNumEntries := 256;
    for i := 0 to 255 do
    begin
    paletkeabuan.entry[i].peRed := i;
    paletkeabuan.entry[i].peGreen := i;
    paletkeabuan.entry[i].peBlue := i;
    end;
    end;

    procedure TForm3.FormShow(Sender: TObject);
    begin
    GambarIDwt(formutama.keabuan.Y,Image1);
    end;
    end.

  58. slack_v9 · Januari 30, 2008

    Selamat sore

    artikel ini bisa buat analisa pixel sebuah gambar tidak? kaya aplikasi Digital Mark Reader gitu deh, klo bisa kasih tau sintaks contohnya ya

    Terima kasih

  59. ne2k · Februari 2, 2008

    bantu aku ya…. aku mau bikn program delphi untuk konversi bitmap semua bit depth ke format 24bit. ntar bitmapnya mau aku break trus direkonstruksi lg by pixels RGB nya.help me ya… makasih

  60. Lukman · Februari 29, 2008

    Salam. Mas, numpang ny ya…
    1. gimana ya menghitung jarak antara dua titik dalam koordinat logis, mungkin ada source codenya?
    2. gmn cara konversi dari koordinat titik pada canvas/image ke DBGrid?
    Terima kasih sebelumnya.wassalam

  61. tia · Maret 26, 2008

    Salam mas, mo nanya2 ya….
    1. gimana cara untuk membuat absis dan ordinat dari suatu gambar???klo bisa ama source codenya ya mas.
    2. bagaimana cara mendeteksi posisi pointer dalam gambar?? jadi ketika pointer menunjukkan satu titik di gambar, maka komponen x dan y-nya bisa diketahui.
    3. dari gambar topografi, untuk menentukan ketinggian, apa harus di define satu2 warna dan ketinggiannya???
    Makasi mas……….

  62. pebbie · Maret 26, 2008

    @Lukman:
    1. pakai euclidean distance/panjang vektor aja? len := sqrt(dx*dx+dy*dy)
    2. aku tak mengerti pertanyaannya.
    @tia:
    1. aku tak mengerti pertanyaannya.
    2. pake event handler OnMouseMove aja
    3. kalau warnanya ada dalam fungsi tertentu (mis. greyscale) tinggal ditentukan aja berapa tinggi pada intensitas pixel minimum dan maksimum

  63. CUNGKRING · Mei 26, 2008

    mau bertanya ? kalo image itu bisa dimisalkan dengan matriks

    lagi ta neeh .ada yang tau ga penggabungan image jadi satu(panorama) algoritmanya apaan?

  64. pebbie · Mei 26, 2008

    @CUNGKRING: “image registration”

  65. cungkring · Mei 27, 2008

    sayah masih bingung neeh kalooo penggabungan images bisa di gambarkan dengan matriks transformasi refleksi gak.
    image mosaik dan image split algoritmanya kaya gimana bisa bantu in mencarikannya ? web nya apaan

  66. lukman · Juni 18, 2008

    maaf mas kl pertanyaanya membingungkan yang no 2. ibu maksudnya. kita punya satu titik di image, kemudian kita proses menjadi data di dalam tabel. Gmana ya mas, cranya. terima kasih seblumnya.

  67. pebbie · Juni 18, 2008

    @lukman: saya masih tidak mengerti dengan pertanyaannya. maksud proses itu apa dan hasil proses (data di dalam tabel) itu seperti apa.

  68. 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.

  69. muna · Agustus 8, 2008

    Mas….mau nanya. aq lagi bikin kompresi citra bitmap pake huffman coding.
    Aq bingung nyimpen hasil code binernya untuk nanti proses dekompresi.
    Apakah disimpan dalam matrik atau gimana tolong ya mas….thanks

    • seta · Juli 16, 2010

      boleh ga share ma aku mengenai kompresi citra huffman??

  70. pebbie · Agustus 8, 2008

    @muna: hasil dekompresi bisa disimpan sementara ke dalam matriks sebelum ditransfer ke bitmap atau file

    • seta · Juli 16, 2010

      mas muup mw tanya ne….untuk kompresi citra dengan huffman itu langkah penyusunan koding yang tepat tu kek gimana mas? tengs.

  71. muna · Agustus 15, 2008

    halo…mas mau nanya lagi nih. nilai2 piksel kalo aq copy ke canvas image kok ada warna merah itu kenapa ya?

    Aq pernah nyoba nilai piksel gambar aku taruh di stringGrid, terus aq copy lagi ke canvas . Kok ada warna merahnya. makasih sebelunya

  72. pebbie · Agustus 15, 2008

    @muna: kemungkinan nilai yang anda masukkan bernilai 0-255 sedangkan format pixel (properti PixelFormat) dari bitmap image (Image.Picture.Bitmap) bukan pf8bit (pf24bit atau pf32bit). sehingga yang anda atur hanya nilai merahnya saja. *mungkin?*

  73. muna · Agustus 16, 2008

    mas,makasih infonya. Format pixel yang saya masukkan memang 8bit ( grayscale), tetapi di kanvas kok tetep merah. tolong ya mas ya?………makasih.

  74. pebbie · Agustus 16, 2008

    format pixel 8 bit bukan berarti grayscale (ini kesalahpahaman yang sering terjadi). format pixel 8 bit itu maksudnya setiap pixel menyimpan informasi indeks ke tabel Palet yang elemennya berisi informasi RGB. Bitmap dengan format pixel 8 bit mampu menggunakan model warna RGB tetapi banyaknya warna (kombinasi RGB) maksimum yang dapat ditampilkan hanya 256 warna saja.

  75. muna · Agustus 16, 2008

    Alow mas pebbie….
    Mau nanya lagi neh. Masih bingung..maklum ilmunya masih dangkal.

    Misalkan ada program simpan nilai piksel ke stringgrid spt ini

    if( image1.Picture.bitmap.PixelFormat= pf8Bit) then
    begin
    for y := 0 to image1.Picture.Height-1 do
    begin
    Pimg := image1.Picture.Bitmap.ScanLine[y];
    for x := 0 to image1.Picture.Width-1 do
    begin
    ST.Cells[x,y] := IntToStr(Pimg[x]);
    end;
    end;

    Terus dari nilai2 di cell stringGrid aq simpan di image canvas begini

    image2.ClientHeight:=St.colCount;
    image2.ClientWidth:=St.RowCount;

    for j:=0 to image2.Height-1 do
    for i:=0 to image2.Width-1 do
    form1.Image2.Canvas.Pixels[i,j]:= strtoint( st.cells[i,j]);

    Hasilnya gambarnya ada merah2nya n setelah aq liat nilai pikselnya kok lain…..Nilainya sekitar 31-an…..

    Terus yang bener gimana mas biar nilai dari stringGrid jadi nilai piksel di image itu?

    Thanks bgt ya mas………..
    Mohon responnya

  76. pebbie · Agustus 16, 2008

    kalau gambarnya greyscale waktu menulis kembali ke canvas seperti ini :

    tmp := strtoint(st.cells[i,j]);
    form1.image2.Canvas.Pixels[i,j] := RGB(tmp, tmp, tmp);

    atau PALETTERGB(tmp, tmp, tmp)

  77. muna · Agustus 17, 2008

    muna lagi nih mas, yang kmarin tak coba sdh bisa, tapi nilai pixel nya jadi berubah ya? makasih buuuanget ya. Kalau gambarnya 8 bit yang bukan grayscale (RGB) menuliskan kanvasnya gimana? thanks ya……di tunggu.

  78. muna · Agustus 26, 2008

    Mas peb…..
    Mau tanya…. Caranya menuliskan ke canvas untuk indeks palet gimana (citra 8 bit) .
    Yang mana nilai indeks paletnya dari stringgrid.
    Mohon rsponnya ya mas. Dah nyari2 ga bisa juga

    maksih

  79. pebbie · Agustus 26, 2008

    kalau untuk citra 8 bit, pakai ini (komponen TBitmap)
    procedure putpixel(bmp: TBitmap; x,y:integer; idxwarna:byte);
    var
    p : PByteArray;
    begin
    p := bmp.Scanline[ y ]; { asumsi bmp.PixelFormat = pf8bit; }
    p[ x ] := idxwarna;
    end;

  80. mei · Oktober 25, 2008

    bie mau nanya..
    saya baru belajar ttg image masih pemula.
    1. misalnya ada citra ukuran 30×30 apakah berarti jumlah pixelnya = 900?
    2. gimana mencari nilai masing2 R dan G dan B dari sebuah citra RGB, apakah ada rumusnya?
    3. apakah citra RGB itu harus dirubah ke Greyscale dulu untuk mendapatkan informasi nilai matriksnya?
    makasih jawabannya,..

  81. pebbie · Oktober 25, 2008

    @mei: silakan, saya jawab sebisanya yah.
    1. betul.

    2. citra RGB bisa jadi beberapa macam
    – citra 4 atau 8 bit, maksudnya tiap pixel direpresentasikan dengan byte (8 bit) atau satu byte untuk 2 pixel. oleh sebab itu nilai yang mungkin adalah sebanyak 256 kombinasi warna. 256 kombinasi warna ini menggunakan tabel look-up yang berisi nilai RGB. jadi belum tentu pixel bernilai 0 itu hitam (R=0, G=0, B=0) tetapi tergantung pada nilai RGB di tabel palet indeks ke 0 (bisa saja justru di tabel palet indeks ke 0 kita berikan warna putih (R=255, G=255, B=255))

    – citra 16 bit, jadi tiap pixel direpresentasikan sebagai 2 byte (16) bit. citra 16 bit sudah mengalokasikan nilai RGB pada tiap pixel/titiknya jadi tidak memerlukan tabel palet. yang perlu diperhatikan adalah bagaimana nilai RGB dikodekan ke variabel berukuran 16 bit. kemungkinan yang umum ada 2 yaitu tiap komponen warna mendapat jatah 5 bit sehingga 1 bit sisanya tidak terpakai. atau komponen yang ada di tengah (hijau) mendapat jatah lebih yaitu 6 bit (R5G6B5).

    – citra 24 bit, tiap pixel direpresentasikan sebagai 3 byte. oleh sebab itu tiap komponen mendapat jatah 1 byte. kemungkinan warna yang dihasilkan adalah 2 milyar warna.

    – citra 32 bit, tiap komponen tetap dialokasikan sebagai 1 byte namun 1 byte terakhir kalau digunakan maka biasanya berisi informasi untuk operasi penggabungan citra (image blending).

    untuk mendapat nilai RGB dari citra bisa baca lagi tulisan saya di atas dari awal menggunakan Pixels dan 3 fungsi Get[R,G,B]Value(dword)

    3. tidak harus, tergantung nilai apa yang ingin didapat. kalau memang informasi yang diinginkan adalah intensitas (luminansi) maka betul, harus dikonversi atau tiap pixel dimasukkan ke fungsi penghitung nilai intensitas luminansinya. kalau informasi yang diinginkan adalah spektrum warna (hue) maka lain lagi.

  82. Yohanes · Oktober 29, 2008

    Mas, senang bisa nemuin blog ini,
    Ada mau nya se he…
    Gini mas, q mw bikin aplikasi pake JST backpropagation tp mw gunain delphi, masalahnya q nda ngerti gmn untuk source coding algoritmanya pada delphi, bs bantu mas?
    Thanks ya…

  83. Agnes · Oktober 29, 2008

    Mas Feb, untuk ekstrasi audio bisa pake metode LPC (linier predictive Coding) kan? trus untuk aplikasinya bisa pake delphi? ada codingnya nda? Kalau untuk transformasinya sinyal pake apa? thanks banget……….

  84. pebbie · Oktober 31, 2008

    @Yohanes:sabar ya, baru masuk antrian draft posting. mudah-mudahan minggu depan sudah bisa ditampilkan pembahasan dan implementasinya dengan delphi.

    @Agnes: ya, LPC bisa digunakan untuk menganalisis sinyal dalam ranah sekuensial (mis. suara). tapi saya belum pernah membuat implementasinya. 🙂

  85. derim · November 1, 2008

    nih saya derim. di delphi-id yang nanya tentang extract warna.

    1. apa bedanya akses pixel dengan scanline?
    2. apa maksud nilai y dibawah ini:

    p := b.Scanline[y];

  86. pebbie · November 1, 2008

    @derim: akses menggunakan Pixels lebih lambat dan menghasilkan TColor, untuk mendapatkan nilai komponen R,G,dan B-nya perlu menggunakan fungsi lain (misal GetRValue(c)) sedangkan kalau menggunakan scanline yang dihasilkan adalah pointer ke memori yang menyimpan masing-masing pixel dalam representasi yang bergantung pada nilai PixelFormat. untuk kasus di atas saya asumsikan PixelFormat-nya bernilai pf24bit. jadinya, tiap pixel disimpan sebagai 3 byte. maksud y itu adalah baris (nilai yang valid adalah 0 sampai Tinggi Bitmap atau banyaknya baris dikurangi 1). baris pertama (y=0) adalah baris yang paling atas.

  87. irno · November 1, 2008

    wah makasih bgt mas pebbie…

    buat mas Yohannes, kok sama yaw keinginan dan maksud kita…

    saya juga menunggu lho Mas Pebbie…

    semoga ilmu Anda yang bermanfaat kelak menjadi pendamping setia di alam baka..

    terima kasiiih

  88. Princess · November 14, 2008

    hai..mas… ato siap yang bisa bantu aq , cara mendeteksi wajah pada hasil pengambilan gambar dari webcam ya(face rezognation)!!!dan kalo bisa dikasi sorce codenya dengan menggunakan delphi. AQ baru bisa sampe proses pengolahan image itu sampe proses treshold, bagai mana cara selanjutnya agar kita dapat meng akses wajh orang pada gamabr yang bergerak, bukan gambar statis kayak photo, tapi hasil gambar pada pengambilan dari web cam,

  89. Pangeran · November 22, 2008

    Salam kenal k,,aq dari kupang,aq senang ktmu blog ini..
    pertanyaannya:

    1. KK tahu caranya membersihkan canvas pada image, maksudnya gini,,Sebagai contoh: Dalam 1 aplikasi aq taruh 1 bh image,1 buah button yg captionnya “persegi” dgn sintaks image1.canvas.rectangle(100,200,400,600),lalu ada 1 bh button yg captionnya “New/Baru”,,nah kk tahu sintaks untuk tombol “baru”,,tolong ya k..

    2. dalam procedure floodfill,ada parameter Tfillstyle,,untuk mengisi Tfillstyle contohnya adalah fsborder,selain fsborder nasih ada yg lain ?? Tolong buat daftarnya yah.. soalnya pada turbo pascal fillstyle nya agak beda dgn pada delphi.

    3. kk tahu caranya menggerakkan citra pada image delphi sehingga bisa di simpan dengan ekstensi GIF..? klo bisa dengan cintohnya ya

  90. Pangeran · November 22, 2008

    oh iya masih ada yg ingin tahu nih..
    – Secara Default pixelFormat pada Timage brp bit ?? lalu klo mw pakai 24 bit bgmana caranya supaya gmbr rectangle atau ellips dsb bisa ditampilkan di image

    – Apa image dgn pixelFormat 24bit lebih bagus gambarnya jika dikonversi menjadi jpg/bmp image

    – lalu apa perbedaan terbesar dari pixel yg berformat 8bit,24bit,32bit dll,tolong ya kk

    – Tolong juga kasi daftar style untuk Brushstyle dan Penstyle pada canvas image

    – Yg terakhir untuk procedure ARC, aq rada-rada bingung nih,soalnya parameternya sdkt berbeda dgn di pascal, Procedure ARC(x1:integer;y1:integer;x2:integer;y2:integer;x3:integer;y3:integer;x4:integer;y4:integer);
    x1,y1-x2,y2 aq ngerti tapi x3,y3,x4,y4 aq bingung jadi misalnya diaplikasikan dengan SpinEdit yg memiliki nilai integer..aq harus kasih maxvaluenya berapa untuk x3,y3,x4,y4..jelaskan dong x3,y3 dan x4,y4 supaya misalnya arc yg ingin dibentuk bisa jadi sesuai dgn yg diinginkan…

    makasih banyak ya atas jawabannya……….

  91. pebbie · November 23, 2008

    @pangeran :
    1. clear canvas : pakai saja FillRect seperti berikut
    with image1.canvas do begin
    Brush.Style := bsSolid;
    Brush.Color := clWhite; { warna latar belakang, misal putih }
    Pen.Style := psClear;
    FillRect(Image1.ClientRect);
    Pen.Style := psSolid;
    end;

    2. dari definisi floodFill sbb
    procedure FloodFill(X, Y: Integer; Col: TColor; FillStyle: TFillStyle);
    parameter FillStyle ada 2 yaitu:
    – fsBorder : ini mirip boundary fill, arsir akan dilakukan sampai ketemu pixel berwarna Col (sebagai batas)
    – fsSurface : arsir dilakukan selama pixel yang ditemui warnanya sama dengan Col

    3. maaf, nggak bisa bantu (silakan cari sendiri di google) 😉

    4. default pixelformat saya tidak tahu, sepertinya kalau tidak pf32bit maka akan mengikuti setting display monitor.

    5. untuk menggambar (rectangle, elips) tidak terpengaruh oleh properti PixelFormat. gunakan saja prosedur gambar dari TCanvas

    6. bit depth (pixel format) akan mempengaruhi sebanyak apa kombinasi warna yang bisa disimpan dalam image. misal untuk pf8bit maka kombinasi warna yang mungkin hanya sebanyak 28 atau 256 warna saja. sedangkan 24 bit dapat menyimpan kombinasi warna merah sebanyak 256 warna, hijau, dan biru sehingga total sebanyak ~ 2 milyar warna (oleh sebab itulah disebut true color), 16 bit dapat menyimpan kombinasi 65 ribu warna. khusus untuk 32 bit, banyaknya warna yang bisa disimpan sama dengan 24 bit, sedangkan 8 bit sisanya biasanya tidak digunakan atau digunakan untuk menyimpan informasi transparansi (alpha channel) untuk melakukan penggabungan (blending) citra.

    7. daftar style bisa dilihat sendiri di Help delphi

    8. prosedur Arc (garis lengkung)

    parameter x1y1 dan x2y2 sama seperti menggambar elips

    dengan tambahan x3y3 dan x4y4, parameter ini adalah parameter untuk membatasi garis elips yang digambar. misal dari titik tengah elips (misal x0y0) ditarik garis ke x3y3 dan x4y4 maka garis elips yang digambar hanyalah dari titik perpotongan garis elips dengan garis x0y0-x3y3 dan perpotongan garis elips dengan garis x0y0-x4y4 melawan arah gerakan jarum jam.

  92. teamburger · November 25, 2008

    Mas Pebbie, maaf kalo mau ngerepoti ….. (udah stress banget)
    saya coba2 mau ganggu image hasil steganografi,
    bisa minta tolong dikasih lihat full-script untuk menampilkannilai RGB dalam stringgrid?
    saya udah coba script mas Pebbie diatas (jawaban untuk mas Tris), tapi kok ga berhasil terus.
    kalo bisa caranya mengembalikan nilai di stringgrid ke image lagi, please
    Oh ya … saya ngeload gambarnya pake openpicture dialog.
    tolong mas ya, rencananya saya mau ubah nilai RGB tersebut dengan nilai yang lain (seakan2 image yang dikirim terkena noise), sehingga saat dikembalikan ke image lagi apakah data yang tersembunyi didalamnya masih bisa dipertahankan …

  93. pebbie · November 26, 2008

    @teamburger:kalau tujuannya mau dikembalikan lagi ke image lebih baik nggak perlu ke stringgrid, soalnya cuma buang2 waktu aja. lebih baik langsung diubah di pixelnya. pakai saja kode getpixel dan putpixel di atas. jadi prosesnya

    – baca nilai RGB (pakai GetPixel)
    – ubah nilai RGB (r, g, dan b)
    – tulis kembali ke image (pakai PutPixel)

  94. artzan · November 27, 2008

    misal saya punya image diform
    bagaimana caranya agam image tersebut memutar gambar 90 drjt, 180 drjat dgn menggunakan pixel dan gimana caranya memutar vertikal dan horizontal
    tks….

  95. Pangeran · November 28, 2008

    klo buat warna background pada image aq menggunakan akses pixel dgn colordialog
    sehingga sintaksnya canvas.pixel[i,j]:=colordialog1.filename,,dgn i,j adalah image width dan image height..kk bisa kasih sintaks dgn scanline,untukpemilihan warnanya aq menggunakan colordialog.

  96. Pangeran · November 30, 2008

    sebenarnya aq lgi susun skripsi,bisa minta pendapat k pebbie..waktu kuliah grafika komputer kami menggunakan pascal..sekarang aq coba buat seperti itu utk menampilakan citra di delphi..kira-kira judul apa yang pa bwt skripsis..soalnya aq bingung menyusun kata-kata yg pas bwt menentukan judul

  97. pangeran · Desember 8, 2008

    sebenarnya aq lgi susun skripsi,bisa minta pendapat k pebbie..waktu kuliah grafika komputer kami menggunakan pascal..sekarang aq coba buat seperti itu utk menampilakan citra di delphi..kira-kira judul apa yang pas bwt skripsis..soalnya aq bingung menyusun kata-kata yg pas bwt menentukan judul..

  98. Yohanes · Desember 11, 2008

    Mas Pebbie, gmn tuh pembahasan dan implementasi JST algoritma backpropagation dengan delphi?
    He…menagih janji nih,^_^
    Sibuk ya Mas…

  99. echy · Januari 18, 2009

    mas,sorry neh mo nanya tentang J2ME,ada ga’method untuk mengambil pixel di J2ME?
    thanks

  100. pebbie · Januari 18, 2009

    @echy: pakai method getRGB dari class Image

    int[] imageData = new int[inputImage.getWidth() * inputImage.getHeight()];
    inputImage.getRGB(imageData, 0, inputImage.getWidth(), 0, 0, inputImage.getWidth(), inputImage.getHeight());

    nanti untuk mengakses tiap pixelnya (r, g, b) di posisi (X, Y) dari image data pakai formula

    int pixel = imageData[Y * inputImage.getWidth() + X];
    int r = 0xFF & (pixel >> 16);
    int g = 0xFF & (pixel >> 8);
    int b = 0xFF & pixel;

  101. Pangeran · Februari 17, 2009

    k pebie kenapa nama komponen di delphi awalannya selalu huruf ‘T’ ? sepert Tcanvas,Tbutton,Tform dlll
    Apa artinya atau singkatannya..
    Makasih ya

  102. pebbie · Februari 17, 2009

    Pangeran: itu cuma kesepakatan penulisan aja kok.. untuk menyatakan bahwa itu adalah tipe baru (baik itu sebagai kelas atau record) sehingga kalau memberi nama variabel tinggal membuang ‘T’nya saja (contoh praktisnya).

  103. pangeran · Februari 21, 2009

    ka misalnya klo untuk objek bitmap tipe datanya Tbitmap, klo giv ..?
    makasih

  104. pangeran · Februari 25, 2009

    ka klo pada objek edit kita bisa melakukan setfocus dgn menekan tombol enter pada keyboard misalnya dgn perintah pada event onkeypress
    if key =#13 then edit2.setfocus;
    kenapa pada object spinedit tidak bisa ,,kk tau caranya…?

  105. Adnan · Maret 11, 2009

    Salam kenal pak Peb Ruswono Aryan
    Nama saya adnan, alumni teknologi pascapanen IPB. Pertama berkenalan dengan citra digital saat ambil kuliah matakuliah ini. Semenjak itu bisa dibilang saya jatuh cinta dengan ilmu pengolahan citra digital ini, hanya sayang saya tidak mengerti banyak tentang bahasa pemrograman karena latar belakang bukan ilmu komputer tapi pertanian.

    Di bidang pascapanen, Image process sangat berguna untuk inspeksi atau sortasi hasil panen, atau mengamati perubahan warna pada hasil panen selama penyimpanan. Dengan citra digital ini, tentu pengamatan warna dan tekstur tersebut menjadi sangat cepat dan relatif murah. Bayangkan saja, alat standar untuk pengamatan warna skala lab paling muran harganya Rp 40 juta (pasti sekarang harganya lebih mahal lagi). sedangkan dengan ilmu image process cukup bermodalkan program aplikasi, web kamera dan buku pemrograman:-).

    Program pengamatan warna yang pernah saya buat untuk tesis saat itu dalam bahasa basic. Sekarang saya mencoba belajar untuk membuatnya dalam bahasa delphi.
    Saat ini saya menjadi peneliti pasca panen di BPTP Papua. Alat-alat pasca panen yang menunjang untuk penelitian pascapanen bisa dibilang tidak ada disini. jadi yang bisa saya gunakan untuk tool penelitian pascapanen adalah image process ini. Saya ke pulau yang besarnya 3 kali pulau jawa ini hanya bermodal laptop, web cam dan buku delphi.
    Saya minta bantuan pak peb. Misalkan saya ingin menampilkan warna merah (kalau sudah bisa ketemu nanti juga bisa untuk mencari nilai D, B dan HSI pastinya). Dengan algoritma yang mirip waktu saya buat menggunakan VB, ternyata tidak bisa diterapkan di delphi. Dari beberapa literatur yang saya dapat, saya membuat seperti ini kode delphinya:

    procedure TFormUtama.Button1Click(Sender: TObject);
    var
    i, j, merah : integer;
    R, total : extended;
    tempR: byte;
    P : pbytearray;

    begin
    total := 0;
    tempR := 0;
    R := 0;

    for i:= 0 to (formhasil.image.picture.height-1) do
    begin
    P := formhasil.image.picture.bitmap.scanline [i];
    for j:= 0 to (formhasil.image.picture.width-1) do
    begin
    tempR := round (P [3*j+2]);
    R := round (R + tempR);
    total := total + 1;
    end;
    merah := round (R/ total);
    edit1.text := inttostr (merah);
    end;
    end;

    setelah program dijalankan ada keterangan sebagai berikut:
    [Hint] UnitUtama.pas(193): Value assigned to ‘tempR’ never used

    Dugaan saya berarti nilai R tidak pernah diperoleh dari scanline P. dan memang nilai merah dari gambar yang telah diketahui nilai R nya sebelumnya, yang ditampilkan pada Tedit nilainya ngawur.
    Saya mohon bantuan pak peb untuk memberitahu saya bagaimana seharusnya kode tersebut ditulis. Terimakasih banyak sebelumnya

  106. pebbie · Maret 11, 2009

    mungkin maksudnya nilai tempR tidak pernah digunakan itu bukan yang di dalam loop, tetapi yang di luar loop (inisialisasi tempR dengan 0 padahal di dalam loop nilai tempR selalu diperbaharui)

    procedure TFormUtama.Button1Click( Sender: TObject );
    var
    i, j, merah : integer;
    R : extended;
    total : integer;
    tempR : byte;
    P : pbytearray;

    begin
    total := 0;
    R := 0;

    for i := 0 to ( formhasil.image.picture.height - 1 ) do begin
    P := formhasil.image.picture.bitmap.scanline[i];
    for j := 0 to ( formhasil.image.picture.width - 1 ) do begin
    tempR := P[3 * j + 2];
    R := R + tempR;

    total := total + 1;
    end;
    merah := round( R / total );
    edit1.text := inttostr( merah );
    end;
    end;

  107. adnan · Maret 13, 2009

    tanks bro, thats so helfull. terimakasih koreksiannya ya

  108. putriE · Maret 17, 2009

    KK tau di halaman mana komponen TBaseReport berada..? Cara menginstalnya pada delphi 7 bagaimana caranya..? Thx atas jwbnya

  109. may · Maret 21, 2009

    hai…
    mau nanya nih kak tau cara menghapus salah1 object pada kanvas image sehingga mirip seperti fasilitas erase di paint bawaan windows

  110. pebbie · Maret 21, 2009

    @may:menghapus pada paint sama dengan menggambar dengan warna arsir yang sama dengan warna kanvas (mis. putih).

  111. may · Maret 25, 2009

    thx atas jawabannya,,mau nanya lagi nih,,dosen aq suruh buat scalling gambar,misalnya seperti di Paint itu , objek grafis yang ditarik kesamping dgn mouse akan membesar,jika di tarik kembali ke kiri akan kembali seperti semula,,kak bisa bantu sintaxnya dengan menggunakan delphi..?

  112. ranee · April 26, 2009

    mas..peb.. boleh nanya dunk..
    1. buat greyscale di video, gimana ya caranya? klo dari image dah bisa. aq ganti picture.bmp ke video avi ga bisa.
    2. capture image real time with webcam per satuan waktu, pakenya grabber ma tscap32. gimana caranya ya?
    thx b4.. ranee..

  113. paul · Mei 9, 2009

    bantuin aq dunk aq mau mendeteksi bangun datar, pakai metode chain code, aq bingun mengenali polanya, terus algoritma sama programnya aq juga belum begitu jelas.bantuin ya…thks bgt…

  114. adhye · Juni 10, 2009

    mas…
    saya mau tanya,bagaimana cara membagi nilai pixel pada image dengan menggunakan Teknik Multiple Description Coding?

  115. ranee · Agustus 5, 2009

    mas mau tanya gimana caranya ngluarin matrix image monochrome…? kebanyakan contoh2 RGB.. lg belajar jd malah tambah bingung.

  116. Benk · Agustus 7, 2009

    mas bisa ngasi contoh sintak zoom image menggunakan delphi egak?
    Pleaze..

  117. Daryl · Oktober 11, 2009

    Peb gw mau tanya neh … kalo gue mau buat face recognition … untuk di delphinya apa harus pake region ?? oiaa punya source code wavelet di delphi nda’ butuh bgt neh … makasii peb

  118. rera · Oktober 14, 2009

    terimakasih

  119. yolan · Januari 11, 2010

    mas…
    sta mw tx program pencerminan donk…

  120. Rendy · Maret 29, 2010

    Mas Pebbie, aku mau tanya nie mengenai Refleksi / pencerminan dengan menggunakan VB 6 source code nya bgmn, aku bingung megenai tgs itu yg kurang..
    mohon bantuannya mas.

    Pencerminan/Refleksi
    Gambar 1 dicerminkan -> Menjadi Horizontal

    Gambar 1 dicerminkan -> Menjadi Vertikal

    Thanks.

  121. Meisya · Mei 1, 2010

    mas,, mw tanya,,
    gimana caranya mendeteksi kemiringan image, merotasi image dengan sudut bebas,, asumsi gambar tidak tegak lurus,, dibuat jadi tegak lurus,,
    *ingin implementasi utk citra hasil scan,, dibaca kemiringanny,, trus diluruskan

    mohon bantuannya,, makasi

  122. angel · Juli 25, 2010

    mas mw nanya soal citra huffman ne…gimana cara misah intensitas warnanya…RGBnya? kalo ga salah pertama harus dipisah dulu kan intensitas warnaya…setelah tu dikompres satu satu tiap intensitas warna tsb? mksh 🙂

  123. Alex · November 28, 2010

    mas peb saya mw nanya nih..
    saya ada penggalan script stegano untuk penulisan saya..
    bisa tolong dijelaskan maksut script ini..soalnya saya bingung..mohon bantuannya..

    //sisip pesan
    pesan:=memoTulisPesan.Lines.Text;
    BinerPesan:=”;
    PanjangText:=length(memoTulisPesan.Lines.Text);
    for i:=1 to PanjangText do
    begin
    BinerPesan:=BinerPesan+biner(ord(pesan[i]));
    end;
    n:=1;
    for j:=1 to ImageFile.Height-1 do
    begin
    for i:=0 to ImageFile.width-1 do
    begin
    inc(z);
    merah:=GetRValue(getpixel(ImageFile.Canvas.Handle,i,j));
    hijau:=GetGValue(getpixel(ImageFile.Canvas.Handle,i,j));
    biru:=GetGValue(getpixel(ImageFile.Canvas.Handle,i,j));
    BinerMerah:=biner(merah);
    BinerHijau:=biner(hijau);
    BinerBiru:=biner(biru);
    delete(BinerMerah,8,1);
    delete(BinerHijau,8,1);
    delete(BinerBiru,8,1);
    BinerBiru:=BinerBiru+BinerPesan[n];
    BinerHijau:=BinerHijau+BinerPesan[n+1];
    BinerMerah:=BinerMerah+BinerPesan[n+2];
    n:=n+3;
    MerahBaru:=decimal(BinerMerah);
    HijauBaru:=decimal(BinerHijau);
    BiruBaru:=decimal(BinerBiru);
    setpixelV(hdc1,i,j,RGB(MerahBaru,HijauBaru,BiruBaru));
    if n>length(BinerPesan) then
    break;
    end;
    if n>length(BinerPesan) then
    break;
    end;

  124. qeera · Desember 30, 2010

    salam kenal, mas peb

  125. qeera · Desember 30, 2010

    salam kenal, mas peb saya mau tnya? saya sudah membuat aplikasi kompresi citra dengan delphi menggunakan metode singular value decomposition dari beberapa literatur yang saya baca seharusnya image hasil kompresi jauh lebih kecil ukurannya dibanding dgn citra asli nah yang saya bingung kok hasil yang saya buat justru lebih besar ukuran filenya. saya sudah cek teori SVDnya sudah benar. menurut mas peb gmn?terima kasih sebelumnya.

  126. Ri · Januari 25, 2011

    Salam kenal mas. Saya masih newbie, mau tanya cara mengubah matriks ke bentuk gambar gimana ya?

  127. Dwiky · Mei 28, 2011

    ass…salam kenal..aku lagi nyelesain skripsi mas..

    mau tanya gmn y caranya scanning RGB dari webcam..aku uda pake DSPACK mas..
    jadi stelah di proses yang tampil cm obyek dengan RGB yang di setting…

    kalo bs minta listing programnya mas,,,masih newbie mas mslahnya,,,

    thanks mas..sukses selalu…

  128. safriadi · Juni 21, 2011

    saya ada masalah dikit dengan masalah pemograman di vb

    Private Sub Invert_Click()
    Dim r, g, b, PixLong As Long
    ‘ frmPicture.StatusBar1.Panels(1).Text = “Please Wait…”
    ‘ frmPicture.StatusBar1.Panels(1).AutoSize = sbrSpring
    For i = 0 To frmPicture.imgload.ScaleHeight – 1
    For J = 0 To frmPicture.imgload.ScaleWidth – 1
    PixLong = GetPixel(frmPicture.imgload.HDC, J, i)
    RGBcolors = GetRGB(PixLong)
    r = 255 – RGBcolors.red
    g = 255 – RGBcolors.green
    b = 255 – RGBcolors.blue
    SetPixel frmPicture.imgload.HDC, J, i, RGB(r, g, b)
    Next J
    frmPicture.imgload.Refresh
    DoEvents
    Next i
    ‘frmPicture.StatusBar1.Panels(1).Text = “”
    frmPicture.Pictemp.Picture = frmPicture.imgload.Image
    frmPicture.Pictemp.Refresh

    End Sub

    pada saat saya lakukan prose bermasalah dengan ” GetRGB” pesan yang muncul FUNCTION NOT DEFINED
    TOLONG PENCERAHANYA..?

  129. issackryan · September 29, 2011

    gan ane ne pemula di delphi,tolong dong ksh tw program delphi yang bs bc bit pada kata ato file

  130. andhie · Oktober 30, 2011

    bang kira2 ini maksudx apa ya?

    var
    x, y, w, h, k, l: integer;
    PC, PH: PByteArray;
    Ki, Ri, Gi, Bi, Ko, Ro, Go, Bo: array of array of byte;
    jumlah: real;
    begin
    Randomize;
    w := FormCitra.Image.Picture.Width;
    h := FormCitra.Image.Picture.Height;
    if (FormCitra.Image.Picture.Bitmap.PixelFormat = pf8bit)
    then
    begin
    SetLength(Ki, w, h);
    SetLength(Ko, w, h);
    for y := 0 to h-1 do
    begin
    PC := FormCitra.Image.Picture.Bitmap.ScanLine[y];
    PH := FormHasil.Image.Picture.Bitmap.ScanLine[y];
    for x := 0 to w-1 do
    begin
    Ki[x, y] := PC[x];
    Ko[x, y] := PH[x];
    end;
    end;
    for x := M to w-M-1 do
    for y := N to h-N-1 do
    begin
    jumlah := 0;
    for k := -M to M do
    for l := -N to N do
    jumlah := jumlah+Ki[x-k,y-l]*Mask[k,l];
    if (Round(jumlah) 255) then
    Ko[x,y] := 255
    else
    Ko[x,y] := Round(jumlah);
    end;
    for y := 0 to h-1 do
    begin
    PH := FormHasil.Image.Picture.Bitmap.ScanLine[y];
    for x := 0 to w-1 do
    PH[x] := Ko[x, y];
    end;
    Ki := nil;
    Ko := nil;
    end;

    masi pemula bang trus itu fungsinya buat apa?
    terima kasih

  131. agus · Desember 12, 2011

    mas sya lagi ada tugas kuliah tentang steganografi pada citra jpg.
    kata dosen saya citra jpeg itu didecoding dulu sampai ketemu komponen dctna..
    mohon bimbingan dari mas agus kerena saya sangat tidak mengerti cara mencari omponen itu.

  132. bayu · Mei 12, 2012

    pagi, maaf mau numpang nanya kalo misal kita punya file gambar/foto (apapun formatnya) yang memiliki kapasitas 10mb, nah yang mau saya tahu bagaimana caranya kita mendapatkan/menghitung pixelnya kemudian dari pixel tersebut terdapar RGBnya/byte kemudian lagi berapa nilai bitnya, sedangkan kita mau cari adalah nilai bit dalam bentuk binernya…mohon teori atau pencerahannya…terima kasih.

  133. Kallon · Oktober 11, 2012

    cara menampilkan bilingan 0-255 pada citra digital degan delphi.. tolong ya!! Kallon
    Thanks b4

  134. Samsu Arif · Juli 17, 2013

    Mau nanya mas, Gimana menampilkan image dengan nilai pikselnya real,misalkan : 2.3, 2.8 dst. jadi bukan nilai dari 0-255.

    • pebbie · Juli 18, 2013

      kalau nilainya real bisa dinormalisasi dari min..max ke rentang intensitas 0..255 (dibulatkan)

  135. Asih · Agustus 22, 2013

    bagi ilmu dong mas, metode canny pake delphi….dan nampilin koordinatnya
    trims.

  136. Khomsina Amalia · Desember 2, 2013

    Gan mau Tanya saya kan membuat Program Citra Digital tetapi memaki RGB emang kalo cuma memakai RGB tanpa mengubah ke grayscale bisa ya gan? trm ksh

    • pebbie · Desember 2, 2013

      bisa, kalau nilai R, G, dan B-nya sama maka ekivalen dengan grayscale

  137. honeybee · Desember 27, 2013

    gan, cara ngambil piksel wrna htm gmna ya? ada tgs delphi disuruh hitung jumlah karakter pd gambar.. jd gambar bitmap yg berupa huruf…
    berdasarkn piksel gmbr nnti dia bs ngebaca jumlah karakter yg ada pd gambar.. sy ga ngerti soal delphi.. tlg bantuanx gan..

  138. hendi · Oktober 12, 2015

    maaf feb, mau nanya yang dimaksud citra,canvas.pixel dalam pengolahan citra apa ya? mohon kasih contoh, terima kasih banyak ya..

  139. hendi · Oktober 12, 2015

    lebih jelasnya mohon diberi contoh dan keterangan dari rumus dibawah ini.
    terutama maksud penulisan GetRValue(Citra,Canvas.Pixel[j,i], sebelumnya terima kasih banyak, kebetulan ini adalah salah satu tugas kuliah saya..

  140. jenny · Januari 26, 2016

    maaf mas mau tanya.. kalau untuk ke format 2bit itu gimana? kan adanya ada pf24bit,pf8bit,pf4bit

  141. tien · Juni 1, 2016

    mas .. saya mau nanya cara pengoperasian atau prncocokan jarak hitung euclidean dengan stringgrid itu gimana ya? jadi seumpama pixel pertama stringrid1 dengan dikurang pixel pertama stringgrid2 ..mohin banyuannya

  142. ayu · September 9, 2017

    assalamualaikum

    saya mau nanya bagaimana caranya citra grayscaledi kuantisasi menjadi 8 level/ variasi ?
    mohon bantuannya, terima kasih

  143. arif · Februari 9, 2018

    mas mau tanya, kalo di delphi syntax buat mengetahui posisi pixel gimana ya.. misal ketika kita klik gambar, akan memunculkan lokasi pixel dimana kita meng klik, mohon bantuannya terimakasih.

  144. Furtuosa · Juni 4

    Selamat malam pak,saya ingin bertanya pak tentang pengolahan citra menggunakan delphi. yang mau saya tanyakan bagaimana menampilkan ukuran pixel menggunakan metode scanline dan menampilkan image menggunakan delphi pak,tapi data yang saya gunakan bertype FITS File Pak.
    Terima kasih sebelumnya Pak.

Tinggalkan komentar

Situs ini menggunakan Akismet untuk mengurangi spam. Pelajari bagaimana data komentar Anda diproses.