Senin, 06 Juli 2009

Jawaban Tugas 7

Deteksi Warna Kulit

Satu fungsi image adalah satu penyajian matematis dari satu image, antara lain: f ( x) = f ( x,y ) intensitas cahaya atau daya pada posisi x. Satu dapat tulis: f ( x) = i( x). r ( x) dengan i (x ) iluminasi dan r (x ) pemantulan. Keduanya adalah terbatas: MEMASUKI<= i( x) <= dan memasuki<= r ( x) <= 1, sesuai dengan total pemantulan batas serapan dan penjumlahan. Pentingnya r (x ) dalam hal ini, tapi dengan cahaya struktur dan bentuk dari menaungi i(x ) permainan satu peran penting. Dengan tampilan hitam dan putih , f ( x) adalah satu nilai skalar; di image spektral multi f (x ) adalah satu nilai vektor. Image yang punya f 3 dimensi: f ( x) = { fred (x ), fgreen (x ), fblue (x )}. Pencitraan image diambil dari satelit atau pesawat udara, menghasilkan satu image yang mana dapat bisa berada pada dimensi 30 sampai dimensi 256 . Untuk 3 - D menggambar satu x= penggunaan {x,y,x }, dan untuk satu gugus berkala image: f ( x,t ).

Satu model pendigitan dideskripsikan pada koordinat digtal ruang dan waktu, memanggil sampling, dan nilai intensitas tersebut, disebut dengan kuantisasi. Kamera CCD dan scanner sering mempergunakan persegi untuk melakukan sampling; pancaran pemasukan kemudian adalah terintegrasi berlalu area atau bagian dari ini. Untuk menggambar image yang mana harus diperlihatkan pada televisi, segiempat memiliki sisi dengan rasio 4:3 ( rasio aspek) atau 16:9 untuk layar lebar paling baru standar TV. Format lain digunakan juga pada kamera CCD percobaan seperti titik bersudut enam. Ini mempunyai keuntungan pada satu titik yang punya memiliki jenis sesuatu dari titik berdekatan.

Ketika memilih satu sistem kamera lensa zoom, pastikan bahwa resolusinya cukup tinggi jadi saat itu resolusi paling kecil punya satu luas permukan dari paling tidak pada suatu titik tertentu. Banyaknya pixel yang diperlukan tergantung pada kebutuhan yang diukur dan dengan akurasi yang dihitung. Lebih tinggi daya pisah, makin banyak tempat yang diperlukan untuk penyimpanan ini. Waktu kalkulasi untuk algoritma juga bertambah, misal seperti n.ln (n ), n2 atau n3, n menjadi beberapa titik.

Itulah sebabnya mengapa daya pisah piramida dipergunakan: antara lain dari satu 512*512 memperoleh image, kita hitung pertama 256*256, 128*128, 64*64, dsb. image. Menemukan objek dapat terjadi pada 64*64 gambar. Menentukan permukaan dari satu objek kemudian lebih tepat pada 512*512 gambar. Tentu, waktu yang ada harus dibebani siap sedia dibutuhkan ke bangun piramida seperti halnya ingatan ekstra memerlukan simpan image. Bagaimanapun, sejumlah titik pada image ekstra tidak akan pernah lebih dari sejumlah titik pada image asli (melihat bab 7.1.1). Sejumlah bytes memerlukan untuk menyimpan data intermediate, seperti itu tepi dari objek, dapat kurang

Jawaban Tugas 7

Pengenalan angka dan huruf menggunakan Jaringan Syaraf Buatan (JSB)

Secara umum dan sederhana, citra dapatdidefinisikan sebagai representasi visual dari suatu objek. Lebih jauh citra juga dapat diartikan sebagai gambaran yang representatif mengenai suatu objek sedemikian sehingga citra tersebut dapat memberikan kesan yang mendalam mengenai objek yang dimaksud. Jika ingin mendefinisikannya lebih bebas lagi, citra dapat didefinisikan sebagai bentuk visual yang dapat diterima secara baik oleh indera penglihatan, apapun bentuknya. Dalam bidang komputer, citra atau disebut juga image merupakan representasi visual dari suatu objek setelah mengalami berbagai transformasi data dari berbagai bentuk rangkaian numerik.

Untuk mendapatkan data yang akurat dan konsisten dari setiap sampel, digunakan suatu metode sederhana yaitu dengan cara menghitung jumlah pixel aktif yang terdapat pada bagian-bagian dari sampel. Adapun algoritma umum dari pengekstrakan data numerik dari setiap sampel adalah sebagai berikut :
1. Setiap sampel yang diamati, dibagi menjadi beberapa area, misalnya 4 kolom dan 5 baris,sehingga akan terdapat 20 area pengamatan; 2. jumlah pixel yang aktif dari setiap area yang ada dihitung secara akurat;
3. dihasilkan sejumlah 20 data numerik dengan atribut kolom dan baris yang diharapkan dapat mewakili data ciri dari sampel yang diamati. Setelah melalui tahapan normalisasi, data-data numerik tadi akan menjadi data input pada JSB. Dengan demikian jumlah area yang ada pada setiap sampel akan bersesuaian dengan jumlah neuron input JSB yang akan digunakan. Agar dapat dihasilkan kumpulan data yang seragam, maka setiap sampel yang akan diamati haruslah memiliki jumlah area pembagian
yang sama.

Jawaban Tugas 7

Penggunaan Analisa Struktur Link pada Image Retrieval System
Senatha Cahya Christaneka, 201114398 (2005)

Beberapa penelitian pada Web Search telah mendemonstrasikan bahwa analisa struktur link sangat efektif dalam mendapatkan authoritative web pages (web page yang mengandung informasi dengan kualitas tinggi terhadap suatu topik). Informasi seperti bagaimana page berhubungan dengan page lainnya biasanya digunakan untuk menyusun algoritma searching dan dapat meningkatkan kemampuan search engine untuk merangking page berkualitas. Pembahasan Tugas Akhir ini akan menganalisa image retrieval system yang menggunakan analisa struktur hyperlink. Dasar pemikiran utama dari sistem ini adalah bahwa suatu page p akan menampilkan (atau menghubungkan ke) suatu image apabila pembuat page mempertimbangkan image tersebut akan memberikan nilai tambah kepada viewer dari page tersebut. Dengan kata lain dapat diasumsikan bahwa image yang terdapat di suatu authoritative page pada topik t merupakan kandidat yang bagus untuk image berkualitas pada topik tersebut. Gambar 1 menunjukkan contoh output image yang dihasilkan pada query ‘Tennis Player’, ‘Formula One Grand Prix’, dan ‘Frank Lampard’. Beberapa kelebihan dari image retrieval system ini adalah sebagai berikut :

