Tujuan pengolahan citra digital adalah untuk mendapatkan citra baru yang lebih sesuai untuk digunakan dalam aplikasi tertentu. Salah satu jenis pengolahan citra adalah yang disebut dengan contrast stretching.
Contrast stretching ini adalah teknik yang digunakan untuk mendapatkan citra baru dengan kontras yang lebih baik daripada kontras dari citra asalnya. Citra yang memiliki kontras rendah dapat terjadi karena kurangnya pencahayaan, kurangnya bidang dinamika dari sensor citra, atau kesalahan setting pembuka lensa pada saat pengambilan citra.
Ide dari proses contrast stretching adalah untuk meningkatkan bidang dinamika dari gray level di dalam citra yang akan diproses. Proses contrast stretching termasuk proses perbaikan citra yang bersifat point processing, yang artinya proses ini hanya tergantung dari nilai intensitas (gray level) satu pixel, tidak tergantung dari pixel lain yang ada di sekitarnya.
LAPORAN PENELITIAN
JURUSAN TEKNIK INFORMATIKA
STMIK STIKOM BALIKPAPAN
IMPLEMENTASI METODE CONTRAST STRETCHING UNTUK MEMPERBAIKI KONTRAS CITRA
oleh
Setyo Nugroho
Jurusan Teknik Informatika
STIKOM Balikpapan
2005
DAFTAR ISI
LANDASAN TEORI............................................................................................... 2
Citra Digital.............................................................................................................. 2
Contrast Stretching.................................................................................................... 2
Histogram................................................................................................................. 3
CARA PENELITIAN.............................................................................................. 5
File citra digital dengan format BMP......................................................................... 5
Proses Contrast Stretching......................................................................................... 6
Histogram................................................................................................................. 7
Statistik Citra............................................................................................................ 8
HASIL DAN PEMBAHASAN................................................................................ 9
PENUTUP............................................................................................................. 11
DAFTAR PUSTAKA............................................................................................ 11
LAMPIRAN.......................................................................................................... 12
LANDASAN TEORI
Citra Digital
Citra didefinisikan sebagai fungsi intensitas cahaya dua-dimensi f(x,y) dimana x dan y menunjukkan koordinat spasial, dan nilai f pada suatu titik (x,y) sebanding dengan brightness (gray level) dari citra di titik tersebut.
Citra digital adalah citra dengan f(x,y) yang nilainya di-digitalisasi-kan (dibuat diskrit) baik dalam koordinat spasialnya maupun dalam gray levelnya. Digitalisasi dari koordinat spasial citra disebut dengan image sampling, sedangkan digitalisasi dari gray level citra disebut dengan gray-level quantization.
Citra digital dapat dibayangkan sebagai suatu matriks dimana baris dan kolomnya menunjukkan suatu titik di dalam citra, dan nilai elemen matriks tersebut menunjukkan gray level di titik tersebut. Elemen-elemen dari citra digital tersebut biasanya disebut dengan pixel, yang merupakan singkatan dari picture elements.
Pada tulisan ini citra digital yang digunakan berukuran 256x256 pixel dan memiliki 256 gray level.
Contrast Stretching
Tujuan pengolahan citra digital adalah untuk mendapatkan citra baru yang lebih sesuai untuk digunakan dalam aplikasi tertentu. Salah satu jenis pengolahan citra adalah yang disebut dengan contrast stretching. Contrast stretching ini adalah teknik yang digunakan untuk mendapatkan citra baru dengan kontras yang lebih baik daripada kontras dari citra asalnya.
Citra yang memiliki kontras rendah dapat terjadi karena kurangnya pencahayaan, kurangnya bidang dinamika dari sensor citra, atau kesalahan setting pembuka lensa pada saat pengambilan citra. Ide dari proses contrast stretching adalah untuk meningkatkan bidang dinamika dari gray level di dalam citra yang akan diproses.
Proses contrast stretching termasuk proses perbaikan citra yang bersifat point processing, yang artinya proses ini hanya tergantung dari nilai intensitas (gray level) satu pixel, tidak tergantung dari pixel lain yang ada di sekitarnya.
Gambar 1 menunjukkan transformasi tipikal yang digunakan untuk contrast stretching. Disini diasumsikan bahwa citra memiliki range gray level dari 0 sampai 255.
Pada gambar 1, c adalah gray level dari citra sebelum diproses dan d adalah gray level dari citra setelah diproses. Titik (c1,d1) dan titik (c2,d2) akan menentukan bentuk dari fungsi transformasi, dan dapat diatur untuk menentukan tingkat penyebaran grey level dari citra yang dihasilkan.

