58
TUGAS PENGOLAHAN CITRA DIGITAL “ SIMPLE IMAGE PROCESSING “ Dikerjakan Oleh : 1. Rachmat Abadi Louhatta [23400041] 2. Meilia Dian [23400082] 3. Philipus Heru [23400018]

PCD Report

Embed Size (px)

DESCRIPTION

sedfsfdsfds

Citation preview

Page 1: PCD Report

TUGAS

PENGOLAHAN CITRA DIGITAL

“ SIMPLE IMAGE PROCESSING “

Dikerjakan Oleh :

1. Rachmat Abadi Louhatta [23400041]

2. Meilia Dian [23400082]

3. Philipus Heru [23400018]

JURUSAN TEKNIK ELEKTRTO

FAKULTAS TEKNOLOGI INDUSTRI

UNIVERSITAS KRISTEN PETRA

SURABAYA

Page 2: PCD Report

1. Nama Program

Simple Image Processing

2. Tujuan

Tujuan dari program ini adalah sebagai sebuah software yang memiliki

beberapa kemampuan dasar untuk melakukan edit terhadap suatu image

( dalam hal ini image bertipe bitmap yaitu image yang memiliki

ekstension .BMP ) sehingga menjadikan image tersebut lebih baik

kualitasnya daripada sebelumnya. Dalam hal ini kita dapat menambahkan

contrast / bright apabila image yang ada kurang terang, atau dengan

menambahkan efek – efek khusus seperti model kanvas, bluring, ataupun

lain sebagainya.

3. Platform Program

Menggunakan Delphi 7, tetapi bisa kompatibel dengan versi sebelumnya ( yang

jalan dengan windows 98 ke atas )

4. Kemampuan program dan batasannya

Input image harus berupa file bitmap ( *.BMP )

Lebih baik bila menggunakan image dengan ukuran yang kecil karena

image dengan ukuran yang besar dapat memperlambat proses filter dan

sebagainya.

Memiliki kemampuan dasar seperti contrast stretching ( untuk meratakan

contrast pada image ), Brightness, Gray Scale ( tingkat Gray dari image ),

Negative ( invers dari image ), dan efek – efek seperti emboss, relief, canvas,

blur, disamping juga melakukan proses histogram equalization pada image.

5. Methods

Page 3: PCD Report

Dalam program ini Image yang digunakan adalah Image bertipe bitmap file

( *.BMP ) dan program ini tidak membatasi ukuran file. Menggunaka

file .BMP karena akan disesuaikan dengan sendirinya dengan besar frame

yang tersedia. Menggunakan metode RGB dalam proses omage warna.

A. Point processing

1. negative

Metode yang digunakan dari negative ini adalah dengan menginvers pixel

yang sudah ada sehingga didapat nilai kebalikannya.

2. Contrast Stretching

Metode yang digunakan adalah dengan menghitung pixel level dari

image dan kemudian melakukan proses untuk melebarkan pita pixel

levelnya :

3. Gray Level

Menggunakan metode yang biasanya digunakan yaitu dengan menggunakan

metode =

4. Histogram

5. Brightness

Terbagi atas 2 jenis yaitu more dan less :

Untuk more :

Pixel baru = 255 – ((255 - pixel level)2 /255 ) x 255

Untuk less :

Pixel baru = ( Pixel level / 255)2 x 255

B. Filter

1.1. Frequency Maximum

Page 4: PCD Report

Menggunakan metodee zaro-padding setelah itu dalam teknik ini

menggunakan perbandingan pixel Image 3 x 3 dengan mengambil nilai

tertingginya sebagai pixel yang baru.

1.2. Frequency Minimum

Menggunakan metodee zero-padding, dimana juga menggunakan

perbandinan pixel Image 3 x 3 dengan mengambil nilai terendahnya

sebagai pixel yang baru.

2. Smoothing Filter

1. Low pass spatial

Melakukan konvolusi dengan menggunakan kernel :

Hasil dari konvolusi ini akan digunakan sebagai pixel baru.

2. Median Spatial

Melakukan konvolusi dengan menggunakan kernel :

3. Sharpening

Melakukan konvolusi dengan menggunakan kernel :

4. Bluring

Melakukan konvolusi dengan menggunakan kernel :

5. Emboss

Page 5: PCD Report

C. Special Effect

Menggunakan perpaduan beberapa teknik yang telah ada sebelumnya,

yaitu :

1. Relief :

Page 6: PCD Report

2. Canvas :

6. Jadwal Pengerjaan Program : Sekitar kurang – lebih 4 minggu

7. UAS : Kumpul laporan program dan demo program

Page 7: PCD Report

8. BLOCK DIAGRAM & ANALISA

A. Point Processing :

1. Negative

Image Asli Negative Image Hasil

Dengan menggunakan tools negative ini image akan di inverse sehingga

image hasil menjadi kebalikan / inverse daripada image asli.

Page 8: PCD Report

2. Contrast Stretching

Image asli Contrast Stretching Image Hasil

Setelah proses contrast stretching ini, image hasil memiliki contrast

yang lebih merata sehingga image baru terlihat memiliki warna lebih

cerah

3. Gray Level

Image asli Gray Level Image Hasil

Setelah proses Gray Level ini, image hasil mengalami kehilangan

warna, dengan hilangnya warna RGB ( Red, Green, Blue ), sehingga

image hasil hanya memiliki warna hitam putih.

4. Histogram

Image asli Histogram Image Hasil

5. Brightness More

Image asli Brightness more Image Hasil