1. Tidak memerlukan analisa image
2. Tidak diperlukan perubahan format query. Query yang digunakan untuk mendapatkan web page juga akan digunakan untuk mendapatkan image
3. Tidak bergantung pada nama file dan image caption yang diberikan oleh pembuat page. Hal ini memungkinkan untuk mendapatkan image yang sesuai dengan query walaupun image tersebut memiliki nama yang tidak berhubungan, seperti ‘image1‘


Secara umum input dari sistem ini berupa keyword atau kata kunci pencarian dan output dari sistem adalah image yang relevan dengan keyword tersebut. Selain itu sistem juga akan memberikan informasi tambahan tentang image tersebut, seperti urlcasal image tersebut dan ukuran image. Arsitektur sistem berupa diagram urutan proses yang dilakukan dapat dilihat pada gambar 2. Image yang terdapat pada halaman web yang relevan dengan suatu topik merupakan kandidat yang bagus untuk menjadi image berkualitas tentang topik tersebut. Oleh karena itu untuk dapat mendapatkan image yang berkualitas terhadap suatu topik sebelumnya harus didapatkan terlebih dahulu page yang relevan dengan topik tersebut. Query yang merupakan input dari user akan diteruskan ke Google untuk mendapatkan Authoritative Page melalui Google API. Authoritative page hasil dari Google API tersebut disebut sebagai root set. Proses selanjutnya adalah memperluas root set menjadi base set dengan menambahkan page yang ditunjuk (outlink) dan page yang menunjuk (inlink) page pada root set. Inlink akan didapatkan menggunakan GoogleAPI dan outlink didapatkan melalui proses parsing. Pada saat parsing juga akan didapatkan image yang terkandung pada page tersebut. Hasil dari proses ini adalah database topical page-image collection yang berisi page-page base set beserta dengan relasi antar page dan image yang terkandung didalamnya.


Proses ranking image digunakan untuk mendapatkan image dengan tingkat relevansi terbesar terhadap suatu query. Proses utama dari tahap ini adalah perhitungan nilai rangking image menggunakan metode analisa struktur link. Namun, pada tahap ini juga terdapat beberapa komponen tambahan yang berperan menilai tingkat relevansi suatu image terhadap query, yaitu proses filtering non-authoritative image berdasarkan nama file, perhitungan similarity nama file image, dan proses filtering non-authoritative berdasarkan size dari image. Terdapat tiga metode yang digunakan untuk menghitung nilai ranking image yang telah didapatkan melalui proses sebelumnya. Semua metode yang digunakan pada proses perhitungan image ini berdasarkan pada algoritma analisa struktur link, jadi tidak dilakukan analisa content dari image untuk menentukan ranking suatu image. Metode yang pertama adalah metode in-degree rank, metode yang kedua adalah metode HITS, dan metode yang ketiga adalah cocitation. Metode yang pertama menghitung ranking image dengan cara menghitung jumlah page yang menunjuk page tempat image tersebut berasal. Metode HITS menghitung ranking image dengan cara menghitung nilai hub dan authority page yang memuat page tersebut terlebih dahulu. Ranking image dengan metode ini merupakan nilai authority dari page tempat image tersebut berasal. Metode cocitation akan menghitung ranking image dengan memanfaatkan matriks cocitation. Matriks cocitation akan menunjukkan kemiripan topik antar image berdasarkan relasi antar image tersebut.
Pada image retrieval system, validasi dan evaluasi hasil sulit dilakukan, bahkan pada document-based information retrieval biasa karena sejauh ini belum ada semacam benchmark yang dapat digunakan untuk mengukur performansi sistem. Pendekatan yang digunakan untuk menguji performa sistem ini adalah dengan menggunakan pendekatan precision measurement. Pendekatan ini dilakukan dengan cara mengukur presisi image-image yang dihasilkan. Presisi image diukur dengan cara melihat berapa banyak image yang relevan dengan query dibandingkan dengan jumlah output yang dihasilkan. Masalah berikutnya yang dihadapi adalah kesulitan dalam menentukan apakah suatu image itu relevan atau tidak terhadap query user. Apabila image yang dihasilkan dapat secara jelas menggambarkan bahwa image tersebut relevan atau tidak terhadap query maka tidak akan sulit untuk menghakimi image tersebut. Namun, suatu image dapat saja dianggap relevan oleh seorang user, tetapi user lainnya juga dapat mengatakan bahwa image tersebut tidak relevan. Image ini disebut dengan image yang ambigu. Contoh image yang ambigu terhadap query ‘Car Picture’ dan ‘Frank Lampard’ dapat dilihat pada gambar 3.
Gambar 4 menunjukkan tampilan web yang digunakan untuk menampilkan image yang didapatkan. Sistem ini telah diuji coba pada 7 buah query dengan spesifikasi yang berbeda-beda. Dari hasil uji coba dapat disimpulkan hal-hal sebagai berikut :
  1. Sistem ini mampu menghasilkan image yang tidak menggambarkan query user tetapi masih berhubungan erat dengan query. Image-image Desi Bebek, Untung Angsa, dan Gober Bebek dapat muncul pada hasil dari query ‘Donald Duck’ karena hubungan semua karakter tersebut dengan query sangat dekat.
  2. Penggunaan metode ranking InDegree dan HITS dapat menghasilkan beberapa output image yang berasal dari satu web page yang sama. Hal ini disebabkan karena ranking image pada metode ini merupakan ranking page tempat image tersebut berasal. Jadi beberapa image pada satu halaman web dapat memiliki nilai ranking yang sama besar.
  3. Penggunaan analisa struktur link tidak melakukan analisa image sama sekali jadi algoritma ini tidak akan mampu mengatasi query yang mengandung spesifikasi image seperti warna, orientasi, dan beberapa fitur spesifik lainnya. Image-image yang relevan dengan query ‘Jaguar Car’ dapat dihasilkan oleh sistem, tetapi sistem tidak akan dapat menghasilkan image ‘Red Jaguar Car’.
  4. Outlink yang diambil sangat berpengaruh terhadap tingkat presisi sistem karena pada suatu web page juga terdapat link menuju page lain yang tidak memiliki kemiripan topik (non-informative link). Semakin banyak non-informative link yang dapat difilter maka semakin tinggi pula tingkat presisi sistem.






Jawaban Tugas 4