Gambar 1
Fungsi contrast stretching
Jika c1=c2 dan d1=d2 maka transformasi akan berbentuk garis lurus yang berarti tidak ada perubahan gray level pada citra yang dihasilkan.
Secara umum diasumsikan c1<=c2 dan d1<=d2 sehingga fungsi akan menghasilkan nilai tunggal dan nilainya akan selalu naik.
Untuk menghitung nilai hasil transformasi tersebut, kita dapat membuat tiga fungsi sebagai berikut:
Untuk c <= 0 < c1, maka d = c . (d1 / c1)
Untuk c1 <= c < c2, maka d = d1 + ( (c-c1) . ((d2-d1) / (c2-c1)) )
Untuk c2 <= c <=255, maka d = d2 + ( (c-c2) . (255-d2) / (255-c2) )
Histogram
Histogram dari citra digital dengan gray level dalam range [0,L-1] adalah fungsi diskrit p(rk) = nk/n, dimana:
rk : gray level ke-k
nk : banyaknya pixel di dalam citra dengan gray level tersebut
n : jumlah seluruh pixel di dalam citra
k=0, 1, 2, …, L-1
Jika fungsi ini digambarkan dengan grafik maka akan memberikan deskripsi secara global dari penampakan citra.
Gambar 2 berikut menunjukkan histogram dari empat jenis citra secara umum.
(a) Citra yang gelap:

(b) Citra yang terang:

(c) Citra berkontras rendah:

(d) Citra berkontras tinggi:

Gambar 2
Jenis-jenis dasar histogram
Histogram pada gambar (a) menunjukkan bahwa gray level terkonsentrasi di bagian kiri atau bagian gelap dari range gray scale. Sebaliknya pada gambar (b) gray level terkonsentrasi di bagian kanan atau bagian terang dari range gray scale. Pada gambar (c) histogram memiliki bentuk yang sempit yang menunjukkan bahwa citra memiliki dynamic range rendah yang berarti berkontras rendah. Sedangkan pada gambar (d) gray level tersebar luas yang menunjukkan bahwa citra berkontras tinggi.
Meskipun histogram hanya menunjukkan sifat-sifat umum dari citra dan tidak memberikan informasi apa-apa tentang isi citra, namun bentuk dari histogram dapat memberikan informasi mengenai kemungkinan untuk melakukan perbaikan kontras citra tersebut.
CARA PENELITIAN
Untuk mengimplementasikan proses contrast stretching pada komputer, penulis membuat program yang memiliki kemampuan untuk:
· membuka file yang berisi citra digital
· menampilkan citra digital tersebut di layar
· melakukan pemrosesan contrast stretching
· menampilkan citra digital hasil proses
· menampilkan histogram citra, baik sebelum maupun setelah diproses
· menampilkan statistik citra secara umum
Adapun batasan dari program ini adalah:
· file citra yang digunakan harus berformat BMP, berukuran 256x256 pixel, dengan 256 gray-level
File citra digital dengan format BMP
File citra dengan format BMP adalah salah satu format standar yang digunakan dalam sistem operasi Windows. File ini biasanya disimpan dengan ekstensi .BMP. Struktur dari file BMP adalah sebagai berikut:
|
BITMAPFILEHEADER |
|
BITMAPINFOHEADER |
|
Array RGBQUAD |
|
Array warna |
Struktur BITMAPFILEHEADER menunjukkan jenis file dan ukuran file. Struktur BITMAPINFOHEADER menunjukkan ukuran (lebar dan tinggi) dari citra, format warna citra, dan banyaknya warna yang digunakan di dalam citra. Struktur RGBQUAD berisi nilai intensitas warna yang dibagi menjadi komponen R, G, dan B (red, green, dan blue). Sedangkan array warna berisi informasi mengenai isi citra itu sendiri, yaitu pixel-pixel yang membentuk citra tersebut.
Untuk mempercepat proses pengolahan citra digital, maka pixel-pixel yang ada di dalam file BMP dicopykan ke dalam variabel array. Dengan demikian pada proses selanjutnya tidak perlu dilakukan pembacaan file secara berulang-ulang. Deklarasi array untuk menyimpan citra tersebut adalah:
arCitra1 : array[1..256, 1..256] of byte;
arCitra2 : array[1..256, 1..256] of byte;
Secara lengkap, proses peng-copy-an pixel ini dapat dilihat pada procedure BukaFileCitra di listing program terlampir. Untuk menampilkan citra ke layar, digunakan component Timage dari Delphi.
Proses Contrast Stretching
Setelah semua pixel tersimpan di dalam variabel array, proses contrast stretching dapat dilakukan dengan melakukan perhitungan untuk setiap pixel yang ada di dalam array tersebut. Sebelum dilakukan contrast stretching, pemakai dapat menentukan nilai c1, c2, d1, dan d2 yang akan menentukan bentuk fungsi contrast stretching. Gambar 3 menunjukkan contoh pemilihan nilai-nilai tersebut.