Page 9: PCD Report

Setelah proses Brightness more, image hasil akan memiliki warna yang

lebih cerah daripada image aslinya.

6. Brightness Less

Image Asli Brightness Less Image Hasil

Setelah mengalami Brightness Less, image hasil akan mengalami

pengurangan pada tingkat kecerahan warna, sehingga image hasil

cenderung memiliki warna yang lebih gelap dibandingkan image aslinya.

B. Filter

1. Frequency Filter Maximum

Image Asli Frequency Filter Maximum Image Hasil

Setelah mela

Setelah mengalami Frequency Filter Maximum, image hasil akan mengalami

kehilangan image detail yang ada pada image asli, nilai pixel tertinggi yang

akan ditampilkan sehingga feature ini dapat juga dipakai untuk

menghilangkan noise pada image.

2. Frequency Filter Minimum

Image Asli Frequency Filter Minimum Image Hasil

Page 10: PCD Report

Setelah imahe mengalami frequency filter minimum, maka terjadi

perbaikan / filter pada nilai pixel terendah sehingga menghasilkan image

yang sedikit lebih gelap daripada image awal, dalam proses ini mengalami

filter, bukan untuk membuat image bertambah gelap.

3. Smoothing Filters ( Low pass )

Image Asli Low pass Image hasil

Setelah mengalami low pass filter, image akan terlihat sangat halus,

bahkan mungkin terlihat terlalu halus, sehingga berkesan agk kabur. Feature

ini juga dapat digunakan untuk membantu menghilangkan noise /

memperbaiki kualitas image.

4. Smoothing Filters ( Median pass )

Image Asli Median pass Image hasil

Setelah mengalami median filter, umage akan terlihat sedikit lebih halus,

walaupun tidak sehalus smoothing filter, sehingga image tidak terlihat

terlalu kabur, hal ini terjadi karena image yang didapat merupakan nilai

tengah pixel, sehingga seperti mengalami rata – rata. Feature ini juga dapat

digunakan untuk membantu menghilangkan noise / memperbaiki kualitas

image.

5. Sharpen

Image Asli Sharpen Image hasil

Page 11: PCD Report

Setelah mengalami sharpen, image terlihat lebih tajam dibandingkan

sebelumnya.

6. Blur

Image Asli Blur Image Hasil

Setelah mengalami bluring, image terlihat lebih halus. Sebenarnya proses

bluring ini tidak terlalu berbeda dengan low pass spatial, yaitu untuk

mensimulasi focus dan sebagainya.

7. Emboss

Image Asli Emboss Image Hasil

Emboss merupakan salah satu variasi untuk meciptakan efek – efek khusus

pada image, sehingga image hasil terlihat seperti ukiran pada bidang padat

( semen ).

C. Special Effects

1. Relief

Image Asli Relief Image Hasil

Relief juga merupakan variasi untuk meciptakan efek – efek khusus pada

image. Relief merupakan gabungan dari beberapa feature seperti contrast

Stretching, emboss, brightness, histogram, blur.

Page 12: PCD Report

2. Canvas

Image Asli Canvas Image Hasil

Efek canvas ini merupakan feture yang akan membuat image hasil terlihat

seperti digambarkan di atas sebuah canvas. Feature ini juga merupakan

gabungan dari feature – feature seperti contrast stretching dan kemudian

mengalami sharpening.

9. Screenshot

Page 13: PCD Report

10. Kesimpulan

Dengan demikian berarti dapat disimpulkan bahwa :

1. Suatu image yang tidak terlalu baik kualitasnya dapat sedikit diperbaiki

dengan menggunakan image tools, karena didalam image tools memiliki

beberapa feature yang dapat memperbaiki kualitas image seperti :

contrast stretching yang berguna untuk meng-“stretching” contrast dari

image sehingga menjadi lebih merata, dan juga beberapa fungsi filter

lainnya seperti median spatial filte yang dapat membantu memperhalus

image. Selain itu juga dapat menambahkan beberapa efek pada image,

seperti feature canvas yang dapat membuat image terlihat seperti

digambarkan di atas canvas lukisan.

2. Filter dengan menggunakan median spatial terlihat lebih baik daripada

low pass spatial karena dengan median spatial, image memang dipehalus

namun tidak sehalus low pass, sehingga masih dapat terlihat image

detailnya.

3. Suatu image yang agak terlihat kabur, bisa menjadi lebih baik dengan

menggunakan sharpening, sehingga gambar menjadi lebih tajam dan

image detailnya lebih dapat dilihat.

4. Menggunakan Kernell yang semakin besar akan berpengaruh terhadap

kualitas image, dimana kernel yang semakin besar akan semakin

membuat image terlihat lebih halus.

Page 14: PCD Report

11. Listing Program

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, Menus, StdCtrls, Gauges, ExtCtrls;

type

theaderbmp = record

Tipe : string[2];

fSize : longint;

Reserved1 : shortint;

Reserved2 : word;

OffBits : longint;

iSize : longint;

Width : longint;

Height : longint;

Planes : word;

BitCount : word;

Compression : longint;

SizeImage : longint;

XPelsPerMeter : longint;

YPelsPerMeter : longint;

ClrUsed : longint;

ClrImportant : longint;

end;

Page 15: PCD Report

palete = record

B : byte;

G : byte;

R : byte;

U : byte;

end;

tpalette = array of palete;

//utk operasi di image :

TPixel = record

blue : byte;

green : byte;

red : byte;

end;

tdata = array of array of TPixel;