program:
void CMbohDlg::OnButton1()
{ int i,j,red,green,blue,gray; long int warna,warnagray;
CDC* pDC = m_pic1.GetDC(); CDC dcMem1; CRect rect; BITMAP bm;
HBITMAP hBitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),"a.bmp",IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
if(hBitmap)
{ if(m_bmpBitmap.DeleteObject()) m_bmpBitmap.Detach(); m_bmpBitmap.Attach(hBitmap);
}
m_pic1.GetClientRect(rect); m_bmpBitmap.GetBitmap(&bm);
dcMem1.CreateCompatibleDC(pDC); dcMem1.SelectObject(&m_bmpBitmap);
for(i=0;iStretchBlt(0,0,rect.Width(),rect.Height(),&dcMem1,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
}

void CMbohDlg::OnButton2()
{ int i,j,red,green,blue,th; long int warna,wgray,xgray; CDC* pDC = m_pic2.GetDC(); CDC dcMem1;
CRect rect; BITMAP bm;
HBITMAP hBitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),"a.bmp",IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
if(hBitmap)
{
if(m_bmpBitmap.DeleteObject()) m_bmpBitmap.Detach(); m_bmpBitmap.Attach(hBitmap);
}
m_pic2.GetClientRect(rect); m_bmpBitmap.GetBitmap(&bm);
dcMem1.CreateCompatibleDC(pDC); dcMem1.SelectObject(&m_bmpBitmap);
th= int (256/16);
for(i=0;iStretchBlt(0,0,rect.Width(),rect.Height(),&dcMem1,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
}

//fungsi menggubah warna ke rgb
void WarnaToRGB(long int warna,int *Red, int *Green, int *Blue)
{ *Red = warna & 0x000000FF; *Green = (warna & 0x0000FF00) >> 8;
*Blue = (warna & 0x00FF0000) >> 16; }

//fungsi mengubah rgb ke warna
long int RGBToWarna(int Red, int Green, int Blue)
{ return(Red+(Green<<8)+(blue<<16));}

Jawaban Tugas 5

Program di bawah ini merupakan program utama dari program untuk pengenalan angka dari 0 - 9 :

//Konversi dari data pixel ke RGB dan dari data RGB ke data Pixel:
void WarnaToRGB(long int warna,int *Red, int *Green, int *Blue)
{
*Red = warna & 0x000000FF;
*Green = (warna & 0x0000FF00) >> 8;
*Blue = (warna & 0x00FF0000) >> 16;
}
long int RGBToWarna(int Red, int Green, int Blue){return(Red+(Green<<8)+(Blue<<16));
}

//Program untuk melakukan load angka (*.bmp).
void CAngkaDlg::OnLoad1()
{static char BASED_CODE szFilter[]="Bitmap Files (*.bmp)|*.bmp||";
CFileDialog m_ldFile(TRUE,"*.bmp",name, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter);
if(m_ldFile.DoModal()==IDOK) { name=m_ldFile.GetPathName();
}
CDC* pDC = m_pic1.GetDC(); CDC dcMem;
CRect rect; BITMAP bm;
HBITMAP hBitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),name,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
if(hBitmap) {
if(m_bmpBitmap.DeleteObject()) m_bmpBitmap.Detach(); m_bmpBitmap.Attach(hBitmap);
}
m_pic1.GetClientRect(rect); m_bmpBitmap.GetBitmap(&bm);
dcMem.CreateCompatibleDC(pDC); dcMem.SelectObject(&m_bmpBitmap);
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0, bm.bmWidth,bm.bmHeight,SRCCOPY);
}

//Program untuk menampilkan proyeksi integral horizontal dari angka .
void CAngkaDlg::OnHip1() {
int i,j; int red,green,blue; long int warna;
CDC* pDC = m_pic1.GetDC(); CDC dcMem; CRect rect; BITMAP bm;
HBITMAP hBitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),name,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
m_pic1.GetClientRect(rect); m_bmpBitmap.GetBimap(&bm);
dcMem.CreateCompatibleDC(pDC); dcMem.SelectObject(&m_bmpBitmap);
for(j=0;j<,bm.bmWidth;j++){
hx1[j]=0;
for(i=0;i<,bm.bmHeight;i++)
{
warna=dcMem.GetPixel(j,i);
WarnaToRGB(warna,&red,&green,&blue);
hx1[j]+=(float)(255-red)/255;}
hx1[j]=hx1[j]/2;
}
CDC* pDC1 = m_pic3.GetDC();
for(i=1;iMoveTo(i*0.75,0);
pDC1->LineTo(i*0.75,hx1[i]); }
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0, bm.bmWidth,bm.bmHeight,SRCCOPY);
}

//Program untuk menampilkan proyeksi integral vertikal dari angka.
void CAngkaDlg::OnVip1() {
int i,j; int warna,red,green,blue; CDC* pDC = m_pic1.GetDC();
CDC dcMem1; CRect rect; BITMAP bm;
HBITMAP hBitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),name,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
if(hBitmap) {
if(m_bmpBitmap.DeleteObject()) m_bmpBitmap.Detach();
m_bmpBitmap.Attach(hBitmap); }
m_pic1.GetClientRect(rect); m_bmpBitmap.GetBitmap(&bm);
dcMem1.CreateCompatibleDC(pDC); dcMem1.SelectObject(&m_bmpBitmap);
for(j=0;j<,bm.bmHeight;j++) {
hy1[j]=0;
for(i=0;i<,bm.bmWidth;i++) {
warna=dcMem1.GetPixel(j,i);
warnaToRGB(warna,&red,&green,&blue);
hy1[j]+=(float)(255-red)/255; }
hy1[j]=hy1[j]/2;
}
CDC*pDC1= m_pic2.GetDC(); for(i=0;i
pDC1->MoveTo(0,0.75*i); pDC1->LineTo(hy1[i],0.75*i);
}}

Sabtu, 27 Juni 2009

Laporan Resmi Praktikum 1

Analisa :

          Setelah menyelesaikan praktikum ini, dapat dianalisa bahwa untuk mengerjakan praktikum tersebut pertama-tama kita membuat suatu projek baru yaitu berupa Multiple document, bukan Dialog based seperti pada percobaan sebelumnya. Projek tersebut diberi nama Test. Kemudian kita membuat menu-menu yang dibutuhkan berikut submenunya. Menu yang saya buat hanya dua yaitu Menu dan Bantuan. Untuk Menu ada empat submenu yang saya buat yaitu ‘Satu’, ‘Dua’, ‘Tiga’, ’Empat’, dan ‘Lima’. Sedangkan untuk ‘Bantuan’ hanya ada satu submenu yaitu Tentang Test. 


