Senin, 16 Desember 2013

penggabungan citra (image blending) menggunakan delphi

PENGGABUNGAN CITRA (IMAGE BLENDING)
Penggabungan citra dilakukan dengan cara menimpakan (superimpose) sebuah citra pada citra yang lain. Operasi yang sesungguhnya adalah dengan melakukan operasi penjumlahan terhadap citra yang ada dengan bobot masing-masing.bobot untuk menggabungkan citra ini sering di sebut sebagai koefisien atau nilai alpha. Rumus untuk penggabungan dua cita adalah :
C(x,y) = WA*A(x,y)+WB*B(x,y)
Dengan WA  dan WB  adalah bobot untuk citra A dan B, biasanya nilai total dari bobot untuk sebuah lokasi piksel adalah 1. Sehingga:
WB  = 1- WA
Berikut ini saya berikan contoh program operasi penggabungan dua buah citra menggunakan DELPHI 7. Pada operasi ini, hanya terdapat tiga buah citra yaitu dua citra yang di operasikan dan sebuah citra sebagai hasil sehingga terdapat tiga buah FORM di sini
KOMPONEN
PROPERTI
NILAI
TForm
Name
Form utama
Caption
Operasi blending
Form style
fsMDIForm
position
poDesigned
Tbutton
caption
Ambil citra
name
ButtonAmbilCitra
Tbutton
caption
Ambil citra 2
name
ButtonAmbilCitra 2
Tlabel
caption
W1
TEdit
name
Editw1
text
0,5
Tlabel
caption
W1
TEdit
name
Editw2
text
0,5
Tbutton
caption
blending

name
ButtonBlending
TOpenPictureDialog
name
OpenPictureDialog

filter
All (*.bmp;*.jpg;*.jpeg)|*.bmp;*.jpg;*.jpeg|Bitmaps (*.bmp)|*.bmp|JPEG Image File (*.jpg;*.jpeg)|*.jpg;*.jpeg
Tbutton
caption
keluar


Maka akan nampak seperti gambar di bawah ini

Lalu kita buat lagi form untuk penampilan citra dengan cara:
komponen
property
nilai
Tform
Name
formcitra

Caption
citra

Formstyle
fsMDIChild

autoscroll
true
Timage
Name
Image

Autosize
True

center
true
Maka akan tampak seperti gambar di samping:








(Lalu buatlah sebuah form lagi untuk menampilkan citra kedua, dan langkahnya juga seperti contoh form pengambilan citra yang kedua)
Citra pertama di ambil dengan menekan tombol Buttonambilcitra dengan event handler onclick yang telah di buat pada program penampilan citra. Sementara itu, untuk mengambil citra kedua dari file buatlah event handler onclick ada buttonAmbilCitra2 dan ketikkan perintah berikut. Citra kedua baru dapat di ambil setelah citra pertama di-load.
Prosedure TformUtama.buttonambilcitra2click(sender:Tobject);
Begin
if (FormCitra = nil) then
    begin
    ShowMessage('Ambil citra pertama dulu');
      exit;
    end;
  if (OpenPictureDialog.Execute) then
    begin
      if (FormCitra2 = nil) then
        Application.CreateForm(TFormCitra, FormCitra2);
                FormCitra2.Image.Picture.LoadFromFile(
            OpenPictureDialog.FileName)
            FormCitra2.ClientHeight :=
        FormCitra2.Image.Picture.Height;
      FormCitra2.ClientWidth :=
        FormCitra2.Image.Picture.Width;
      FormCitra2.ClientHeight :=
        FormCitra2.Image.Picture.Height;
      FormCitra2.Caption := 'Citra 2';
      FormCitra2.Top := FormCitra.Top;
      FormCitra2.Left := FormCitra.Left+FormCitra.Width;
    end;
end;

kemudian definisikan prosedur olah untuk menampung bagian pengolahan citranya. Ketikkan prosedure olah pada bagian deklarasi kelas TformUtama.
type
  TFormUtama = class(TForm)
    PanelAtas: TPanel;