Gambar 3
Penentuan nilai c1, d1, c2, dan d2
untuk contrast stretching
Selanjutnya nilai c1, c2, d1, dan d2 yang dipilih oleh pemakai dimasukkan ke dalam variabel untuk digunakan dalam perhitungan selanjutnya. Implementasi dari proses contrast stretching dapat dilihat pada procedure ContrastStretch di dalam listing program. Berikut ini bagian dari procedure tersebut yang berfungsi untuk melakukan proses contrast stretching:
{ contrast stretching }
for ix:=1 to 256 do begin
for iy:=1 to 256 do begin
warnab := arCitra1[ix,iy];
if warnab < c1 then {zone 1}
warnab2 := round( warnab * d1 / c1 )
else if warnab < (c2) then {zone 2}
warnab2 := d1 + round( (warnab-c1) * (d2-d1) / (c2-c1) )
else {zone 3}
warnab2 := d2 + round( (warnab-c2) * (255-d2) / (255-c2) );
arCitra2[ix,iy] := warnab2;
end;
end;
Histogram
Untuk menampilkan histogram, penulis membuat jendela histogram yang akan menampilkan dua buah histogram, yaitu untuk citra sebelum diproses dan citra setelah diproses. Gambar 4 menunjukkan contoh tampilan histogram tersebut.

Gambar 4
Tampilan histogram citra
Histogram tersebut diperoleh dengan cara menyiapkan array bernama untuk menampung jumlah pixel dari masing-masing gray level. Deklarasi array tersebut adalah:
arHistogram1 : array[0..255] of longint;
arHistogram2 : array[0..255] of longint;
Berikut ini bagian program untuk mengisi array histogram tersebut berdasarkan informasi gray level dari citra:
{ update data array histogram }
for ix:=1 to 256 do begin
for iy:=1 to 256 do begin
warnab := arCitra1[ix,iy];
inc(arHistogram1[warnab]);
warnab := arCitra2[ix,iy];
inc(arHistogram2[warnab]);
end;
end;
Selanjutnya data tersebut diplot ke component Timage dengan menggunakan perintah MoveTo dan LineTo untuk membuat garis-garis vertikal yang membentuk grafik histogram. Implementasi lengkapnya dapat dilihat pada procedure UpdateHistogram.
Statistik citra
Program juga menyediakan fasilitas untuk melihat statistik citra yang berisi nilai pixel terendah, tertinggi, dan rata-rata, baik untuk citra sebelum diproses maupun setelah diproses.
Bagian program untuk menghitung statistik citra adalah sebagai berikut:
pix_max := 0;
pix_min := 255;
tmp := 0;
{ Hitung nilai pixel rata-rata, tertinggi, terendah
(dalam greyscale level)}
for ix:=1 to 256 do begin
for iy:=1 to 256 do begin
warnab := arCitra1[ix,iy];
if warnab > pix_max then
pix_max := warnab;
if warnab < pix_min then
pix_min := warnab;
tmp := tmp + warnab;
end;
end;
pix_rerata := round( tmp / (256 * 256) );
Perhitungan ini ada di dalam procedure HitungStatistikCitra.
![]() |
Gambar 5
Tampilan statistik citra
HASIL DAN PEMBAHASAN
Program yang dibuat telah diujicobakan untuk beberapa file citra dengan mencoba nilai c1, c2, d1, dan d2 yang berbeda-beda untuk mengubah bentuk fungsi contrast stretching. Pada contoh kasus berikut, program dicoba untuk membuka file citra yang memiliki kontras rendah.
Contoh kasus 1:
File citra: fruit2.bmp
Nilai (c1, d1) = (0, 0) ; (c2, d2) = (90, 255)
Statistik citra sebelum diproses:
Nilai pixel terendah : 0
Nilai pixel tertinggi : 137
Nilai pixel rata-rata : 37
Statistik citra setelah diproses:
Nilai pixel terendah : 0
Nilai pixel tertinggi : 255
Nilai pixel rata-rata : 104