Listing programnya adalah :
void CTestView::OnSatu()
{
// TODO: Add your command handler code here
MessageBox("Selamat Belajar Pengolahan Citra");
}
void CTestView::OnDua()
{
// TODO: Add your command handler code here
CDC* pDC = GetDC();
pDC->TextOut(10,10,"Ini adalah Teks");
}
void CTestView::OnTiga()
{
// TODO: Add your command handler code here
CDC* pDC = GetDC();
pDC->MoveTo(50,20);
pDC->LineTo(50,200);
pDC->TextOut(30,5,"y");
pDC->MoveTo(50,200);
pDC->LineTo(250,200);
pDC->TextOut(260,200,"x");
}
void CTestView::OnEmpat()
{
// TODO: Add your command handler code here
}
void CTestView::OnLima()
{
// TODO: Add your command handler code here
}

Pada latihan no. 1, kita diminta untuk membuat suatu program untuk menampilkan messagebox dengan tulisan ‘Selamat Belajar Pengolahan Citra’ apabila salah satu submenu dipilih. Untuk menampilkan messagebox tersebut, menu yang dipilih adalah ‘Menu’ sedangkan submenu yang dipilih adalah ‘Satu

Pada latihan no. 2, kita diminta untuk membuat program yang bisa menampilkan tulisan ‘Ini adalah teks’ apabila salah satu submenu dipilih. Untuk menampilkan tulisan tersebut, menu yang dipilih adalah ‘Menu’, sedangkan submenu yang dipilih adalah ‘Dua’

Pada latihan no. 3, kita diminta untuk membuat program yang bisa menampilkan sumbu x dan y apabila salah satu submenu dipilih. Untuk menampilkan tulisan tersebut, menu yang dipilih adalah ‘Menu’, sedangkan submenu yang dipilih adalah ‘Tiga’

Kesimpulan :

*MFC dapat digunakan untuk membuat program yang bisa menampilkan dan memroses suatu gambar.
*Untuk membuat program yang menghasilkan tampilan seperti pada percobaan awal, jenis projek yang dipilih yaitu ‘Dialog based’. Sedangkan untuk membuat program yang menghasilkan tampilan seperti pada latihan, jenis projek yang dipilih yaitu ‘Multiple document’.

Laporan Resmi Praktikum 7

Analisa :

1. Tugas 1

a. Histogram citra gray scale : grafik yang menggambarkan hubungan antara suatu nilai dan banyaknya nilai itu muncul pada sebuah data

b. Kumulatif histogram citra gray scale : banyaknya kemunculan suatu nilai pada sebuah data

c. Histogram equalisasi citra gray scale : suatu proses perataan histogram, dimana distribusi nilai derajat keabuan pada suatu citra dibuat rata

2. Tugas 2

 
Citra yang dihasilkan menggunakan metode penambahan contrass menjadi lebih terang dari citra aslinya. Namun citra yang dihasilkan tidak teralu baik (terlalu terang).

3. Tugas 3

Citra yang dihasilkan menggunakan metode penambahan brightness menjadi lebih terang dari citra aslinya. Namun citra yang dihasilkan tidak terlalu baik (kabur) 

4. Tugas 4
   


Hasil dari hequalization ternyata sesuai dengan yang terdapat pada teori yaitu naik secara linier. Hal tersebut dikarenakan Hequalization (perataan histogram) adalah suatu proses dimana histogram diratakan berdasarkan suatu fungsi linier (garis lurus)

5. Tugas 5

Citra yang didapatkan melalui proses perbaikan citra (enhancement) menggunakan histogram equalisasi ternyata memang lebih baik (jelas) dibandingkan dengan citra aslinya. 

Kesimpulan :

1. Metode histogram equalisasi (perataan citra) memang baik digunakan untuk proses enhancement. Citra yang dihasilkan menjadi lebih baik (jelas)
2. Histogram equalization dilakukan dengan cara meratakan distribusi nilai derajat keabuan dari suatu citra.


Laporan Resmi Praktikum 6

Analisa :

1. Latihan 1

a. Transformasi citra negative


Inversi citra adalah proses negatif pada citra, dimana setiap nilai citra dibalik dengan acuan threshold yang diberikan. Gambar yang dihasilkan baru sedikit terlihat ketika slider dimaksimalkan. Untuk citra dengan derajat keabuan 256, proses inversi citra didefinisikan dengan: xn = 255 – x

b. Transformasi citra dengan fungsi LOG



Transformasi menggunakan fungsi LOG akan mempengaruhi contras dari suatu citra, citra yang ditransformasi menggunakan metode ini akan terlihat lebih terang.

c.Transformasi citra dengan fungsi inverse LOG

Transformasi menggunakan fungsi LOG akan mempengaruhi contras dari suatu citra, citra yang ditransformasi menggunakan metode ini akan terlihat lebih gelap.

d.Transformasi citra Nth power


Transformasi citra Nth power menghasilkan citra yang menyerupai grayscale.

e.Transformasi citra Nth root power


Transformasi citra Nth root power menghasilkan citra yang lebih contras menyerupai transformasi menggunakan fungsi LOG

2. Latihan 2


• Negative : Semakin besar input gray level yang diberikan maka semakin kecil nilai output gray level yang dihasilkan. Nilai output yang didapatkan linier.
• LOG : Mula-mula nilai output gray level yang didapatkan mengalami peningkatan yang cukup besar seiring bertambahnya nilai input. Namun saat mencapai nilai input tertentu, peningkatan nilai output menjadi menurun hingga mendekati kondisi steady.
• Inverse LOG : Mula-mula nilai gray level yang didapatkan mengalami peningkatan yang kecil seiring bertambahnya nilai output. Namun saat mencapai nilai input tertentu, nilai output mengalami peningkatan yang cukup besar hingga mendekati kondisi steady
• Nth power : Karakteristiknya hamper sama seperti inverse LOG, namun lebih mendekati linier.
• Nth power root : Karakteristiknya hamper sama seperti LOG, namun lebih mendekati linier

Kesimpulan :

1. Transformasi citra dapat dilakukan dengan berbagai cara, diantaranya dengan inverse (negative), proses logaritmik (LOG dan inverse LOG) , dan power law (Nth power dan Nth power root).
2. Untuk transformasi inverse diperlukan nilai maksimum yang didapatkan dari slider. Untuk transformasi LOG dan inverse LOG diperlukan nilai C yang diinputkan melalui text box. Sedangkan untuk transformasi power law dibutuhkan nilai C dan Y yang diinputkan melalui text box

Laporan Resmi Praktikum 5

Analisa :

1. Latihan 1
Source code untuk brightness :
Nilai warna pada setiap pixel akan diambil rata-rata red, green dan bluenya kemudian nilai rata-rata itu akan ditambahkan dengan nilai brightness yang didapat dari textbox, nilai warna akan dibatasi dari 0 sampai dengan 255,kemudian semua titik akan diberikan nilai warna baru tersebut 2. Latihan 2 
Source code untuk contrass :