....................
procedure ButtonAmbilCitraClick(
private

tuliskan implementasi prosedur olah tersebut di bawah direktif {$R *.dfm}. mula-mula definisikan variabel yang di pergunakan , w1 dan w2 di gunakan untuk menyimpan bobot/nilai alpha untuk citra pertama dan citra kedua. Nilai w1 di ambil dari komponen Editw1, sedangkan w2 di hitung berdasarkan persamaan 6-8 kemudian hasilnya di tampilkan di komponen Editw2

{$R *.dfm}
procedure TFormUtama.Olah;
var
i, j: integer;
  w1, w2: real;
  PC, PC2, PH: PByteArray;
begin
  w1 := StrToFloat(Editw1.Text);
  w2 := 1-w1;
  Editw2.Text := FloatToStr(w2);

Kemudian untuk citra keabuan, ambil nilai keabuan citra pertama dan kedua, lalu hitung keabuan citra hasil menggunakan persamaan 6-7 lakukan untuk semua titik pada citra (semua baris dan semua kolom).

if (FormCitra.Image.Picture.Bitmap.PixelFormat = pf8bit)
  then
    begin
      for i:= 0 to FormCitra.Image.Picture.Height-1 do
        begin
          PC := FormCitra.Image.Picture.Bitmap.ScanLine[i];
          PC2 :=FormCitra2.Image.Picture.Bitmap.ScanLine[i];
          PH := FormHasil.Image.Picture.Bitmap.ScanLine[i];
          for j:= 0 to FormCitra.Image.Picture.Width-1 do
            PH[j] := Round(PC[j]*w1+PC2[j]*w2);
        end;
    end;

lakukan hal yang sama untuk citra true color. Listing lengkap prosedur olah sebagai berikut;

procedure TFormUtama.Olah;
var
  i, j: integer;
  w1, w2: real;
  PC, PC2, PH: PByteArray;
begin
  w1 := StrToFloat(Editw1.Text);
  w2 := 1-w1;
  Editw2.Text := FloatToStr(w2);
  if (FormCitra.Image.Picture.Bitmap.PixelFormat = pf8bit)
  then
    begin
      for i:= 0 to FormCitra.Image.Picture.Height-1 do
        begin
          PC := FormCitra.Image.Picture.Bitmap.ScanLine[i];
          PC2 :=FormCitra2.Image.Picture.Bitmap.ScanLine[i];
          PH := FormHasil.Image.Picture.Bitmap.ScanLine[i];
          for j:= 0 to FormCitra.Image.Picture.Width-1 do
            PH[j] := Round(PC[j]*w1+PC2[j]*w2);
        end;
    end;
  if (FormCitra.Image.Picture.Bitmap.PixelFormat = pf24bit)
  then
    begin
      for i:= 0 to FormCitra.Image.Picture.Height-1 do
        begin
          PC := FormCitra.Image.Picture.Bitmap.ScanLine[i];
          PC2 :=FormCitra2.Image.Picture.Bitmap.ScanLine[i];
          PH := FormHasil.Image.Picture.Bitmap.ScanLine[i];
          for j:= 0 to FormCitra.Image.Picture.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);
            end
        end;
    end;
end;

prosedur olah di panggil dengan menekan tombol ButtonBlending. Oleh karena itu, buatlah event handlerOnClick untuk komponen tersebut. Karena operasi hanya dilakukan jika kedua citra sudah di ambil maka apabila belum di tampilkan pesan. Kemudian jika FormHasil belum ada maka di buat terlebih dahulu form tersebut dan sesuaikan posisi serta ukuran citra hasil terhadap citra sumbernya. Selanjutnya jalankan prosedur olah dan tampilkan hasilnya pada FormHasil.

procedure TFormUtama.ButtonBlendingClick(Sender: TObject);
begin
  if (FormCitra2 = nil) then
    begin
      ShowMessage('Ambil citra pertama dulu');
      exit;
    end;
  if (FormHasil = nil) then
    Application.CreateForm(TFormCitra, FormHasil);
  FormHasil.Caption := 'Citra Hasil';
  FormHasil.Image.Picture := FormCitra.Image.Picture;
  FormHasil.ClientHeight :=
    FormHasil.Image.Picture.Height;
  FormHasil.ClientWidth :=
    FormHasil.Image.Picture.Width;
  FormHasil.ClientHeight :=
    FormHasil.Image.Picture.Height;
  FormHasil.Top := FormCitra2.Top;
    FormHasil.Left := FormCitra2.Left+FormCitra.Width;
  Olah;
  FormHasil.Repaint;
end;

JALANKAN PROGRAMNYA
semoga bisa bermanfaat