Tampilan citra:

Tampilan histogram:
Contoh kasus 2:
File citra: tank.bmp
Nilai (c1, d1) = (0, 0) ; (c2, d2) = (7, 255)
Statistik citra sebelum diproses:
Nilai pixel terendah : 0
Nilai pixel tertinggi : 7
Nilai pixel rata-rata : 5
Statistik citra setelah diproses:
Nilai pixel terendah : 0
Nilai pixel tertinggi : 255
Nilai pixel rata-rata : 189

Tampilan citra:

Tampilan histogram:
Dari kedua contoh kasus tersebut, terlihat bahwa dengan melakukan proses contrast stretching kita dapat memperoleh citra baru yang memiliki kontras lebih baik sehingga menghasilkan citra yang lebih sesuai untuk ditangkap mata manusia.
Terlihat bahwa citra yang histogramnya menyempit memiliki kontras rendah, sedangkan citra yang histogramnya menyebar memiliki kontras tinggi.
Untuk memilih nilai c1, d1, c2, dan d2 yang tepat, kita dapat melihat statistik yang ada yang menunjukkan range nilai gray level pixel. Statistik tersebut sangat membantu untuk menentukan bentuk fungsi contrast stretching yang sesuai karena bentuk fungsi contrast stretching yang sesuai untuk citra yang satu belum tentu sesuai untuk citra yang lain. Sebagai contoh, pada kasus 1 dan kasus 2 di atas digunakan fungsi contrast stretching yang berbeda dengan mengubah nilai c1, c2, d1, dan d2.
PENUTUP
Citra yang memiliki kontras rendah cenderung sulit untuk diamati dan dianalisa dengan baik oleh mata manusia. Proses contrast stretching dapat digunakan untuk melakukan perbaikan citra digital yang memiliki kontras rendah sehingga memiliki kontras yang lebih baik. Bentuk fungsi contrast stretching yang digunakan dapat diatur dengan menentukan nilai c1, c2, d1, dan d2 yang tepat berdasarkan histogram dari citra yang akan diproses.
Histogram dapat digunakan untuk menganalisa tingkat brightness (kecerahan) maupun kontras dari citra secara umum, sehingga dapat membantu menentukan langkah perbaikan citra selanjutnya.
Secara umum program yang dibuat telah berfungsi dengan baik, namun demikian masih terbuka kemungkinan untuk dikembangkan lebih lanjut, misalnya dengan menambahkan kemampuan untuk membuka citra dengan sembarang ukuran, membuka file citra dengan format yang lain, dan menyimpan citra hasil proses ke dalam file baru.
DAFTAR PUSTAKA
- Rafael C. Gonzalez, Richard E. Woods, 1993, Digital Image Processing, Addison-Wesley Publishing Company Inc., USA.
- Microsoft Corporation, 1996, Microsoft Win32 Programmer’s Reference, Microsoft Corporation.
LAMPIRAN
Listing Program
program PCD1;
uses
Forms,
PCDUnit1 in 'PCDUnit1.pas' {Form1},
PCDAbout in 'PCDAbout.pas' {AboutBox},
PCDUnit2 in 'PCDUnit2.pas' {frmStat},
Histo in 'Histo.pas' {frmHisto},
PCDContrast in 'PCDContrast.pas' {frmContrast};
{$R *.RES}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TAboutBox, AboutBox);
Application.CreateForm(TfrmStat, frmStat);
Application.CreateForm(TfrmHisto, frmHisto);
Application.CreateForm(TfrmContrast, frmContrast);
Application.Run;
end.
{
Pengolahan citra digital.
Input:
- File citra dg format BMP, ukuran 256x256 pixel, 256 level grayscale
Output:
- Tampilan citra sebelum diproses.
- Tampilan citra setelah diproses dengan contrast stretching.
- Statistik pixel citra.
- Histogram citra.
}
unit PCDUnit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Menus, ExtCtrls, StdCtrls, Buttons, ComCtrls;
type
TForm1 = class(TForm)
Image1: TImage;
Image2: TImage;
Label1: TLabel;
Label2: TLabel;
OpenDialog1: TOpenDialog;
MainMenu1: TMainMenu;
File1: TMenuItem;
Open1: TMenuItem;
Proses1: TMenuItem;
Statistik1: TMenuItem;
ContrastStretching1: TMenuItem;
About1: TMenuItem;
Bevel1: TBevel;
Help1: TMenuItem;
Exit2: TMenuItem;
ViewHistogram1: TMenuItem;
View1: TMenuItem;
procedure Open1Click(Sender: TObject);
procedure ContrastStretching1Click(Sender: TObject);
procedure About1Click(Sender: TObject);
procedure Statistik1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Exit2Click(Sender: TObject);
procedure ViewHistogram1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
{ variabel global }
arCitra1 : array[1..256, 1..256] of byte;
arCitra2 : array[1..256, 1..256] of byte;
arHistogram1 : array[0..255] of longint;
arHistogram2 : array[0..255] of longint;
nmfile : string;
c1, c2, d1, d2 : integer; { parameter utk contrast stretching }
procedure TampilkanHasil;
implementation
uses PCDAbout, PCDUnit2, Histo, PCDContrast;
{$R *.DFM}
{-------------------------------------------------------------------------}
procedure BukaFileCitra;
{ syarat: file citra berformat BMP, berukuran 256x256,
256 level grayscale }
var
i, ix, iy : integer;
warna : longint;
warnab : byte;
bfh : TBitmapFileHeader;
bih : TBitmapInfoHeader;
colorTbl : array[0..255] of TRGBQuad;
mst : TMemoryStream;
b : byte;
numColor : integer;
syarat : boolean;
bm : TBitmap;
begin
{ buka file citra, copykan semua pixel citra ke dalam array }
mst := TMemoryStream.Create;
mst.LoadFromFile(nmfile);
mst.ReadBuffer(bfh, sizeof(bfh));
mst.ReadBuffer(bih, sizeof(bih));
if (bih.biWidth <> 256) or (bih.biHeight <> 256) or (bih.biBitCount <> 8) then begin
MessageDlg('Format file salah! Hanya bisa membuka file BMP berukuran 256x256, 8 bit per pixel.', mtError, [mbOK], 0);
mst.Free;
exit;
end;
if bih.biClrUsed<256 then numColor:=bih.biClrUsed else numColor:=256;
for i:=0 to numColor-1 do
mst.ReadBuffer(colorTbl[i], 4);
for iy:=256 downto 1 do begin
for ix:=1 to 256 do begin
mst.ReadBuffer(b, 1);
warna := longint(colorTbl[b]);
arCitra1[ix,iy] := (byte(warna) + byte(warna shr 8) + byte(warna shr 16)) div 3;
arCitra2[ix,iy] := 0;
end;
end;
mst.Free;
{ tampilkan file citra di image1 }
form1.image1.Picture.LoadFromFile(nmfile);
{ bersihkan image2 }
form1.Image2.Canvas.Brush.Color := clBlack;
form1.Image2.Canvas.FillRect(Rect(0, 0, 256, 256));
end;
{-------------------------------------------------------------------------}
procedure TampilkanHasil;
var ix, iy : integer;
warna : longint;
warnab : byte;
begin
{ tampilkan citra setelah diproses }
for ix:=1 to 256 do begin
for iy:=1 to 256 do begin
warnab := arCitra2[ix,iy];
warna := warnab or (longint(warnab) shl 8) or (longint(warnab) shl 16);
form1.image2.Canvas.Pixels[ix-1,iy-1] := warna;
end;
end;
end;
{-------------------------------------------------------------------------}
procedure HitungStatistikCitra;
var ix, iy : integer;
warnab : byte;
tmp : longint;
s : string;
pix_rerata, pix_max, pix_min : byte;
begin
frmStat.Memo1.Text := '';
frmStat.Memo1.Lines.Add('Nama file citra: ' + nmfile);
frmStat.Memo1.Lines.Add('');
{ --- citra 1 ---}
frmStat.Memo1.Lines.Add('Statistik citra sebelum diproses:');
{ init variabel }
pix_max := 0;
pix_min := 255;
tmp := 0;
{ Hitung nilai pixel rata-rata, tertinggi, terendah (dalam greyscale level)}
for ix:=1 to 256 do begin
for iy:=1 to 256 do begin
warnab := arCitra1[ix,iy];
if warnab > pix_max then
pix_max := warnab;
if warnab < pix_min then
pix_min := warnab;
tmp := tmp + warnab;
end;
end;
pix_rerata := round( tmp / (256 * 256) );
Str(pix_min, s);
frmStat.Memo1.Lines.Add(' Nilai pixel terendah : ' + s);
Str(pix_max, s);
frmStat.Memo1.Lines.Add(' Nilai pixel tertinggi : ' + s);
Str(pix_rerata, s);
frmStat.Memo1.Lines.Add(' Nilai pixel rata-rata : ' + s);
{ --- citra 2 ---}
frmStat.Memo1.Lines.Add('');
frmStat.Memo1.Lines.Add('Statistik citra setelah diproses:');
{ init variabel }
pix_max := 0;
pix_min := 255;
tmp := 0;
{ Hitung nilai pixel rata-rata, tertinggi, terendah (dalam greyscale level)}
for ix:=1 to 256 do begin
for iy:=1 to 256 do begin
warnab := arCitra2[ix,iy];
if warnab > pix_max then
pix_max := warnab;
if warnab < pix_min then
pix_min := warnab;
tmp := tmp + warnab;
end;
end;
pix_rerata := round( tmp / (256 * 256) );
Str(pix_min, s);
frmStat.Memo1.Lines.Add(' Nilai pixel terendah : ' + s);
Str(pix_max, s);
frmStat.Memo1.Lines.Add(' Nilai pixel tertinggi : ' + s);
Str(pix_rerata, s);
frmStat.Memo1.Lines.Add(' Nilai pixel rata-rata : ' + s);
end;
{=========================================================================}
procedure TForm1.Open1Click(Sender: TObject);
begin
OpenDialog1.Execute;
if OpenDialog1.FileName <> '' Then begin
nmfile := Form1.OpenDialog1.FileName;
BukaFileCitra;
UpdateHistogram;
end;
end;
procedure TForm1.ContrastStretching1Click(Sender: TObject);
begin
frmContrast.Show;
end;
procedure TForm1.About1Click(Sender: TObject);
begin
AboutBox.ShowModal;
end;
procedure TForm1.Statistik1Click(Sender: TObject);
begin
HitungStatistikCitra;
frmStat.Show;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
{ bersihkan image1 & image2 }
form1.Image1.Canvas.Brush.Color := clBlack;
form1.Image1.Canvas.FillRect(Rect(0, 0, 256, 256));
form1.Image2.Canvas.Brush.Color := clBlack;
form1.Image2.Canvas.FillRect(Rect(0, 0, 256, 256));
{ nmfile := 'fruit3.bmp';
BukaFileCitra;}
end;
procedure TForm1.Exit2Click(Sender: TObject);
begin
form1.close;
end;
procedure TForm1.ViewHistogram1Click(Sender: TObject);
begin
ViewHistogram1.Checked := not ViewHistogram1.Checked;
frmHisto.Visible := ViewHistogram1.Checked;
end;
end.
unit PCDUnit2;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, PCDUnit1;
type
TfrmStat = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmStat: TfrmStat;
implementation
{$R *.DFM}
procedure TfrmStat.Button1Click(Sender: TObject);
begin
frmStat.Close;
end;
end.
unit Histo;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls;
type
TfrmHisto = class(TForm)
Image1: TImage;
Image2: TImage;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label1: TLabel;
Label2: TLabel;
Label7: TLabel;
Label8: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Image2MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmHisto: TfrmHisto;
procedure UpdateHistogram;
implementation
uses PCDUnit1;
{$R *.DFM}
{-------------------------------------------------------------------------}
procedure UpdateHistogram;
var i : integer;
ix, iy, n : integer;
warnab : byte;
maxHistogramValue1 : integer;
maxHistogramValue2 : integer;
skala1 : real;
skala2 : real;
r : TRect;
begin
{ inisialisasi }
for i:=0 to 255 do begin
arHistogram1[i] := 0;
arHistogram2[i] := 0;
end;
{ update data array histogram }
for ix:=1 to 256 do begin
for iy:=1 to 256 do begin
warnab := arCitra1[ix,iy];
inc(arHistogram1[warnab]);
warnab := arCitra2[ix,iy];
inc(arHistogram2[warnab]);
end;
end;
{ histogram scaling }
maxHistogramValue1 := 0;
maxHistogramValue2 := 0;
for i:=0 to 255 do begin
if arHistogram1[i] > maxHistogramValue1 then
maxHistogramValue1 := arHistogram1[i];
if arHistogram2[i] > maxHistogramValue2 then
maxHistogramValue2 := arHistogram2[i];
end;
skala1 := 100 / maxHistogramValue1;
skala2 := 100 / maxHistogramValue2;
{ inisialisasi gambar histogram }
r := Rect(0, 0, 256, 101);
frmHisto.Image1.Canvas.Brush.Color := clWhite;
frmHisto.Image1.Canvas.FillRect(r);
frmHisto.Image2.Canvas.Brush.Color := clWhite;
frmHisto.Image2.Canvas.FillRect(r);
frmHisto.Image1.Canvas.MoveTo(0,100);
frmHisto.Image1.Canvas.LineTo(256,100);
frmHisto.Image2.Canvas.MoveTo(0,100);
frmHisto.Image2.Canvas.LineTo(256,100);
{ mulai gambar histogram }
for i:=0 to 255 do begin
{ histogram citra 1 }
frmHisto.Image1.Canvas.MoveTo(i,100);
n := round( arHistogram1[i] * skala1 );
frmHisto.Image1.Canvas.LineTo(i,100-n);
{ histogram citra 2 }
frmHisto.Image2.Canvas.MoveTo(i,100);
n := round( arHistogram2[i] * skala2 );
frmHisto.Image2.Canvas.LineTo(i,100-n);
end;
end;
procedure TfrmHisto.FormCreate(Sender: TObject);
begin
UpdateHistogram;
end;
procedure TfrmHisto.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Form1.ViewHistogram1.Checked := False;
end;
procedure TfrmHisto.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
Label7.Caption := 'f[' + IntToStr(X) + '] = ' + IntToStr(arHistogram1[X]);
end;
procedure TfrmHisto.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
Label7.Caption := '';
Label8.Caption := '';
end;
procedure TfrmHisto.Image2MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
Label8.Caption := 'f[' + IntToStr(X) + '] = ' + IntToStr(arHistogram2[X]);
end;
end.
unit PCDAbout;
interface
uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls,
Buttons, ExtCtrls;
type
TAboutBox = class(TForm)
Panel1: TPanel;
ProgramIcon: TImage;
ProductName: TLabel;
Version: TLabel;
Copyright: TLabel;
Comments: TLabel;
OKButton: TButton;
Label1: TLabel;
Label2: TLabel;
private
{ Private declarations }
public
{ Public declarations }
end;
var
AboutBox: TAboutBox;
implementation
{$R *.DFM}
end.
unit PCDContrast;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Spin, ExtCtrls;
type
TfrmContrast = class(TForm)
Image1: TImage;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Button1: TButton;
scbC1: TScrollBar;
lblC1: TLabel;
lblD1: TLabel;
scbD1: TScrollBar;
lblC2: TLabel;
scbC2: TScrollBar;
lblD2: TLabel;
scbD2: TScrollBar;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure scbC1Change(Sender: TObject);
procedure scbD1Change(Sender: TObject);
procedure scbC2Change(Sender: TObject);
procedure scbD2Change(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmContrast: TfrmContrast;
implementation
uses Histo, PCDUnit1;
{$R *.DFM}
{-----------------------------------------------------------}
procedure UpdateContrastSetting;
begin
c1 := frmContrast.scbC1.Position;
d1 := frmContrast.scbD1.Position;
c2 := frmContrast.scbC2.Position;
d2 := frmContrast.scbD2.Position;
{ inisialisasi image }
frmContrast.Image1.Canvas.Brush.Color := TColor($00AAAAAA);
frmContrast.Image1.Canvas.FillRect(Rect(0, 0, 256 div 2, 256 div 2));
{ update image }
frmContrast.Image1.Canvas.Pen.Color := clBlack;
frmContrast.Image1.Canvas.MoveTo(0,255 div 2);
frmContrast.Image1.Canvas.LineTo(c1 div 2,(255-d1) div 2);
frmContrast.Image1.Canvas.LineTo(c2 div 2,(255-d2) div 2);
frmContrast.Image1.Canvas.LineTo(255 div 2,0);
end;
{-------------------------------------------------------------------------}
procedure ContrastStretch;
var ix, iy : integer;
warna : longint;
warnab : byte;
warnab2 : byte;
begin
{----- proses citra }
{ contrast stretching }
for ix:=1 to 256 do begin
for iy:=1 to 256 do begin
warnab := arCitra1[ix,iy];
if warnab < c1 then {zone 1}
warnab2 := round( warnab * d1 / c1 )
else if warnab < (c2) then {zone 2}
warnab2 := d1 + round( (warnab-c1) * (d2-d1) / (c2-c1) )
else {zone 3}
warnab2 := d2 + round( (warnab-c2) * (255-d2) / (255-c2) );
arCitra2[ix,iy] := warnab2;
end;
end;
end;
procedure TfrmContrast.Button1Click(Sender: TObject);
begin
Button1.Enabled := False;
frmContrast.Cursor := crHourGlass;
ContrastStretch;
TampilkanHasil;
UpdateHistogram;
Button1.Enabled := True;
frmContrast.Cursor := crDefault;
end;
procedure TfrmContrast.FormCreate(Sender: TObject);
begin
lblC1.Caption := IntToStr(scbC1.Position);
lblD1.Caption := IntToStr(scbD1.Position);
lblC2.Caption := IntToStr(scbC2.Position);
lblD2.Caption := IntToStr(scbD2.Position);
UpdateContrastSetting;
end;
procedure TfrmContrast.scbC1Change(Sender: TObject);
begin
if scbC1.Position > scbC2.Position then
scbC1.Position := scbC2.Position;
lblC1.Caption := IntToStr(scbC1.Position);
UpdateContrastSetting;
end;
procedure TfrmContrast.scbD1Change(Sender: TObject);
begin
if scbD1.Position > scbD2.Position then
scbD1.Position := scbD2.Position;
lblD1.Caption := IntToStr(scbD1.Position);
UpdateContrastSetting;
end;
procedure TfrmContrast.scbC2Change(Sender: TObject);
begin
if scbC2.Position < scbC1.Position then
scbC2.Position := scbC1.Position;
lblC2.Caption := IntToStr(scbC2.Position);
UpdateContrastSetting;
end;
procedure TfrmContrast.scbD2Change(Sender: TObject);
begin
if scbD2.Position < scbD1.Position then
scbD2.Position := scbD1.Position;
lblD2.Caption := IntToStr(scbD2.Position);
UpdateContrastSetting;
end;
procedure TfrmContrast.Button2Click(Sender: TObject);
begin
Close;
end;
end.

Comments
mbt shoes outlet
Mbt shoes are in the fashion,discount mbt shoes Sport and mbt tataga Mbt shoes encourage an active, healthy lifestyle
Bailey Button Ugg Boots
Your Classic Tall Ugg Boots article very interesting, I have introduced a lot of friends look at this Classic Short Ugg Boots article, the content of the articles there will be a lot of Ultra Tall Ugg Boots attractive people to appreciate, I have to thank you such an article.
Thanks a lot for this useful
Thanks a lot for this useful post, the info is pretty good and the description very adecuate. Keep the good work.Home Staging Toronto
one day i went shopping
one day i went shopping outside ,and in an ed hardy store,I found some kinds of ed hardy i love most。they are: ed hardy T-shirts on sale ed hardy T-shirts on sale ed hardy T-shirts sales ed hardy T-shirts sales cheap ed hardy T-shirts on sale cheap ed hardy T-shirts on sale cheap ed hardy T-shirts sale cheap ed hardy T-shirts sale ed hardy T-shirts for men on sale ed hardy T-shirts for men on sale disconnt ed hardy T-shirts for men on sale disconnt ed hardy T-shirts for men on sale ed hardy T-shirts online ed hardy T-shirts online discount ed hardy T-shirts discount ed hardy T-shirts discount ed hardy T-shirts on sale discount ed hardy T-shirts on sale
cjcshadow
MBT Shoes
MBT Chapa Women Shoes
MBT Kisumu Sales
cjcshadow
Air Force 1 Release Dates
Air Force1 25th Mens Anniversary Shoes
Air Force 1 Affliction Shoes Discount
cjcshadow
Cheap Ugg Boots
UGG Classic Tall Boots
UGG Classic Cardy
cjcshadow
cheap ugg boots sale
Women's UGG Classic Tall Boots
Cheap UGG Classic Crochet Boots
street lighting
christian louboutin christian louboutin street lighting street lighting christian louboutin discount christian louboutin discount street lamps street lamps christian louboutin sale christian louboutin sale street light street light street lights street lights street lights solar street lights solar street lights
Air jordan shoes
Thanks for your useful info, I think it’s a good topic. So would you like the info about the
jordan shoes
Air jordan shoes
cardy ugg boots
ugg bailey button boots
cheap jordan shoes
ugg boots uk
Michael jordan shoes
ugg london
ugg nightfall boots
ugg boots sale
classic ugg boots
sundance ugg boots
air jordan fusion 6
air jordan 6 rings
Tiffany Jewelry
jordan shoes for sale
Post new comment