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
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
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
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
C. Special Effect
Menggunakan perpaduan beberapa teknik yang telah ada sebelumnya,
yaitu :
1. Relief :
2. Canvas :
6. Jadwal Pengerjaan Program : Sekitar kurang – lebih 4 minggu
7. UAS : Kumpul laporan program dan demo program
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.
2. Contrast StretchingImage 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 LevelImage 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. HistogramImage asli Histogram Image Hasil
5. Brightness MoreImage asli Brightness more Image Hasil
Setelah proses Brightness more, image hasil akan memiliki warna yang
lebih cerah daripada image aslinya.
6. Brightness LessImage 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 MaximumImage 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 MinimumImage Asli Frequency Filter Minimum Image Hasil
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. SharpenImage Asli Sharpen Image hasil
Setelah mengalami sharpen, image terlihat lebih tajam dibandingkan
sebelumnya.
6. BlurImage 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. EmbossImage 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. ReliefImage 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.
2. CanvasImage 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
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.
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;
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;
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;
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;
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);
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));
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
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
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;
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;
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;
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;
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);
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;
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]);
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);
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;
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;
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;
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;
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];
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;
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;
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
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;
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;
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;
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;
filter[2,1]:=1;
filter[2,2]:=1;
factor:=8;
offset:=0;
lowpassfilter;
end;
end.