Sama dengan proses brightness pada gambar RGB tetapi nilai k tidak ditambahkan dengan rata-rata nilai red, green bluenya melainkan dikalikan
  
3. Latihan 3Source code untuk autolevel :

Auto level akan mengatur brightness dan contrass gambar secara otomatis, dengan cara mencari nilai terbesar dan terkecil rata-rata red green blue tiap-tiap pixel, setelah itu akan dicari jarak antara nilai terkcil dan terbesar yang akan dijadikan sebagai nilai untuk memperbaiki citra, dalam hal ini citra akan diubah ke format grayscale

Kesimpulan :

1. Brightness adalah proses penambahan kecerahan dari nilai derajat keabuan. Proses brightness ini dilakukan dengan menambahkan nilai derajat keabuan dengan suatu nilai penambah.
2. Mengubah kontras dari suatu citra adalah proses pengaturan nilai range interval pada setiap nilai derajat keabuan

Laporan Resmi Praktikum 4

Analisa :

1. Latihan 1
- Pada pengubahan sebuah gambar menjadi grayscale dapat dilakukan dengan cara mengambil semua pixel pada gambar kemudian warna tiap pixel akan diambil informasi mengenai 3 warna dasar yaitu merah, biru dan hijau (melalui fungsi warnatoRGB), ketiga warna dasar ini akan dijumlahkan kemudian dibagi tiga sehingga didapat nilai rata-rata. Nilai rata-rata inilah yang akan dipakai untuk memberikan warna pada pixel gambar sehingga warna menjadi grayscale, tiga warna dasar dari sebuah pixel akan diset menjadi nilai rata-rata (melalui fungsi RGBtowarna)
- Proses dari rumus keduanya hampir sama, bedanya pada rumus pertama warna pada setiap pixel yang telah dirata-rata akan dikalikan dengan nilai derajat keabuan (th), sehingga terjadi pengelompokan warna menjadi beberapa kelompok sesuai dengan nilai kuantisasinya.

2. Latihan 2
a. Untuk rumus x = 0.2r + 0.2g + 0.5b 


b. Untuk rumus x = 0.5r + 0.5g + 0b

c. Untuk rumus x = 0.5r + 0g + 0.5b  

Gambar yang paling terang diperoleh pada saat menggunakan rumus ke-2 (x = 0.5r + 0.5g + 0b). Sedangkan gambar paling tidak terang diperoleh saat menggunakan rumus ke-1 (x = 0.2r + 0.2g + 0.5b).

3. Latihan 3
- Thresholding digunakan untuk mengatur jumlah derajat keabuan yang ada pada citra. Dengan menggunakan thresholding maka derajat keabuan bisa diubah sesuai keinginan, misalkan diinginkan menggunakan derajat keabuan 16, maka tinggal membagi nilai derajat keabuan dengan 16. Proses thresholding ini pada dasarnya adalah proses pengubahan kuantisasi pada citra, sehingga untuk melakukan thresholding dengan derajat keabuan dapat digunakan rumus:

dimana : 
w adalah nilai derajat keabuan sebelum thresholding 
x adalah nilai derajat keabuan setelah thresholding

- Hubungan thresholding dengan kuantisasi citra yaitu kuantisasi citra dapat diperoleh berdasarkan derajat keabuan yang dimasukkan dalam rumus thresholding.

4. Latihan 4
Gambar dengan thresholding 2
Gambar hasil konversi citra ke citra biner

Ternyata gambar yang dihasilkan dengan nilai thresholding 2 dan gambar hasil konversi citra ke citra biner tidak sama. Untuk gambar yang pertama digunakan metode thresholding dengan nilai derajad keabuan sebesar 2. 

Kesimpulan :

1. Pada proses thresholding, kuantisasi citra yang bervariasi dapat diperoleh dengan mengubah nilai derajat keabuan pada rumus thresholding.
2. Proses kuantisasi hampir sama dengan grayscale, bedanya warna pada setiap pixel yang telah dirata-rata akan dikalikan dengan nilai derajat keabuan (th), sehingga terjadi pengelompokan warna mejadi beberapa kelompok sesuai dengan nilai kuantisasinya  


Selasa, 02 Juni 2009

Laporan Resmi Praktikum 2

Analisa :

Listing program latihan 1









Pada dasarnya pengerjaan program ini sama dengan yang dicontohkan, perbedaannya adalah disini digunakan satu ruang tambahan (picture) untuk menampung hasil dari pencampuran ketiga warna. Besar dari ukuran masing-masing warna penyusun juga tidak fixed seperti pada program contoh, melainkan meminta input dari user ( 0 – 255 ). Input ini akan dibaca sebagai nilai integer. Disini juga hanya digunakan sebuah tombol (command) untuk mengisi keempat kolom (picture). Sehingga pada program button ini terdapat empat kali proses pengisian warna, yang pertama dikerjakan adalah mengisi warna hasil pencampuran, kemudian red, green, lalu blue. Tidak harus urut seperti ini, melainkan merupakan kreasi programmer masing-masing.

Kesimpulan :

1. Pencampuran ketiga warna dasar akan menghasilkan berbegai warna bergantung dari kadar dari masing-masing warna
2. Dalam numerisasi heksa untuk warna, dua digit paling belakang diwakili warna merah, kemudian dua digit selanjutnya diwakili warna hijau, dan biru untuk dua digit berikutnya.

Senin, 01 Juni 2009

Jawaban Tugas 2




Jawaban Tugas 1

Void CTgs1View::OnTestOpenfile( )
{
// TODO: Add your command handler code here
static char BASED_CODE szFilter]="Bitmap Files (*.bmp)|*.bmp||";
CFileDialog m_ldFile(TRUE, "*.bmp", name, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, szFilter);
if(m_ldFile.DoModal()==IDOK)
{
name=m_ldFile.GetPathName();
LoadGambar();
}}
// merubah data pixel ke RGB
void WarnaToRGB(long int warna,int *Red, int *Green, int *Blue)
{
*Red = warna & 0x000000FF;
*Green = (warna & 0x0000FF00) >> 8;
*Blue = (warna & 0x00FF0000) >> 16;
}
//merubah RGB ke data pixel
long int RGBToWarna(int Red, int Green, int Blue)
{
return(Red+(Green<<8)+(blue<<16));>
}