PPixel = ^ArrPixel;

ArrPixel = array[0..0] of TPixel;

tcomplex = record

r,i : extended;

end;

tverycomplex = record

red,green,blue : tcomplex;

end;

acomp = array of array of tverycomplex;

this = record

n : integer;

pr : real;

jum : real;

s : integer;

bagi : real;

end;

phis = array[0..255]of this;

a = array[1..5,1..5] of integer;

Page 16: PCD Report

TForm1 = class(TForm)

Label1: TLabel;

MainMenu1: TMainMenu;

OpenDialog1: TOpenDialog;

SaveDialog1: TSaveDialog;

File1: TMenuItem;

PointProcessing1: TMenuItem;

Filter1: TMenuItem;

Negative1: TMenuItem;

ContrastStretching1: TMenuItem;

GrayLevel1: TMenuItem;

Histogram1: TMenuItem;

SmoothingFilters1: TMenuItem;

LowPassSpatial1: TMenuItem;

MedianSpatial1: TMenuItem;

Open1: TMenuItem;

CetakHeader1: TMenuItem;

Exit1: TMenuItem;

Image1: TImage;

Gauge1: TGauge;

Brightness1: TMenuItem;

More1: TMenuItem;

Less1: TMenuItem;

Sharpen1: TMenuItem;

Blur1: TMenuItem;

Emboss1: TMenuItem;

FrequencyFilters1: TMenuItem;

Maximum1: TMenuItem;

Minimum1: TMenuItem;

SpecialEffects1: TMenuItem;

Relief1: TMenuItem;

Page 17: PCD Report

Canvas1: TMenuItem;

AboutUs1: TMenuItem;

RachmatAbadilouhatta234000411: TMenuItem;

MeiliaDian1: TMenuItem;

procedure Exit1Click(Sender: TObject);

procedure Open1Click(Sender: TObject);

procedure CetakHeader1Click(Sender: TObject);

procedure Negative1Click(Sender: TObject);

procedure ContrastStretching1Click(Sender: TObject);

procedure GrayLevel1Click(Sender: TObject);

procedure Potong(temp:byte);

procedure Histogram1Click(Sender: TObject);

procedure More1Click(Sender: TObject);

procedure Less1Click(Sender: TObject);

procedure Filterpass;

procedure Filterpass2;

procedure Sharpen1Click(Sender: TObject);

procedure Blur1Click(Sender: TObject);

procedure Emboss1Click(Sender: TObject);

procedure Maximum1Click(Sender: TObject);

procedure Minimum1Click(Sender: TObject);

procedure Relief1Click(Sender: TObject);

procedure Canvas1Click(Sender: TObject);

procedure LowPassSpatial1Click(Sender: TObject);

procedure Lowpassfilter;

procedure MedianSpatial1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

Page 18: PCD Report

var

Form1: TForm1;

header: theaderbmp;

palet: tpalette;

data: tdata;

kompleks : acomp;

factor : integer;

filter : array[0..99,0..99]of integer;

offset : longint;

buff1,buff2 : array[1..1000,1..1000] of real;

implementation

uses Unit2, Unit3;

{$R *.dfm}

procedure TForm1.Exit1Click(Sender: TObject);

begin

application.Terminate;

end;

procedure TForm1.Open1Click(Sender: TObject);

var

nf:file;

i,j:integer;

TLine: PPixel;

begin

if opendialog1.Execute then begin

//Gambar citra BMP

image1.Picture.LoadFromFile(opendialog1.filename);

Page 19: PCD Report

image1.Picture.Bitmap.PixelFormat := PF24Bit;

image1.Repaint;

//Load File BMP

assignfile(nf,opendialog1.FileName);

reset(nf,1);

if ioresult=0 then begin

blockread(nf,header.Tipe,2);

blockread(nf,header.fSize,4);

blockread(nf,header.Reserved1,2);

blockread(nf,header.Reserved2,2);

blockread(nf,header.OffBits,4);

blockread(nf,header.iSize,4);

blockread(nf,header.Width,4);

image1.Picture.Bitmap.Width := header.width;

blockread(nf,header.Height,4);

image1.Picture.Bitmap.Height := header.height;

blockread(nf,header.Planes,2);

blockread(nf,header.BitCount,2);

blockread(nf,header.Compression,4);

blockread(nf,header.SizeImage,4);

blockread(nf,header.XPelsPerMeter,4);

blockread(nf,header.YPelsPerMeter,4);

blockread(nf,header.ClrUsed,4);

blockread(nf,header.ClrImportant,4);

//Cetak ke form2 cetak header

form2.Memo2.Lines.Clear;

form2.memo2.lines.add('Type File = BitMap');

form2.memo2.lines.add('Ukuran File = '+inttostr(header.fSize));

form2.memo2.lines.add('Reserved1 = '+inttostr(header.Reserved1));

form2.memo2.lines.add('Reserved2 = '+inttostr(header.Reserved2));

form2.memo2.lines.add('Offbits = '+inttostr(header.OffBits));

form2.memo2.lines.add('Ukuran Header = '+inttostr(header.iSize));

Page 20: PCD Report

form2.memo2.lines.add('Ukuran Lebar = '+inttostr(header.Width));

form2.memo2.lines.add('Ukuran Tinggi = '+inttostr(header.Height));

form2.memo2.lines.add('Planes = '+inttostr(header.Planes));

form2.memo2.lines.add('BitCount = '+inttostr(header.BitCount));