// Menampilkan gambar hasil dari open file
void CEdgeRobertView::LoadGambar(void)
{
CDC* pDC = GetDC();
CDC dcMem;
int i,j,r,g,b,s;
long int w;
HBITMAP hBitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(), name,
IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
if(hBitmap)
{
if(m_bmpBitmap.DeleteObject())
m_bmpBitmap.Detach();
m_bmpBitmap.Attach(hBitmap);
}
dcMem.CreateCompatibleDC(pDC);
dcMem.SelectObject(&m_bmpBitmap);

// Proses RGB to GRAY-SCALE
f0r(i=0;i<250;i++)>
f0r(j=0;j<250;j++)>
w=dcMem.GetPixel(j,i);
WarnaToRGB(w,&r,&g,&b);
s=int((r+g+b)/3);
w=RGBToWarna(s,s,s);
dcMem.SetPixel(j,i,w);
}
pDC->BitBlt(0,0,250,250,&dcMem,0,0,SRCCOPY);
}

void CEdgeRobertView::OnTestEdgerobert()
{
// TODO: Add your command handler code here
CDC* pDC = GetDC();
CDC dcMem;
int i,j,r,g,b;
int resultr,resultg,resultb;
long int w,mat[1][2];
int h[1][2],hr,hg,hb;
dcMem.CreateCompatibleDC(pDC);
dcMem.SelectObject(&m_bmpBitmap);
// Proses Konvolusi
int nh=2; // Menyatakan ukuran filter
// Penentuan kernel filter
h[0][0]=-1; h[0][1]=1;
int u=0;//Menyatakan ukuran filter orizontal
f0r(i=0;i<250;i++)>
f0r(j=0;j<250;j++){>
mat[0][0]=dcMem.GetPixel(j,i);
mat[0][1]=dcMem.GetPixel(j,i+1);
hr=0;hg=0;hb=0;
//Menyatakan ukuran filter vertikal
f0r(int v=0;v<2;v++){>
WarnaToRGB(mat[u][v],&r,&g,&b);
hr+=r*h[u][v];
hg+=g*h[u][v];
hb+=b*h[u][v];
}
resultr=hr;
resultg=hg;
resultb=hb;
if(resultr>255)resultr=255;
if(resultg>255)resultg=255;
if(resultb>255)resultb=255;
w=RGBToWarna(resultr,resultg,resultb);
dcMem.SetPixel(j,i,w);

void CTgs1View::OnTestEdgeprewitt()
{
// TODO: Add your command handler code here
CDC* pDC = GetDC();
CDC dcMem;
int i,j,r,g,b,u,v;
int resultr,resultg,resultb;
long int mat[3][3],temp[250][250];
int hy[3][3],hx[3][3],hrx,hgx,hbx,hry,hgy,hby;
dcMem.CreateCompatibleDC(pDC);
dcMem.SelectObject(&m_bmpBitmap);
// Proses Konvolusi
int nh=3; // Menyatakan ukuran filter
// Penentuan kernel filter hy
hy[0][0]=-1; hy[0][1]=0; hy[0][2]=1;
hy[1][0]=-1; hy[1][1]=0; hy[1][2]=1;
hy[2][0]=-1; hy[2][1]=0; hy[2][2]=1;
// Penentuan kernel filter hx
hx[0][0]=-1; hx[0][1]=-1; hx[0][2]=-1;
hx[1][0]=0; hx[1][1]=0; hx[1][2]=0;
hx[2][0]=1; hx[2][1]=1; hx[2][2]=1;
f0r(i=0;i<250;i++)>
f0r(j=0;j<250;j++){>
mat[0][0]=dcMem.GetPixel(j-1,i-1);
mat[0][1]=dcMem.GetPixel(j,i-1);
mat[0][2]=dcMem.GetPixel(j+1,i-1);
mat[1][0]=dcMem.GetPixel(j-1,i);
mat[1][1]=dcMem.GetPixel(j,i);
mat[1][2]=dcMem.GetPixel(j+1,i);
mat[2][0]=dcMem.GetPixel(j-1,i+1);
mat[2][1]=dcMem.GetPixel(j,i+1);
mat[2][2]=dcMem.GetPixel(j+1,i+1);
hrx=0;hgx=0;hbx=0;
hry=0;hgy=0;hby=0;
f0r(u=0;u
f0r(v=0;v
WarnaToRGB(mat[u][v],&r,&g,&b);
hrx+= r*hx[u][v];
hgx+= g*hx[u][v];
hbx+= b*hx[u][v];
hry+= r*hy[u][v];
hgy+= g*hy[u][v];
hby+= b*hy[u][v];
}
resultr=abs(hrx)+abs(hry);
resultg=abs(hgx)+abs(hgy);
resultb=abs(hbx)+abs(hby);
if(resultr>255)resultr=255;
if(resultg>255)resultg=255;
if(resultb>255)resultb=255;
temp[j][i]=RGBToWarna(resultr,resultg,resultb);
}
f0r(i=0;i<250;i++)>
f0r(j=0;j<250;j++)>
dcMem.SetPixel(j,i,temp[j][i]);
pDC->BitBlt(250,0,500,250,&dcMem,0,0,SRCCOPY);
}

void CTgs1View::OnTestEdgesobel ()
{
// TODO: Add your command handler code here
CDC* pDC = GetDC();
CDC dcMem;
int i,j,r,g,b,u,v;
int resultr,resultg,resultb;
long int mat[3][3],temp[150][150];
int hy[3][3],hx[3][3],hrx,hgx,hbx,hry,hgy,hby;
dcMem.CreateCompatibleDC(pDC);
dcMem.SelectObject(&m_bmpBitmap);
// Proses Konvolusi
int nh=3; // Menyatakan ukuran filter
// Penentuan kernel filter hy
hy[0][0]=-1; hy[0][1]=0; hy[0][2]=1;
hy[1][0]=-2; hy[1][1]=0; hy[1][2]=2;
hy[2][0]=-1; hy[2][1]=0; hy[2][2]=1;
// Penentuan kernel filter hx
hx[0][0]=-1; hx[0][1]=-2; hx[0][2]=-1;
hx[1][0]=0; hx[1][1]=0; hx[1][2]=0;
hx[2][0]=1; hx[2][1]=2; hx[2][2]=1;
f0r(i=0;i<250;i++)>
f0r(j=0;j<250;j++){>
mat[0][0]=dcMem.GetPixel(j-1,i-1);
mat[0][1]=dcMem.GetPixel(j,i-1);
mat[0][2]=dcMem.GetPixel(j+1,i-1);
mat[1][0]=dcMem.GetPixel(j-1,i);
mat[1][1]=dcMem.GetPixel(j,i);
mat[1][2]=dcMem.GetPixel(j+1,i);
mat[2][0]=dcMem.GetPixel(j-1,i+1);
mat[2][1]=dcMem.GetPixel(j,i+1);
mat[2][2]=dcMem.GetPixel(j+1,i+1);
hrx=0;hgx=0;hbx=0;
hry=0;hgy=0;hby=0;
f0r(u=0;u
f0r(v=0;v
WarnaToRGB(mat[u][v],&r,&g,&b);
hrx+= r*hx[u][v];
hgx+= g*hx[u][v];
hbx+= b*hx[u][v];
hry+= r*hy[u][v];
hgy+= g*hy[u][v];
hby+= b*hy[u][v];
}
resultr=abs(hrx)+abs(hry);
resultg=abs(hgx)+abs(hgy);
resultb=abs(hbx)+abs(hby);
if(resultr>255)resultr=255;
if(resultg>255)resultg=255;
if(resultb>255)resultb=255;
temp[j][i]=RGBToWarna(resultr,resultg,resultb);
}
f0r(i=0;i<250;i++)>
f0r(j=0;j<250;j++)>
dcMem.SetPixel(j,i,temp[j][i]);
pDC->BitBlt(250,0,500,250,&dcMem,0,0,SRCCOPY);
}

Kamis, 23 April 2009

Laporan Resmi Praktikum 3

ANALISA

Hasil praktikum dapat dilihat pada gambar 1. Untuk mengambil gambar, kita tekan 'load gambar', dan untuk membalik gambar tersebut secara horizontal, kita tekan 'balik horizontal', sedangkan apabila kita ingin membalik gambar secara vertikal kita tinggal menekan 'balik vertikal'.


gambar 1. Hasil praktikum

Program pada button 2 :

hal yang dilakukan pertama adalah mengambil semua pixel tiap baris dalam
gambar dengan perintah getPixel. Kemudian pixel-pixel yang didapat disimpan
dalam array yang nantinya akan diset (ditampilkan) dalam picture2, pada picture 2
baris pertama akan diisi oleh pixel-pixel dari baris terbawah dari gambar,
sehingga gambar akan terbalik yang atas menjadi bawah.
Program pada button 3 :

KESIMPULAN
  1. Kita dapat membuat suatu aplikasi menggunakan visual C++ untuk keperluan membalik gambar baik secara vertikal maupun horizontal.
  2. Aplikasi tersebut dibuat menggunakan dialog based
  3. Untuk membuat gambar menjadi terbalik, kita masukkan program untuk merubah posisi pixel gambar tersebut

Kamis, 19 Maret 2009

Hasil Praktikum


Program :

// dialogsDlg.cpp : implementation file
//

#include "stdafx.h"
#include "dialogs.h"
#include "dialogsDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
CAboutDlg();

// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA

// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL

// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDialogsDlg dialog

CDialogsDlg::CDialogsDlg(CWnd* pParent /*=NULL*/)
: CDialog(CDialogsDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CDialogsDlg)
m_lbl = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CDialogsDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDialogsDlg)
DDX_Control(pDX, IDC_pic1, m_pic1);
DDX_Control(pDX, IDC_BUTTON2, m_tampilpic);
DDX_Control(pDX, IDC_BUTTON1, m_tampillabel);
DDX_Text(pDX, IDC_label, m_lbl);
//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CDialogsDlg, CDialog)
//{{AFX_MSG_MAP(CDialogsDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDialogsDlg message handlers

BOOL CDialogsDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// Add "About..." menu item to system menu.

// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < psysmenu =" GetSystemMenu(FALSE);">AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here

return TRUE; // return TRUE unless you set the focus to a control
}

void CDialogsDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}

// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.

void CDialogsDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}

// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CDialogsDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}

void CDialogsDlg::OnButton1()
{
// TODO: Add your control notification handler code here
SetDlgItemText(IDC_label,"Belajar Prak Citra dgn VC++ dan MFC");
}

void CDialogsDlg::OnButton2()
{
// TODO: Add your control notification handler code here
CDC* pDC = m_pic1.GetDC();//
CDC dcMem1;
CRect rect;//kotak di picture
BITMAP bm;//
HBITMAP
hBitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),"ibra.bmp",IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
if(hBitmap)
{
if(m_bmpBitmap.DeleteObject())
m_bmpBitmap.Detach();
m_bmpBitmap.Attach(hBitmap);
}
m_pic1.GetClientRect(rect);//
m_bmpBitmap.GetBitmap(&bm);//
dcMem1.CreateCompatibleDC(pDC);
dcMem1.SelectObject(&m_bmpBitmap);
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem1,
0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);//
}

Rabu, 18 Maret 2009

Laporan Pendahuluan Praktikum Pengolahan Citra

I.TUJUAN

1. Mahasiswa dapat membuat program pengolahan citra menggunakan Visual C++
dengan MFC.
2. Mahasiswa dapat membuat dialog menggunakan Visual C++ dengan MFC.

II.DASAR TEORI

Image processing atau sering disebut dengan pengolahan citra digital merupakan
suatu proses dari gambar asli menjadi gambar lain yang sesuai dengan keinginan kita. Misal suatu gambar yang kita dapatkan terlalu gelap maka dengan image processing gambar tersebut bisa kita proses sehingga mendapat gambar yang jelas.

>EDGE DETECTION (DETEKSI TEPI)
Deteksi tepi berfungsi untuk mengidentifikasi garis batas (boundary) dari suatu objek yang terdapat pada citra. Tepian dapat dipandang sebagai lokasi piksel dimana terdapat nilai perbedaan intensitas citra secara ekstrem. Sebuah edge detector bekerja dengan cara mengidentifikasi dan menonjolkan lokasi-lokasi piksel yang memiliki karakteristik tersebut.
Ada banyak cara-cara untuk mengintifikasikan bagian tepi suatu citra, diantaranya adalah sebagai berikut :

>OPERATOR GRADIEN
Pada citra digital f(x,y), turunan berarah sepanjang tepian objek akan bernilai maksimum pada arah normal dari kontur tepian yang bersesuaian. Sifat ini dipergunakan sebagai dasar pemanfaatan operator gradien sebagai edge detector.
Operator gradien citra konvensional melakukan diferensiasi intensitas piksel pada arah baris dan kolom, mengikuti persamaan local intensity variation berikut :

Nilai magnitudo gradien dari persamaan di atas dapat dinyatakan sebagai berikut:

Operator gradien dapat direpresentasikan oleh dua buah kernel konvolusi Gx dan Gy, yang masing-masing mendefinisikan operasi penghitungan gradien dalam arah sumbu x dan sumbu y yang saling tegak lurus.