form2.memo2.lines.add('Compression =

'+inttostr(header.Compression));

form2.memo2.lines.add('Ukuran Gambar =

'+inttostr(header.SizeImage));

form2.memo2.lines.add('Posisi X =

'+inttostr(header.XPelsPerMeter));

form2.memo2.lines.add('Posisi Y =

'+inttostr(header.YPelsPerMeter));

form2.memo2.lines.add('Warna = '+inttostr(header.ClrUsed));

form2.memo2.lines.add('Warna Utama =

'+inttostr(header.ClrImportant));

//palette

if header.BitCount < 24 then begin

form2.Memo2.Lines.Add('');

form2.memo2.lines.add('Color Palette');

form2.memo2.lines.add(' No B G R');

j := 1;

for i := 1 to header.BitCount do

j := j*2;

setlength(palet,j);

for i := 0 to j-1 do begin

blockread(nf,palet[i],4);

form2.memo2.lines.add(format('%3d %3d %3d %3d',

[i,palet[i].B,palet[i].G,palet[i].R]));

end;

form2.memo2.lines.add('');

end;

//Cetak Data warna ke Canvas

Page 21: PCD Report

setlength(data,header.Height);

for i := 0 to header.Height-1 do

setlength(data[i],header.Width);

for i := 0 to header.Height-1 do begin

TLine := image1.Picture.Bitmap.ScanLine[i];

for j := 0 to header.Width-1 do begin

data[i,j] := TLine^[j];

end;

end;

setlength(kompleks,header.height);

for i := 0 to header.height-1 do setlength(kompleks[i],header.width);

closefile(nf);

end

else showmessage('Maaf File Anda Tidak Ditemukan');

end;

end;

procedure TForm1.CetakHeader1Click(Sender: TObject);

begin

form2.Show;

end;

procedure TForm1.Negative1Click(Sender: TObject);

var

i,j:integer;

TLine: PPixel;

begin

gauge1.Progress:=0;

gauge1.MaxValue:=header.Height*header.Width;

for i:=0 to header.Height-1 do begin

tline:=image1.Picture.Bitmap.ScanLine[i];

for j:=0 to header.Width-1 do begin

Page 22: PCD Report

tline^[j].red:=255-tline^[j].red;

tline^[j].green:=255-tline^[j].green;

tline^[j].blue:=255-tline^[j].blue;

gauge1.Progress:=gauge1.Progress+1;

end;

end;

image1.Repaint;

gauge1.Progress:=0;

end;

procedure TForm1.ContrastStretching1Click(Sender: TObject);

var

i,j:integer;

TLine: PPixel;

x1,x2,y1,y2:byte;

function contrast(warna:byte):byte;

var

temp:real;

begin

if warna<x1 then temp:=warna*y1/x1

else

if warna>x2 then temp:=((warna-x2)*(255-y2)/(255-x2)) + y2

else temp:=((warna-x1)*(y2-y1)/(x2-x1)) + y1;

contrast:=round(temp);

end;

begin

x1:=150;

x2:=105;

y1:=140;

y2:=150;

Page 23: PCD Report

gauge1.Progress:=0;

gauge1.MaxValue:=header.Height*header.Width;

for i:=0 to header.Height-1 do begin

tline:=image1.Picture.Bitmap.ScanLine[i];

for j:=0 to image1.Picture.Bitmap.Width-1 do begin

tline^[j].red:=contrast(tline^[j].red);

tline^[j].green:=contrast(tline^[j].green);

tline^[j].blue:=contrast(tline^[j].blue);

gauge1.Progress:=gauge1.Progress+1;

end;

end;

image1.Repaint;

gauge1.Progress:=0;

end;

procedure TForm1.GrayLevel1Click(Sender: TObject);

var

i,j:integer;

tline:ppixel;

begin

gauge1.Progress:=0;

gauge1.MaxValue:=header.Height*header.Width;

for i:=0 to header.Height-1 do begin

tline:=image1.Picture.Bitmap.ScanLine[i];

for j:=0 to header.Width-1 do begin

tline^[j].red:=(TLine^[j].red+TLine^[j].green+TLine^[j].blue) div

3;

tline^[j].green:=tline^[j].red;

tline^[j].blue:=tline^[j].red;

gauge1.Progress:=gauge1.Progress+1;

end;

end;

Page 24: PCD Report

image1.Repaint;

gauge1.Progress:=0;

end;

procedure tform1.potong(temp:byte);

var

i,j:integer;

tline:ppixel;

cek:byte;

begin

gauge1.Progress:=0;

gauge1.MaxValue:=header.Height*header.Width;

form3.image1.picture:=image1.picture;

form3.image1.Picture.Bitmap.PixelFormat := PF24Bit;

form3.image2.picture:=image1.picture;

form3.image2.Picture.Bitmap.PixelFormat := PF24Bit;

form3.image3.picture:=image1.picture;

form3.image3.Picture.Bitmap.PixelFormat := PF24Bit;

form3.image4.picture:=image1.picture;

form3.image4.Picture.Bitmap.PixelFormat := PF24Bit;

form3.image5.picture:=image1.picture;

form3.image5.Picture.Bitmap.PixelFormat := PF24Bit;

form3.image6.picture:=image1.picture;

form3.image6.Picture.Bitmap.PixelFormat := PF24Bit;

form3.image7.picture:=image1.picture;

form3.image7.Picture.Bitmap.PixelFormat := PF24Bit;

form3.image8.picture:=image1.picture;

form3.image8.Picture.Bitmap.PixelFormat := PF24Bit;

form3.image9.picture:=image1.picture;

form3.image9.Picture.Bitmap.PixelFormat := PF24Bit;

form3.image10.picture:=image1.picture;

form3.image10.Picture.Bitmap.PixelFormat := PF24Bit;

Page 25: PCD Report

form3.image11.picture:=image1.picture;

form3.image11.Picture.Bitmap.PixelFormat := PF24Bit;

form3.image12.picture:=image1.picture;

form3.image12.Picture.Bitmap.PixelFormat := PF24Bit;

for i:=0 to header.Height-1 do begin

tline:=form3.Image1.Picture.Bitmap.ScanLine[i];

for j:=0 to header.Width-1 do begin

tline^[j].blue:=tline^[j].blue and 1;

tline^[j].green:=tline^[j].green and 1;

tline^[j].red:=tline^[j].red and 1;

end;

cek:=temp*3;

tline:=form3.Image2.Picture.Bitmap.ScanLine[i];

for j:=0 to header.Width-1 do begin

tline^[j].blue:=tline^[j].blue and (4+cek);

tline^[j].green:=tline^[j].green and (4+cek);

tline^[j].red:=tline^[j].red and (4+cek);

end;

cek:=temp*7;

tline:=form3.Image3.Picture.Bitmap.ScanLine[i];

for j:=0 to header.Width-1 do begin

tline^[j].blue:=tline^[j].blue and (8+cek);

tline^[j].green:=tline^[j].green and (8+cek);

tline^[j].red:=tline^[j].red and (8+cek);

end;

cek:=temp*15;

tline:=form3.Image4.Picture.Bitmap.ScanLine[i];

for j:=0 to header.Width-1 do begin

tline^[j].blue:=tline^[j].blue and (16+cek);

tline^[j].green:=tline^[j].green and (16+cek);

tline^[j].red:=tline^[j].red and (16+cek);

end;

Page 26: PCD Report

cek:=temp*31;

tline:=form3.Image5.Picture.Bitmap.ScanLine[i];

for j:=0 to header.Width-1 do begin

tline^[j].blue:=tline^[j].blue and (32+cek);

tline^[j].green:=tline^[j].green and (32+cek);

tline^[j].red:=tline^[j].red and (32+cek);

end;

cek:=temp*63;

tline:=form3.Image6.Picture.Bitmap.ScanLine[i];

for j:=0 to header.Width-1 do begin

tline^[j].blue:=tline^[j].blue and (64+cek);

tline^[j].green:=tline^[j].green and (64+cek);

tline^[j].red:=tline^[j].red and (64+cek);

end;

cek:=temp*127;

tline:=form3.Image7.Picture.Bitmap.ScanLine[i];

for j:=0 to header.Width-1 do begin

tline^[j].blue:=tline^[j].blue and (128+cek);

tline^[j].green:=tline^[j].green and (128+cek);

tline^[j].red:=tline^[j].red and (128+cek);

end;

cek:=temp*255;

tline:=form3.Image8.Picture.Bitmap.ScanLine[i];

for j:=0 to header.Width-1 do begin

tline^[j].blue:=tline^[j].blue and (256+cek);

tline^[j].green:=tline^[j].green and (256+cek);

tline^[j].red:=tline^[j].red and (256+cek);

end;

cek:=temp*1023;

tline:=form3.Image9.Picture.Bitmap.ScanLine[i];

for j:=0 to header.Width-1 do begin

tline^[j].blue:=tline^[j].blue and (1024+cek);

Page 27: PCD Report

tline^[j].green:=tline^[j].green and (1024+cek);

tline^[j].red:=tline^[j].red and (1024+cek);

end;

cek:=temp*2047;

tline:=form3.Image10.Picture.Bitmap.ScanLine[i];

for j:=0 to header.Width-1 do begin

tline^[j].blue:=tline^[j].blue and (2048+cek);

tline^[j].green:=tline^[j].green and (2048+cek);

tline^[j].red:=tline^[j].red and (2048+cek);

end;

cek:=temp*4095;

tline:=form3.Image11.Picture.Bitmap.ScanLine[i];

for j:=0 to header.Width-1 do begin

tline^[j].blue:=tline^[j].blue and (4096+cek);

tline^[j].green:=tline^[j].green and (4096+cek);

tline^[j].red:=tline^[j].red and (4096+cek);

end;

cek:=temp*8191;

tline:=form3.Image12.Picture.Bitmap.ScanLine[i];

for j:=0 to header.Width-1 do begin

tline^[j].blue:=tline^[j].blue and (8191+cek);

tline^[j].green:=tline^[j].green and (8191+cek);

tline^[j].red:=tline^[j].red and (8191+cek);

gauge1.Progress:=gauge1.Progress+1;

end;

end;

form3.Image1.Repaint;

form3.Image2.Repaint;

form3.Image3.Repaint;

form3.Image4.Repaint;

form3.Image5.Repaint;

form3.Image6.Repaint;

Page 28: PCD Report

form3.Image7.Repaint;

form3.Image8.Repaint;

form3.Image9.Repaint;

form3.Image10.Repaint;

form3.Image11.Repaint;

form3.Image12.Repaint;

form3.Show;

gauge1.Progress:=0;

end;

procedure TForm1.Histogram1Click(Sender: TObject);

var jum : array[0..255] of longint;

look : array[0..255] of byte;

i,j,k : longint;

r : real;

h : byte;

TLine : PPixel;

begin

gauge1.Progress:=0;

gauge1.MaxValue:=header.Height*header.Width;

for h := 1 to 3 do begin

for i := 0 to 255 do

jum[i] := 0;

for i := 0 to header.Height-1 do begin

TLine := image1.Picture.Bitmap.ScanLine[i];

for j := 0 to header.Width-1 do

case h of

1 : inc(jum[TLine^[j].red]);

2 : inc(jum[TLine^[j].green]);

3 : inc(jum[TLine^[j].blue]);

Page 29: PCD Report

end;

end;

k := header.Height * header.Width;

r := 0;

i := 0;

repeat

j := 0;

r := r + jum[i]/k;

if r>0 then

repeat

inc(j);

until (r <= (j+1)/256) or (j>=255);

look[i] := j;

inc(i);

until i=256;

for i := 0 to 255 do jum[i] := look[i];

for i := 0 to header.Height-1 do begin

TLine := image1.Picture.Bitmap.ScanLine[i];

for j := 0 to header.Width-1 do begin

case h of

1 : TLine^[j].red := jum[TLine^[j].red];

2 : TLine^[j].green := jum[TLine^[j].green];

3 : TLine^[j].blue := jum[TLine^[j].blue];

end;

end;

end;

end;

image1.Repaint;

gauge1.Progress:=0;

end;

procedure TForm1.More1Click(Sender: TObject);

Page 30: PCD Report

var TLine : PPixel;

i,j : integer;

begin

gauge1.Progress:=0;

gauge1.MaxValue:=header.Height*header.Width;

for i := 0 to header.Height-1 do begin

TLine := image1.Picture.Bitmap.ScanLine[i];

for j := 0 to header.Width-1 do begin

TLine^[j].red := 255-round(sqr((255-TLine^[j].red)/255)*255);

TLine^[j].green := 255-round(sqr((255-TLine^[j].green)/255)*255);

TLine^[j].blue := 255-round(sqr((255-TLine^[j].blue)/255)*255);

end;

end;

image1.Repaint;

gauge1.Progress:=0;

end;

procedure TForm1.Less1Click(Sender: TObject);

var TLine : PPixel;

i,j : integer;

begin

gauge1.Progress:=0;

gauge1.MaxValue:=header.Height*header.Width;

for i := 0 to header.Height-1 do begin

TLine := image1.Picture.Bitmap.ScanLine[i];

for j := 0 to header.Width-1 do begin

TLine^[j].red := round(sqr(TLine^[j].red/255)*255);

TLine^[j].green := round(sqr(TLine^[j].green/255)*255);

TLine^[j].blue := round(sqr(TLine^[j].blue/255)*255);

end;

end;

image1.Repaint;

Page 31: PCD Report

gauge1.Progress:=0;

end;

procedure TForm1.filterpass;

var TLine1, TLine2, TLine3 : PPixel;

pixl : longint;

i,j : integer;

h,k : byte;

begin

gauge1.Progress:=0;

gauge1.MaxValue:=header.Height*header.Width;

for h := 1 to 3 do

for i := 1 to header.Height-2 do begin

TLine1 := image1.Picture.Bitmap.ScanLine[i-1];

TLine2 := image1.Picture.Bitmap.ScanLine[i];

TLine3 := image1.Picture.Bitmap.ScanLine[i+1];

for j := 1 to header.Width-2 do begin

pixl := 0;

for k := 0 to 2 do

case h of

1 : pixl := pixl + round(TLine1^[j-1].red*filter[0,k] +

TLine2^[j].red*filter[1,k]+ TLine3^[j+1].red*filter[2,k]);

2 : pixl := pixl + round(TLine1^[j-1].green*filter[0,k] +

TLine2^[j].green*filter[1,k]+ TLine3^[j+1].green*filter[2,k]);

3 : pixl := pixl + round(TLine1^[j-1].blue*filter[0,k] +

TLine2^[j].blue*filter[1,k]+ TLine3^[j+1].blue*filter[2,k]);

end;

case h of

1 : if pixl div factor>255 then TLine2^[j].red := 255 else if pixl div factor<0

then TLine2^[j].red := 0 else TLine2^[j].red := pixl div factor;

2 : if pixl div factor>255 then TLine2^[j].green := 255 else if pixl div

factor<0 then TLine2^[j].green := 0 else TLine2^[j].green := pixl div factor;

Page 32: PCD Report

3 : if pixl div factor>255 then TLine2^[j].blue := 255 else if pixl div factor<0

then TLine2^[j].blue := 0 else TLine2^[j].blue := pixl div factor;

end;

end;

end;

image1.Repaint;

gauge1.Progress:=0;

end;

procedure TForm1.filterpass2;

var TLine11,TLine12,TLine13, TLine22 : PPixel;

temp : TBitmap;

pixl1, pixl2, pixl3 : longint;

i,j : integer;

k : byte;

begin

gauge1.Progress:=0;

gauge1.MaxValue:=header.Height*header.Width;

temp := TBitmap.Create;

temp.Width := image1.Picture.Bitmap.Width;

temp.Height := image1.Picture.Bitmap.Height;

temp.PixelFormat := pf24bit;

for i := 1 to header.Height-2 do begin

TLine11 := image1.Picture.Bitmap.ScanLine[i-1];

TLine12 := image1.Picture.Bitmap.ScanLine[i];

TLine13 := image1.Picture.Bitmap.ScanLine[i+1];

TLine22 := temp.ScanLine[i];

for j := 1 to header.Width-2 do begin

pixl1 := 0;

pixl2 := 0;

pixl3 := 0;

Page 33: PCD Report

for k := 0 to 2 do begin

pixl1 := pixl1 + round(TLine11^[j-1].red*filter[0,k] +

TLine12^[j].red*filter[1,k]+ TLine13^[j+1].red*filter[2,k]);

pixl2 := pixl2 + round(TLine11^[j-1].green*filter[0,k] +

TLine12^[j].green*filter[1,k]+ TLine13^[j+1].green*filter[2,k]);

pixl3 := pixl3 + round(TLine11^[j-1].blue*filter[0,k] +

TLine12^[j].blue*filter[1,k]+ TLine13^[j+1].blue*filter[2,k]);

end;

if pixl1 div factor>255 then TLine22^[j].red := 255 else if pixl1 div factor<0

then TLine22^[j].red := 0 else TLine22^[j].red := pixl1 div factor;

if pixl2 div factor>255 then TLine22^[j].green := 255 else if pixl2 div

factor<0 then TLine22^[j].green := 0 else TLine22^[j].green := pixl2 div factor;

if pixl3 div factor>255 then TLine22^[j].blue := 255 else if pixl3 div

factor<0 then TLine22^[j].blue := 0 else TLine22^[j].blue := pixl3 div factor;

end;

end;

image1.Picture.Bitmap := temp;

image1.Repaint;

gauge1.Progress:=0;

end;

procedure TForm1.Sharpen1Click(Sender: TObject);

begin

filter[0,0] := 0;

filter[0,1] := -1;

filter[0,2] := 0;

filter[1,0] := -1;

filter[1,1] := 5;

filter[1,2] := -1;

filter[2,0] := 0;

filter[2,1] := -1;

filter[2,2] := 0;

Page 34: PCD Report

factor := 1;

offset := 0;

filterpass2;

end;

procedure TForm1.Blur1Click(Sender: TObject);

begin

filter[0,0] := 1;

filter[0,1] := 1;

filter[0,2] := 1;

filter[1,0] := 1;

filter[1,1] := 1;

filter[1,2] := 1;

filter[2,0] := 1;

filter[2,1] := 1;

filter[2,2] := 1;

factor := 9;

offset := 0;

filterpass;

end;

procedure TForm1.Emboss1Click(Sender: TObject);

var TLine1, TLine2, TLine3 : PPixel;

i,j : integer;

begin

gauge1.Progress:=0;

gauge1.MaxValue:=header.Height*header.Width;

GrayLevel1.Click;

for i := 1 to header.Height-2 do begin

TLine1 := image1.Picture.Bitmap.ScanLine[i-1];

TLine2 := image1.Picture.Bitmap.ScanLine[i];

TLine3 := image1.Picture.Bitmap.ScanLine[i+1];

Page 35: PCD Report

for j := 1 to header.Width-2 do begin

TLine2^[j].red := ((TLine2^[j-1].red - TLine2^[j+1].red + TLine3^[j].red -

TLine1^[j].red) div 2) + 128;

TLine2^[j].green := TLine2^[j].red;

TLine2^[j].blue := TLine2^[j].red;

end;

end;

image1.Repaint;

gauge1.Progress:=0;

end;

procedure TForm1.Maximum1Click(Sender: TObject);

var TLine11,TLine12,TLine13, TLine22 : PPixel;

temp : TBitmap;

pixl1, pixl2, pixl3, max,hit : byte;

i,j : integer;

k: shortint;

begin

gauge1.Progress:=0;

gauge1.MaxValue:=header.Height*header.Width;

temp := TBitmap.Create;

temp.Width := image1.Picture.Bitmap.Width;

temp.Height := image1.Picture.Bitmap.Height;

temp.PixelFormat := pf24bit;

for i := 1 to header.Height-2 do begin

TLine11 := image1.Picture.Bitmap.ScanLine[i-1];

TLine12 := image1.Picture.Bitmap.ScanLine[i];

TLine13 := image1.Picture.Bitmap.ScanLine[i+1];

TLine22 := temp.ScanLine[i];

for j := 1 to header.Width-2 do begin

pixl1 := 0;

Page 36: PCD Report

pixl2 := 0;

pixl3 := 0;

max := 0;

for k := -1 to 1 do begin

hit := (TLine11^[j+k].red+TLine11^[j+k].green+TLine11^[j+k].blue) div

3;

if hit>max then begin

max := hit;

pixl1 := TLine11^[j+k].red;

pixl2 := TLine11^[j+k].green;

pixl3 := TLine11^[j+k].blue;

end;

hit := (TLine12^[j+k].red+TLine12^[j+k].green+TLine12^[j+k].blue) div

3;

if hit>max then begin

max := hit;

pixl1 := TLine12^[j+k].red;

pixl2 := TLine12^[j+k].green;

pixl3 := TLine12^[j+k].blue;

end;

hit := (TLine13^[j+k].red+TLine13^[j+k].green+TLine13^[j+k].blue) div

3;

if hit>max then begin

max := hit;

pixl1 := TLine13^[j+k].red;

pixl2 := TLine13^[j+k].green;

pixl3 := TLine13^[j+k].blue;

end;

end;

TLine22^[j].red := pixl1;

TLine22^[j].green := pixl2;

Page 37: PCD Report

TLine22^[j].blue := pixl3;

end;

end;

image1.Picture.Bitmap := temp;

image1.Repaint;

gauge1.Progress:=0;

end;

procedure TForm1.Minimum1Click(Sender: TObject);

var TLine11,TLine12,TLine13, TLine22 : PPixel;

temp : TBitmap;

pixl1, pixl2, pixl3, max,hit : byte;

i,j : integer;

k : shortint;

begin

gauge1.Progress:=0;

gauge1.MaxValue:=header.Height*header.Width;

temp := TBitmap.Create;

temp.Width := image1.Picture.Bitmap.Width;

temp.Height := image1.Picture.Bitmap.Height;

temp.PixelFormat := pf24bit;

for i := 1 to header.Height-2 do begin

TLine11 := image1.Picture.Bitmap.ScanLine[i-1];

TLine12 := image1.Picture.Bitmap.ScanLine[i];

TLine13 := image1.Picture.Bitmap.ScanLine[i+1];

TLine22 := temp.ScanLine[i];

for j := 1 to header.Width-2 do begin

pixl1 := 255;

pixl2 := 255;

pixl3 := 255;

max := 255;

for k := -1 to 1 do begin

Page 38: PCD Report

hit := (TLine11^[j+k].red+TLine11^[j+k].green+TLine11^[j+k].blue) div

3;

if hit<max then begin

max := hit;

pixl1 := TLine11^[j+k].red;

pixl2 := TLine11^[j+k].green;

pixl3 := TLine11^[j+k].blue;

end;

hit := (TLine12^[j+k].red+TLine12^[j+k].green+TLine12^[j+k].blue) div

3;

if hit<max then begin

max := hit;

pixl1 := TLine12^[j+k].red;

pixl2 := TLine12^[j+k].green;

pixl3 := TLine12^[j+k].blue;

end;

hit := (TLine13^[j+k].red+TLine13^[j+k].green+TLine13^[j+k].blue) div

3;

if hit<max then begin

max := hit;

pixl1 := TLine13^[j+k].red;

pixl2 := TLine13^[j+k].green;

pixl3 := TLine13^[j+k].blue;

end;

end;

TLine22^[j].red := pixl1;

TLine22^[j].green := pixl2;

TLine22^[j].blue := pixl3;

end;

end;

image1.Picture.Bitmap := temp;

Page 39: PCD Report

image1.Repaint;

gauge1.Progress:=0;

end;

procedure TForm1.Relief1Click(Sender: TObject);

begin

emboss1.Click;

contraststretching1.Click;

less1.Click;

histogram1.Click;

blur1.Click;

end;

procedure TForm1.Canvas1Click(Sender: TObject);

begin

blur1.Click;

contraststretching1.Click;

contraststretching1.Click;

filter[0,0] := 0;

filter[0,1] := -1;

filter[0,2] := 0;

filter[1,0] := -1;

filter[1,1] := 5;

filter[1,2] := -1;

filter[2,0] := 0;

filter[2,1] := -1;

filter[2,2] := 0;

factor := 1;

offset := 0;

filterpass;

end;

Page 40: PCD Report

procedure tform1.lowpassfilter;

var

TLine1, TLine2, TLine3 : PPixel;

pixl : longint;

i,j : integer;

h,k : byte;

begin

for h := 1 to 3 do

for i := 1 to header.Height-2 do begin

TLine1 := image1.Picture.Bitmap.ScanLine[i-1];

TLine2 := image1.Picture.Bitmap.ScanLine[i];

TLine3 := image1.Picture.Bitmap.ScanLine[i+1];

for j := 1 to header.Width-2 do begin

pixl := 0;

for k := 0 to 2 do

case h of

1 : pixl := pixl + round(TLine1^[j-1].red*filter[0,k] +

TLine2^[j].red*filter[1,k]+ TLine3^[j+1].red*filter[2,k]);

2 : pixl := pixl + round(TLine1^[j-1].green*filter[0,k] +

TLine2^[j].green*filter[1,k]+ TLine3^[j+1].green*filter[2,k]);

3 : pixl := pixl + round(TLine1^[j-1].blue*filter[0,k] +

TLine2^[j].blue*filter[1,k]+ TLine3^[j+1].blue*filter[2,k]);

end;

case h of

1 : if pixl div factor>255 then TLine2^[j].red := 255 else if pixl div factor<0

then TLine2^[j].red := 0 else TLine2^[j].red := pixl div factor;

2 : if pixl div factor>255 then TLine2^[j].green := 255 else if pixl div

factor<0 then TLine2^[j].green := 0 else TLine2^[j].green := pixl div factor;

3 : if pixl div factor>255 then TLine2^[j].blue := 255 else if pixl div factor<0

then TLine2^[j].blue := 0 else TLine2^[j].blue := pixl div factor;

end;

end;

Page 41: PCD Report

end;

image1.Repaint;

end;

procedure TForm1.LowPassSpatial1Click(Sender: TObject);

begin

gauge1.Progress:=0;

gauge1.MaxValue:=header.Height*header.Width;

filter[0,0]:=1;

filter[0,1]:=1;

filter[0,2]:=1;

filter[1,0]:=1;

filter[1,1]:=1;

filter[1,2]:=1;

filter[2,0]:=1;

filter[2,1]:=1;

filter[2,2]:=1;

factor:=9;

offset:=0;

lowpassfilter;

gauge1.Progress:=0;

end;

procedure TForm1.MedianSpatial1Click(Sender: TObject);

begin

filter[0,0]:=1;

filter[0,1]:=1;

filter[0,2]:=1;

filter[1,0]:=1;

filter[1,1]:=0;

filter[1,2]:=1;

filter[2,0]:=1;

Page 42: PCD Report

filter[2,1]:=1;

filter[2,2]:=1;

factor:=8;

offset:=0;

lowpassfilter;

end;

end.