Dalam kasus penghitungan gradien dengan persamaan local intensity variation, maka kernel Gx dan Gy dapat dirumuskan seperti berikut:
Gx = [-1 1]
Gy =
Dari operator gradien konvensional di atas, dapat diturunkan berbagai operator gradien berikut :
1. Operator Roberts
2. Operator Prewit
3. Operator Sobel

>OPERATOR LAPLACIAN
Dalam kondisi transisi tepian yang lebih tidak ekstrem, penggunaan operator turunan kedua lebih dianjurkan.

Turunan kedua memiliki sifat lebih sensitif terhadap noise, selain itu juga menghasilkan double edge. Oleh karena itu, operator Laplacian dalam deteksi tepi pada umumnya tidak dipergunakan secara langsung, namun dikombinasikan dengan suatu kernel Gaussian menjadi sebuah operator Laplacian of Gaussian.
Fungsi transfer dari kernel Laplacian of Gaussian dapat dirumuskan sebagai berikut:

>OPERATOR ZERRO CROSS
Metode Zero-cross menemukan edge dengan cara mencari zero crossings setelah memfilter I (Identitas) dengan filter a yang telah ditentukan.

>OPERATOR CANNY
Salah satu algoritma deteksi tepi modern adalah deteksi tepi dengan menggunakan metoda CannyBerikut


III. PERCOBAAN
3.1 Menjalankan Visual C++ dengan MFC
1. Membuka Visual C++ 6.0
• Pilih menu : Start->Programs->Microsoft Visual Studio 6.0->Microsoft Visual C++ 6.0
2. Memberi nama program
• Pilih menu : File->New->Projects->MFC AppWizard(exe)
• Isi Project name misalnya dengan: dialog (lihat gambar 1.3)
• Tekan tombol OK
3. Memilih isi program
• Step 1 : What tipe of application would you like to create
(aplikasi apa yang ingin dibuat) pilih dialog based untuk membuat aplikasi memakai dialog.
• Step 2 :
1. What features would you like to include? Praktikum Pengolahan Citra PENS-ITS
(fitur apa saja yang akan dimasukkan) pilih About box dan 3D controls untuk pilihan

standar.

2. What features would you like to include?
(mendukung aplikasi apa ?) pilih ActiveX controls untuk pilihan standar.

3. Would you like to include WOSA support ? Window Sockets tidak dipilih untuk pilihan
standard.

4. Please enter a title for your dialog ? Title sudah berisi text sama dengan nama project untuk
pilihan standard


• Step 3 :
1. What style of project would you like ?
Pilihan standard dan yang aktif hanya MFC Standard.
2. Would you like to generate source file comments ? pilihan standard Yes, Please
3. How would you like to use the MFC Library ? pilihan standard As a shared DLL
• Step 4 : AppWizard creates the following classes for you
(AppWizard akan membuat class seperti dibawah ini)
CtestApp
CtestDlg
(a) Dialog Step 1 (b) Dialog Step 2 (c) Dialog Step 3 (d) Dialog Step 4
• Tekan tombol Finish akan muncul New Project Information. Perhatikan gambar 1.5.
• Kemudian tekan tombol OK. Tampilan awal dialog akan dihasilkan perhatikan gambar 1.6.
Praktikum Pengolahan Citra PENS-ITS
4. Cara menjalankan program
• Pilih menu : Build->Execute (!), perhatikan gambar 1.7. Dialog Hasil Execute
• Tekan tombol Yes, untuk menutup aplikasi.
1.1.1. Cara Mendisain Dialog

Catatan : Jika Dialog Editor tidak tampak buka pada Resource View (Ctrl-Shift-E) double click
pada IDD_TEST_DIALOG.

1. Cara membuat dialog
• Buat aplikasi AppWizard seperti pada praktikum 1 dan beri nama project dengan Dialog
• Pilih ResourceView pada workspace
• Pilih folder paling atas dengan cara klik pada tanda +
• Pilih folder dialog dengan cara klik pada tanda +
• Klik 2 kali IDD_DIALOG_DIALOG seperti gambar 1.4
Praktikum Pengolahan Citra PENS-ITS
Gambar 1.8 Membuat Dialog
2. Menghapus dan menambah control pada dialog

• Untuk menghapus control : aktifkan control dengan cara klik pada area control lanjutkan

dengan menekan tombol delete. Cobalah untuk menghapus control : text TODO, button OK
dan Cancel.


• Untuk menambah control: (button) pilih icon control pada toolbox drag drop ke editor dialog.
(static text) pilih icon control pada toolbox drag drop ke editor dialog.
(picture box) pilih icon control pada toolbox drag drop ke editor dialog.
• Tambahkan control (dua button, 1 static text, 1 picture) pada dialog editor seperti hasil pada
3. Mengaktifkan control
• Pilih control button1, double clik, pada dialog Add Member Function klik OK.

• Atau klik kanan, pilih klik ClassWizard, pada MFC Class Wizard Dialog Messages aktifkan
BN_CLICKED, double clik, pada dialog Add Member Function klik OK

Praktikum Pengolahan Citra PENS-ITS

4. Rubah terlebih dahulu ID dari static text = ID_label dan ID dari picture = ID_pic1, dengan
cara aktifkan control dan klik kanan pilih properti.

5. Pada dialog MFC classwizard,Member Variabels edit type dan member dari control

6. Menulis fungsi pada button1 clik
• Tambahkan program untuk menampilkan pesan pada static text seperti dibawah ini

void CDialogDlg::OnButton1()
{
// TODO: Add your control notification handler code here
SetDlgItemText(IDC_label,"Belajar Prak Citra dgn VC++ dan MFC");
}
Jalankan program dengan memilih menu Build->Execute (!)

7. Tambahkan deklarasi kelas CBitmap pada File View – Header Files – dialogDlg.h
// Construction
public:
CDialogDlg(CWnd* pParent = NULL); // standard constructor
CBitmap m_bmpBitmap;
//
Praktikum Pengolahan Citra PENS-ITS
8. Menulis fungsi pada button2 clik
void CDialogDlg::OnButton2()
{
// TODO: Add your control notification handler code here
CDC* pDC = m_pic1.GetDC();//
CDC dcMem1;
CRect rect;//kotak di picture
BITMAP bm;//
HBITMAP hBitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),
"pens.bmp",IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
if(hBitmap)
{
if(m_bmpBitmap.DeleteObject())
m_bmpBitmap.Detach();
m_bmpBitmap.Attach(hBitmap);
}
m_pic1.GetClientRect(rect);//
m_bmpBitmap.GetBitmap(&bm);//
dcMem1.CreateCompatibleDC(pDC);
dcMem1.SelectObject(&m_bmpBitmap);
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem1,
0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);//
}
Jalankan program dengan memilih menu Build->Execute (!)