Anda di halaman 1dari 45

BAB I

MENAMPILKAN CITRA

1.1 Pendahuluan

Mengambil citra dan menampilkannya pada aplikasi merupakan langkah pertama


dalam aplikasi pengolahan citra digital, dalam hal ini agar memudahkan dalam design
antarmuka kita menggunakan NetBeans IDE 7.2.1. Netbeans merupakan sebuah aplikasi
Integrated Development Environment (IDE) yang berbasiskan Java dari Sun Microsystems
yang berjalan di atas swing. Swing merupakan sebuah teknologi Java untuk pengembangan
aplikasi desktop yang dapat berjalan pada berbagai macam platform seperti windows, linux,
Mac OS X dan Solaris. Sebuah IDE merupakan lingkup pemrograman yang di integrasikan
ke dalam suatu aplikasi perangkat lunak yang menyediakan Graphic User Interface (GUI),
suatu kode editor atau text, suatu compiler dan suatu debugger.

Netbeans juga digunakan oleh sang programmer untuk menulis, meng-compile,


mencari kesalahan dan menyebarkan program netbeans yang ditulis dalam bahasa
pemrograman java namun selain itu dapat juga mendukung bahasa pemrograman lainnya dan
program ini pun bebas untuk digunakan dan untuk membuat professional desktop, enterprise,
web, dan mobile applications dengan Java language.

1.2 Memulai NetBeans

NetBean disini hanya digunakan untuk editor bahasa pemrograman java untuk
pengolahan citra digital, yang akan dibahas hanya untuk mencakup pengolahan citra digital
dan hal yang berhubungan dengan pengolahan cita digital yaitu menampilkan cita, mengolah
citra, membaca citra, membentuk citra, menyimpan citra dan implementasi metode-metode
yang telah dipelajari pada saat teori . Langkah-langkahnya sebagai berikut:

1
1. Buka aplikasi Netbeans

Langkah pertama adalah menjalankan NetBean dengan cara double click icon
NetBean yang ada pada dekstop atau dari start menu, hingga muncul spash screen NetBean
seperti terlihat pada gambar 1.1 berikut.

Gambar 1.1 Splash Screen NetBean

2. Buat projek baru

Setelah muncul jendela NetBean maka buat projek baru dengan cara klik fileNew
Project seperti terlihat pada gambar 1.2.

Gambar 1.2 New Project


3. Pilih next
Pilih Categories Java dan project yaitu Java aplication, setelah dipilih maka klik next
untuuk melanjutkan membuat project, seperti terlihat pada gambar 1.3.

Gambar 1.3 Choose Project

4. Name and Location

Ganti nama projek,folder penyimpanan dari projek tersebut dan finish, seperti terlihat
pada gambar 1.4 berikut.
Gambar 1.4 Name and Location

Dari gambar diatas dapat dilihat nama project adalah guicitra dan projek location
Z:\materi kuliah\bahan ajar s1\buku, anda dapat mengubah sesuai keinginan anda,
setelah pilih finish maka akan muncul jendela kerja seperti terlihat pada gambar 1.5
berikut:

Gambar 1.5 Jendela Kerja NetBean

1.3 Memulai Desian Aplikasi Pengolahan Citra

Sekarang kita dapat menggunakan NetBeans sebagai editor, untuk menampilkan


gambar kita perlu panel menampilkan citra dan tampilan utama untuk aplikasi pengolahan
citra, langkahnya sebagai berikut:
1. Buat JPanel form baru

Gambar 1.6 Membuat JPanel Form Baru

Gambar 1.6 adalah ilustrasi dari cara membuat Jpanel Form baru yaitu Klik kanan pada
source package –Guicitra New JPanel Form dan beri nama tampilcitra, seperti pada
gambar 1.7 berikut:

Gambar 1.7 Membuat class tampilcitra


Setelah pilih finish maka akan muncul tampilcitra.java, seperti terlihat pada gambar 1.8
berikut.

Gambar 1.8 Soure dan Design JPanel Form

Gambar 1.8 menunjukan tampilan design dari tampilcitra.java, untuk mengisi code program
maka pilih source lalu ketik program dibawah ini dan sesuaikan dengan code yang sudah ada
tidak perlu dihapus.

//source code 1.1 tampilcitra.java


public class tampilcitra extends javax.swing.JPanel {
public tampilcitra() {
initComponents();
}
public void paintComponent(java.awt.Graphics g) {
super.paintComponent(g);
if (buffImage!= null)
{ java.awt.Dimension dim =
getSize();
int imageWidth = buffImage.getWidth(this);
int imageHeight = buffImage.getHeight(this);
g.drawImage ( buffImage,
( dim.width - imageWidth ) / 2,
( dim.height - imageHeight ) / 2,
dim.width,
dim.height,
this );
}
}
public void setBuffImage(java.awt.image.BufferedImage in)
{
buffImage = in;
this.setBounds(0,0, buffImage.getWidth(), buffImage.getHeight());
this.setPreferredSize(new java.awt.Dimension(buffImage.getWidth(),
buffImage.getHeight()));
this.revalidate();
this.invalidate();
this.repaint();
}
public java.awt.image.BufferedImage getBuffImage()
{
return buffImage;
}
private java.awt.image.BufferedImage buffImage = null;
private void initComponents() {
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLa
yout.Alignment.LEADING)
.addGap(0, 400, Short.MAX_VALUE)
);
layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayo
ut.Alignment.LEADING)
.addGap(0, 300, Short.MAX_VALUE) );
}

2. Buat Jframe Form baru berinama tampilutama.java

JFrame adalah salah satu class dalam java yang dapat digunakan untuk membuat frame
sebagai top-level container. Top-level container adalah container dasar di mana komponen
swing lainnya diletakkan. Komponen lain yang dimaksudkan antara lain: button, textField,
label, dll. Jadi frame di java identik dengan istilah form dalam visual basic. Cara untuk
membuatnya sama dengan proses sebelumnya hanya saja memilih Jframe Form pada menu
New seperti terlihat pada gambar 1.9.
Gambar 1.9 Membuat Jframe Form

Langkah selanjutnya adalah klik dan tarik tampilcitra.java kedalam frame yang digunakan
untuk menampilkan citra, dan Menu Bar sebagai menu pada aplikasi yang akan dibuat,
seperti terlihat pada gambar 1.10.

Gambar 1.10 Desain Tampil Utama

Langkah selanjutnya ada memasukan kode untuk mengambil dan menampilkan citra pada
form yang dibuat caraya adalah klik kanan pada menu Get ImageEventMouse
mouseClicked, seperti terlihat pada gambar dibawah, cara ini berlaku untuk event atau
komponen lain yang diinginkan seperti terlihat pada gambar 1.11.
Gambar 1.11 Event Mouse

Lalu ketik didalam blok private void jMenu1MouseClicked list program berikut dan
pastikan variable filegambar harus didefenisikan terlebih dahulu didalam class tampilutama

//Source Code 1.2 Tampil Citra


javax.swing.JFileChooser chooser = new javax.swing.JFileChooser();
chooser.setFileFilter(new javax.swing.filechooser.FileFilter()
{
public final static String jpeg = "jpeg";
public final String jpg = "jpg";
public final String gif = "gif";
public final String tiff = "tiff";
public final String tif = "tif";
public final String png = "png";

);
public String getExtension(java.io.File f)
{ String ext = null;
String s = f.getName();
int i = s.lastIndexOf('.');

if (i > 0 && i < s.length() - 1) {


ext = s.substring(i+1).toLowerCase();
}
return ext;
}

public String getDescription() {


return "All Images extensions (jpg;gif;tiff;tif;png)";
}

public boolean accept(java.io.File f) {


if (f.isDirectory()) {
return true;
}
String extension = getExtension(f);
if (extension != null) {
if (extension.equals(tiff) ||
extension.equals(tif) ||
extension.equals(gif) ||
extension.equals(jpeg) ||
extension.equals(jpg) ||
extension.equals(png)) {
return true;

} else {
return false;
}
} return false;
}
}
if (chooser.showDialog(this,"Cari citra") ==
javax.swing.JFileChooser.APPROVE_OPTION)
{
java.io.File file = chooser.getSelectedFile();
filegambar=(file + "");
}

//load gambar
String fileName = filegambar;
try
{
java.awt.image.BufferedImage buffImageLoaded =
javax.imageio.ImageIO.read(new java.io.File(fileName));

tampilcitra1.setBuffImage(buffImageLoaded);

}catch (Exception e)

{
javax.swing.JOptionPane.showMessageDialog(this,"File tidak ditemukan");
}

Langkah selanjutnya adalah hapus main program di tampilutama.java dan pindahkan ke


program main pada file Guicitra.java.

Untuk melihat hasil klik run atau tekan f5 maka akan tampil sepeti gambar 1.12 berikut:
Gambar 1.12 Tampilan Awal

pilih Getimage maka akan tapil dialog untuk mencari file seperti gambar 1.13 berikut:

Gambar 1.13 Open Dialog

Pilih cari citra maka gambar akan tampil pada form tampilutama seperti terlihat pada gambar
1.14 berikut.
Gambar 1.15 Hasil

1.4 Tugas

1. Ubah ukuran view citra, buat menjadi stretch image.

2. Perbesar dan berkecil ukuran gambar


BAB II

PEMBENTUKAN CITRA

2.1 Pendahuluan
Citra merupakan sebuah gambar dua dimensi, yang didapat dari hasil capture sebuah
kamera atau menggambar. Sebuah citra dapat didefinisikan sebagai fungsi dua dimensi f(x,y),
dimana x dan y adalah koordinat spasial, dan amplitudo dari f pada sembarang pasangan
koordinat (x,y) disebut intensitas atau grayscale level (level keabuan) dari citra pada titik
tersebut. Ketika x,y dan nilai intensitas dari f adalah semua terbatas, Discrate quantities, oleh
karena itu citra tersebut dinamakan digital image (citra digital), citra digital dapat ditulis
dalam bentuk matrik seperti terlihat pada gambar 2.1 berikut.

𝑓(0,0) 𝑓(0,1) … 𝑓(0, 𝑁 − 1)


𝑓(1,0) 𝑓(1,1) … 𝑓(1, 𝑁 − 1)
. . .
𝑓(𝑥, 𝑦) = . . … .
. . .
𝑓(𝑀 − 1,0) 𝑓(𝑀 − 1,1) … 𝑓(𝑀 − 1, 𝑁 − 1)
[ ]
Gambar 2.1 Bentuk Matrik Citra
2.2 Citra Hitam

Untuk lebih mengenali citra, berikut contoh program untuk membuat citra warna hitam
dari matriks 200 x 300 yang seluruh matrik memiliki nilai 0. Langkah-langkahnya adalah
tambah java class dan berinama dengan test warna. Seperti terlihat pada gambar berikut 2.2
dan 2.3 berikut:

Gambar 2.2 Tambah java calass


Gambar 2.3 Class Name diganti dengan testwarna

Lalu ketikan kode program berikut.

//Source Code 2.1


package guicitra;
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.awt.image.IndexColorModel;
import java.awt.image.WritableRaster;
import java.io.File;
import javax.imageio.ImageIO;

public class testwarna {


private static BufferedImage bi1;
private static BufferedImage image;
public static BufferedImage black () {
try {
int red=0;
int green=0;
int blue=0;
BufferedImage image1 = new BufferedImage(200, 300,
BufferedImage.TYPE_INT_RGB);

for (int i = 0; i < 200; i++)


{ for (int j = 0; j < 300; j++)
{

Color c = new Color(red, green, blue);


image1.setRGB(i, j, c.getRGB());
}
}
image=image1;
ImageIO.write(image1, "jpg", new File("black.jpg"));
}

catch(Exception e){}}
Lalu buat Jframe form baru dengan nama tampilwarna, adapun desiannya seperti gambar 2.4.

Gambar 2.4 Desain Tampil Warna

Form di atas terdiri dari beberapa komponen objek, untuk menjelaskannya dapat dilihat pada
tabel 2.1 berikut:

Objek Properties Keterangan


Tampilcitra1 - Diambil dari class tampil
citra yang di drag pada form,
seperti yang telah dijelaskan
pada bab I
jButton1 Text=Black
jButton2 Text=RGB
textField1 Text =Grey Scrool
textField2 Text=Red Scrol
jSlider1,jSlider2 Maximum=255 Untuk membuat scrool

Klik kanan pada button1 pilih eventsActionactionPerformed seperti terlihat pada gambar
2.5 berikut.

Gambar 2.5 Membuat event pada button Black


Langkah selanjutnya adalah memberi kode program untuk memanggil class testwarna dengan
method black seperti berikut:

B
BufferedImage a;
a=testwarna.black();
try
{
tampilcitra1.setBuffImage(a);

}catch (Exception e)
{
javax.swing.JOptionPane.showMessageDialog(this,"salah");
}
Sehingga dihasilkan seperti berikut:

Gambar 2.6 Hasil Pemanggilan Method black

Keterangan Program:

int red=0;
int green=0;
int blue=0;
bagian kode diatas adalah untuk memberi nilai 0 pada variable red,green dan blue yang akan
diset pada matriks 200 x 300, matriks 200 x 300 yang menampung nilai tersebut dapat dilihat
pada potongan program berikut BufferedImage image1 = new BufferedImage(200, 300,
BufferedImage.TYPE_INT_RGB);, image1 merupakan variable yang bertipe data
BufferedImage untuk menampung citra yang akan dibuat.

for (int i = 0; i < 200; i++) {


for (int j = 0; j < 300; j++) {

Color c = new Color(red, green, blue);


image1.setRGB(i, j, c.getRGB());
}
}

Potongan program diatas adalah untuk mengeset nilai red,green,blue yang bernilai 0 yang
akan dikonversikan menjadi warna hitam pada variable image1.
ImageIO.write(image1, "jpg", new File("black.jpg")); baris program berikut untuk membuat file
bertipe jpg dengan nama black.jpg dari hasil citra yang ditampung pada variable image1.
return image; digunakan untuk mengembalikan nilai pada variable yang memanggil method
ini, jadi keluaran dari program ini adalah berbentuk file dan nilai yang dikembalikan pada
pemanggilnya sehingga variable pemanggil dapat ditampilkan pada tampilcitra1. Adapun
kode program pada pemanggilan hanya untuk memanggil fungsi/method black pada class
testwarna.
BufferedImage a; inisialisasi variable a agas dapat menampung array citra,
a=testwarna.black(); variable a menampung hasil pemanggilan dari fungsi/method black pada
class testwarna. tampilcitra1.setBuffImage(a); digunakan untuk menampilkan citra pada
form.

2.3 Membentuk Image RGB


Citra RGB memiliki 3 warna dasar yaitu red,green dan blue, untuk membuat warna
merah maka diset nilai red=255,green=0 dan blue=0. Sedangkan warna hijau dihasilkan dari
green=255 dan nilai lainnya bernilai 0, demikian juga untuk warna biru nilai blue-nya saja
yang bernilai 255, sedangkan untuk warna kombinasi seperti kuning adalah gabungan merah
dan hijau artinya nilai red=255, green=255 dan blue=0, berikut contoh program untuk RGB.

//Source Code 2.2 membuat citra RGB


public static BufferedImage rgb ()
{ try {
int red[][] = new int[200][300];
int green[][] = new int[200][300];
int blue[][] = new int[200][300];
BufferedImage image1 = new BufferedImage(200, 300,
BufferedImage.TYPE_INT_RGB);
for (int i = 0; i < 200; i++)
{ for (int j = 0; j < 300; j++)
{
if (j<=100)
{
red[i][j]=255;
green[i][j]=0;
blue[i][j]=0;
}
else if(j>100 && j<=200)
{
red[i][j]=0;
green[i][j]=255;
blue[i][j]=0;
}

else
{
red[i][j]=0;
green[i][j]=0;
blue[i][j]=255;
}
Color c = new Color(red[i][j], green[i][j], blue[i][j]);
image1.setRGB(i, j, c.getRGB());
}
}
image=image1;
ImageIO.write(image1, "jpg", new File("rgb.jpg"));
}

catch(Exception e){

return image;
}

Panggil program diatas dari jButton2 yang diberinama RGB, pemanggilan dilakukan
sama dengan saat memanggil fungsi black hanya saya perbedaan terletak pada baris untuk
nilai variable a yaitu a=testwarna.rgb(); sehingga saat diclik menghasilkan gambar 2.7
berikut:
Gambar 2.7 Hasil Pemanggilan RGB

2.4 Citra Greyscale

Citra grey adalah citra yang bergerak dari hitam keputih, yang memiliki warna
sebanya 256 yang bergerak dari 0 sampai 255, berikut adalah fungsi untuk melihat
pergerakan warna greylevel.

//source code 2.3 greylevel image


public static BufferedImage greylevel (BufferedImage image,int grey) {

try {
int width = image.getWidth()-1;
int height = image.getHeight()-1;
int b=grey;

for(int i=0; i<height; i++)


{ for(int j=0; j<width; j+
+){

Color newColor = new Color(b,


b,b);
image.setRGB(j,i,newColor.getRGB());
}

return image;

} catch (Exception e) {}
return null;
}
Lalu panggil fungsi diatas, klik kanan pada jSlider1eventchangestateChanged seperti
pada gambar berikut:

Gambar 2.8 Event Change pada j Slinder1

Lalu isi kode program berikut:

BufferedImage a;
a=testwarna.greylevel(tampilcitra1.getBuffImage(),jSlider1.getValue());
try
{

tampilcitra1.setBuffImage(a);

}catch (Exception e)
{
javax.swing.JOptionPane.showMessageDialog(this,"salah");
}

Hasil dari pemanggilan dapat dilihat pada gambar 2.8 berikut:

(a) scrool berada di tengah (b) scroll maksimal


Gambar 2.8 Hasil Pemanggilan greylevel
2.5 Pergerakan Nilai RGB

Pergerakan nilai RGB citra yang dimaksud adalah bagai mana membuat citra tampak
berubah warna jika digeser nilai red, green dan blue, hingga dapat memahami konsep citra
RGB, konsepnya sama dengan greylevel hanya saja greylevel hanya memiliki satu warna
yang bergerak dari 0 sampai 255, sedangkan RGB memiliki tiga warna hingga didapatkan
256 x 256 x 256 kombinasi warna. Berikut kode programnya:

public static BufferedImage rgblevel (BufferedImage image,int r, int g, int b) {

try {
int width = image.getWidth()-1;
int height = image.getHeight()-1;
for(int i=0; i<height; i++)
{ for(int j=0; j<width; j++){

Color newColor = new Color(r,


g,b);
image.setRGB(j,i,newColor.getRGB());
}

}
return image;
} catch (Exception e) {}
return null;
}

Panggil kode di atas pada jSlider1 hingga dihasilkan seperti terlihat pada gambar:

(a) Red Scroll berada ditengah (b) Red Scroll


Maksimal Gambar 2.9 Perubahan Warna

Merah
2.6 Tugas
1. Buatlah citra berwarna putih dari matriks 300 x 500 yang berisikan nilai 255
2. Buatlah citra RGB dari matriks hingga hasilnya seperti gambar berikut:

3. lengkapi program sebelumnya sehingga pergerakan warna tidak hanya merah saja akan
tetapi tambah scroll untuk pergeseran green dan blue juga.
BAB III

PENINGKATAN KUALITAS CITRA

3.1 Pendahuluan

Tujuan utama penigkatan kualitas citra adalah citra hasil transformasi menjadi lebih
baik dari citra sebelumnya. Ciri-ciri operasinya yaitu memanipulasi parameter-parameter
yang ada pada citra seperti biner, Grayscale, Brightness dan kontras , pada bab ini kita akan
mengimplementasikannya dalam pemrograman java.

3.2 Konversi RGB ke GreyScale

Konversi RGB ke GreyScale seperti yang telah dijelaskan pada saat teori yaitu
merubah citra warna menjadi citra Greyscale dengan mengambil nilai rata-rata dari rgb
dijadika satu intensitas warna saja. Berikut adalah langkah-langkahnya:

Tambah java class seperti terlihat pada gambar 2.1 dan beri nama dengan
imageenhacement.

Gambar 2.1 New Java Class

// Source code 3.1 ImageEnhacement.java

package Guicitra;
import java.awt.*;
import java.awt.image.BufferedImage;
public class imageenhacement {
BufferedImage image;
public static BufferedImage GrayScale1 (BufferedImage image)
{ try {
int width = image.getWidth()-1;
int height = image.getHeight()-1;
for(int i=0; i<height; i++){
for(int j=0; j<width; j++){
Color c = new Color(image.getRGB(j, i));
int red = (int)(c.getRed() * 0.299);
int green = (int)(c.getGreen() * 0.587);
int blue = (int)(c.getBlue() *0.114);
Color newColor = new Color(red+green+blue,
red+green+blue,red+green+blue);
image.setRGB(j,i,newColor.getRGB());
}

}
return image;

} catch (Exception e) {}
return null;
}

3.3 Konversi RGB ke Biner

Konversi RGB ke Biner adalah dengan mengkonversikan RGB ke greyscale terlebih


dahulu, lalu dengan thersholding membatasi nilai hanya menjadi dua saja yaitu hitam dan
putih. Dengan kata lain nilai greyscale berada dibawah 128 maka menjadi 0 dan lainnya
menjadi 255. Adapun kode programnya seperti dibawah dan letakan setelah fungsi greyscale
namun masi berada dalam class imageenhacement.

//source code 3.2 biner


public static BufferedImage bin (BufferedImage image)
{ try {
int width = image.getWidth()-1;
int height = image.getHeight()-1;
for(int i=0; i<height; i++){
for(int j=0; j<width; j++){
Color c = new Color(image.getRGB(j, i));
int red = (int)(c.getRed() * 0.299);
int green = (int)(c.getGreen() * 0.587);
int blue = (int)(c.getBlue() *0.114);
int gray=red+green+blue;
if (gray<=126)
{
gray=0;
}
else
{
gray=255;
}
Color newColor = new Color(gray,
gray,gray);
image.setRGB(j,i,newColor.getRGB());
}
}
return image;
} catch (Exception e) {}
return null;
}

3.4 Brightness

Brightness adalah kecerahan citra, dengan kata lain penambahan intensitas citra jika
penambahan dengan nilai positif maka citra akan semakin terang, namun jika ditambah
dengan nilai negatif maka citra akan semakin gelap. Perubahan dari gelap ke terang atau
sebaliknya dikatakan brightness.

//Source code 3.3 brightness


public static Buffered Image brightness (BufferedImage image) {

try {
int width = image.getWidth()-1;
int height = image.getHeight()-1;
int b=50;
for(int i=0; i<height; i++)
{ for(int j=0; j<width; j+
+){
Color c = new Color(image.getRGB(j, i));
int red = (int)(c.getRed() +b);
int green = (int)(c.getGreen() +b);
int blue = (int)(c.getBlue() +b);
if (red>255) red=255;
if (green>255) green=255;
if (blue>255) blue=255;
Color newColor = new Color(red,
green,blue);
image.setRGB(j,i,newColor.getRGB());
}

}
return image;
} catch (Exception e) {}
return null;
}

Keterangan:

Keterangan ini tidak menjelaskan semua kode program, namun yang dijelaskan
adalah dianggap perlu, dan harus diingat kembali bahwa pemrograman java adalah case
sensitive artinya huruf besar dan kecil dibedakan:

BufferedImage image;
int width;
int height;

potongan list program diatas adalah mendeklarasikan variable atribut dari class
imageenhacement yang dapat digunakan pada seluruh method yang ada di dalamnya, image
bertipe data BufferedImage artinya image adalah variable yang menampung citra yang
berisikan array dari elemen picture (pixel), sedangkan width dan height adalah variable yang
bertipe data integer untuk menampung lebar dan tinggi dari citra.

public static BufferedImage GrayScale1 (BufferedImage image) adalah method Grayscale1


yang mengembalikan nilai bertipe data BufferedImage dan mempunya satu inputan dengan
tipe data yang sama, artinya saat method ini dipanggil akan mengembalikan nilai hasil
pengolahan pada objek pemanggilnya.

Color c = new Color(image.getRGB(j, i)); adalah deklarasi objek c sebagai Color dari
image.getRGB(j, i), image sebelumnya adalah inputan citra dan .getRGB(j, i) adalah untuk
mengambil RGB pada variable image pada posisi j,i.
int red = (int)(c.getRed() * 0.299); red adalah variable yang menampung color(warna) dari
warna red c.getRed() sedangkan pengalinya 0.299 proses untuk menjadikan grayscale sesuai
format yang dilakukan pada matlab, jika mengikut dari buku panduan teori adalah 0.33.

Color newColor = new Color(red+green+blue, red+green+blue,red+green+blue); newColor


adalah objek Color yang mempunyai 3 parameter yaitu red, green dan blue, sedangkan
red+gren+blue adalah proses grayscale, perubahan intensitas pixel pada newColor yang di set
ulang pada baris program image.setRGB(j,i,newColor.getRGB()); dan hasil dari image yang
diset ulang nilai pixelnya akan dikembalikan keobjek pemanggilnya dengan perintah return
image;

3.5 Memanggil Fungsi/Method

List program diatas tidaklah menghasilkan apapun tanpa dipanggil atau digunakan,
lankah selanjutnya kita akan menambahkan menu pada tampilutama.java untuk memanggil
class dan method yang kita buat diatas, caranya adalah sebagai berikut:

Klik kanan pada menu prosesAdd From PaletteMenu Item seperti terlihat pada gambar
3.2:

Gambar 3.2 Tambah Menu Item

Berinama menu sesuai yang dinginkan , lalu input program panggil pada events
actionPerforment seperti terlihat pada gambar dibawah 3.3.
Gambar 3.3 Action Performed

Lalu isi dengan kode berikut

//Source Panggil method grayscale

BufferedImage a;
a=imageenhacement.GrayScale1(tampilcitra1.getBuffImage());
try
{

tampilcitra1.setBuffImage(a);

}catch (Exception e)
{
javax.swing.JOptionPane.showMessageDialog(this,"salah");

Hasil dari pemanggilan Method Grayscale1 pada class imageenhacement dapat dilihat pada
gambar 3.4a dan 3.4b.

Gambar 2.4a Sebelum Proses Grayscale(kiri), 2.4b Sesudah Proses(kanan)


3.6 Tugas

1. Buat Menu Item untuk memanggil method Biner dan Brightness dan bagaimana
hasilnya
2. Buat Method untuk proses kontras dan buat menu untuk memanggilnya.
3. Buat method untuk operasi ligaritmik dan operasi power-low
BAB IV

PERBAIKAN KUALITAS CITRA

4.1 Pendahuluan

Perbaikan citra sedikit berbeda dengan peningkatan kualitas citra. Ciri-ciri operasi
perbaikan citra yaitu tujuannya memperbaiki citra yang terdegradasi atau cacat akibat terkena
noise pada saat pengiriman atau pengambilan citra. Adakalanya gangguan atau noise sengaja
ditimbulkan pada citra dengan tujuan untuk menguji metode perbaikan citra yang terbaik,
namun pada dasarnya gangguan pada citra terjadi tanpa disengaja. Oleh sebab itu pada
pengolahan citra terdapat spesifikasi ilmu berdasarkan tujuannya, salah satunya perbaikan
citra.
Banyak metode yang dikembangkan untuk restorasi citra seperti jaringan syaraf
tiruan, namun yang akan dibahas pada bab ini adalah menggunakan filter yang biasa
digunakan oleh kalangan pemula antara lain filter rata-rata, median, minimum, maksimum
dan filter gaussian.

4.2 Filter Rata-rata

Filter Rata-rata atau mean filtering, sesuai dengan namanya filter ini akan mengganti
nilai intensitas sebuah piksel dengan rerata nilai piksel tetangganya dan piksel itu sendiri,
filter rata-rata(mean filter) sering digunakan untuk smooting atau reduksi noise.

//Source Code 4.1 Filter rata-rata


public static BufferedImage mean (BufferedImage image)
{ try {
int green,red,blue;
int width = image.getWidth()-1;
int height = image.getHeight()-1;
int[][] red1,green1,blue1;
red1=new int [width][height];
green1=new int [width][height];
blue1=new int [width][height];
for(int i=0; i<height; i++){
for(int j=0; j<width; j++){
if ((i>0 && i< height-1) && (j>0 && j<width-1))
{
red=0;
green=0;
blue=0;
for(int x=i-1;x<=i+1;x++)
{
for (int y=j-1;y<=j+1;y++)
{
Color c = new Color(image.getRGB(y, x));
red = red+((int)(c.getRed()));
green =green+ ((int)(c.getGreen()));
blue = blue+((int)(c.getBlue()));
}
}
red=red/9;
green=green/9;
blue=blue/9;
}
else
{
Color c = new Color(image.getRGB(j, i));
red = (int)(c.getRed());
green = (int)(c.getGreen());
blue = (int)(c.getBlue());
}
red1[j][i]=(int)(red);
green1[j][i]=(int)(green);
blue1[j][i]=(int)(blue);

}
}
for(int i=0; i<height; i++)
{ for(int j=0; j<width; j+
+){
red=red1[j][i];
green=green1[j][i];
blue=blue1[j][i];
if (red>255)
{
red=255;
}
if (green>255)
{
green=255;
}
if (blue>255)
{
blue=255;
}

Color newColor = new Color(red,green,blue);


image.setRGB(j,i,newColor.getRGB());
}
}
return image;
} catch (Exception e) {}
return null;
}

4.3 Filter Minimum

Filter Minimum atau low pass filter adalah meloloskan nilai intensitas piksel terkecil.
Filter minimum ini kebalikan dari filter maksimum, Nilai intensitas piksel yang berada
ditengah maks akan digantikan dengan nilai intensitas terkecil piksel-piksel tetangganya.

//Source Code 4.2 Filter Minimum


public static BufferedImage min (BufferedImage image)
{ try {
int green,red,blue;
int width = image.getWidth()-1;
int height = image.getHeight()-1;
int[][] red1,green1,blue1;
red1=new int [width][height];
green1=new int [width][height];
blue1=new int [width][height];
for(int i=0; i<height; i++){
for(int j=0; j<width; j++){
if ((i>0 && i< height-1) && (j>0 && j<width-1))
{
Color c1 = new Color(image.getRGB(j, i));
red = ((int)(c1.getRed()));
green =((int)(c1.getGreen()));
blue = ((int)(c1.getBlue()));
for(int x=i-1;x<=i+1;x++)
{
for (int y=j-1;y<=j+1;y++)
{
Color c = new Color(image.getRGB(y, x));
if (red>c.getRed())
{
red=c.getRed();
}
if(green>c.getGreen())
{
green=c.getGreen();
}
if(blue>c.getBlue())
{
blue=c.getBlue();
}

}
}

}
else
{
Color c = new Color(image.getRGB(j, i));
red = (int)(c.getRed());
green = (int)(c.getGreen());
blue = (int)(c.getBlue());
}
red1[j][i]=(int)(red);
green1[j][i]=(int)(green);
blue1[j][i]=(int)(blue);

}
}
for(int i=0; i<height; i++)
{ for(int j=0; j<width; j+
+){
red=red1[j][i];
green=green1[j][i];
blue=blue1[j][i];
// System.out.println(String.valueOf(red));
if (red>255)
{
red=255;
}
if (green>255)
{
green=255;
}
if (blue>255)
{
blue=255;
}

Color newColor = new Color(red,green,blue);


image.setRGB(j,i,newColor.getRGB());
}
}
Return image;
} catch (Exception e) {}
return null;
}

Keterangan

int[][] red1,green1,blue1; digunakan untuk inisialisasi variable red1,green1 dan blue1


berbentuk array yang memiliki format data integr sedangkan red1=new int [width][height];
digunakan untuk memesan array berdasarkan lebar dan tinggi gambar, jadi pemesan array di
memori hanya sebatas ukuran dari citra, hingga tidak ada kemubajiran memori yang
digunakan.
if ((i>0 && i< height-1) && (j>0 && j<width-1)) kondisi ini digunakan untuk menseleksi
jika posisi tidak pada pinggir citra akan dieksekusi, sesuai dengan yang telah dibahas pada
saat teori, maka kondisi pinggi akan tetap dan akan dieksekusi dibagian else pada program.
Program ini untuk filter 3 x 3 hanya satu baris pixel pinggir yang tidak dieksekusi, jika
menggunakan filter 5 x 5 akan berubah menjadi dua baris pixel pinggir yang tidak dieksekusi
if ((i>1 && i< height-2) && (j>1 && j<width-2)), seterusnya untuk 7 x 7 dan lain-lain.

for(int x=i-1;x<=i+1;x++)
{
for (int y=j-1;y<=j+1;y++)
{
Blok perulangan diatas menunjukan bahwa filter yang dirancang adalah 3 x 3, jika
menggunakan filter 5 x 5 akan berubah menjadi seperti berikut:

for(int x=i-2;x<=i+2;x++)
{
for (int y=j-2;y<=j+2;y++)
{

Jika i=3, maka perulangan x=3-2 sampai 3+2 atau dari 1 sampai 5, menunjukan berulang
sampai 5 kali.

4.4 Tugas

1. Buat dalam 1 class imfilter, panggil fungsi/method dari program utama.

2. Buat method untuk filter median, maksimum dan gaussian.

3. Ubah semua ukuran filter menjadi 5 x 5 dan 7 x 7.


BAB V

TRANSFORMASI GEOMETRI

5.1 Pendahuluan

Telah diketahui bahwa suatu titik pada citra(piksel) mempunyai dua komponen, yaitu
kordinat piksel (x,y) dan warna keabuan piksel f(x,y). Pada operasi perbaikan citra, operasi-
operasi yang digunakan hanya memodifikasi warna piksel saja, sedangkan kordinat piksel
tetap tidak mengalami perubahan. Untuk kebutuhan pengolahan citra, sering sekali
diperlukan perubahan-perubahan bentuk giometri citra baik ukuran maupun orientasinya.

5.2 Operasi Pencerminan (Flipping)


Operasi pencerminan merupakan operasi geometri yang tidak mengalami perubahan
ukuran citra. Operasi ini hanya mengakibatkan adanya perubahan orientasi citra, baik secara
horizontal, vertikal, maupun keduanya.

//Source Code 5.1 Pencerminan Horizontal


public static BufferedImage flipping_hor (BufferedImage image)
{ try {
//int green,red,blue;
int width = image.getWidth()-1;
int height = image.getHeight()-1;
int[][] red1,green1,blue1;
red1=new int [width+1][height+1];
green1=new int [width+1][height+1];
blue1=new int [width+1][height+1];
for(int i=0; i<=height; i++){
for(int j=0; j<=width; j++){
Color c = new Color(image.getRGB(width-j, i));
red1[j][i] = ((int)(c.getRed()));
green1[j][i] =((int)(c.getGreen()));
blue1[j][i] = ((int)(c.getBlue()));
}
}
for(int i=0; i<=height; i++)
{ for(int j=0; j<=width; j+
+){
Color newColor = new Color(red1[j][i],green1[j][i],blue1[j][i]);
image.setRGB(j,i,newColor.getRGB());
}
}
return image;
} catch (Exception e) {}
return null;
}

5.3 Rotasi

Rotasi juga merupakan operasi geometri yang tidak mengalami perubahan ukuran
citra, sebuah pixel yang posisinya di (x,y) diputar terhadap titik pusat putaran (xc,yc) dengan
sudut 𝜃 hingga posisi akhirnya pada titik (xc’,yc’).

//Source Code 5.2 Rotesi 900


public static BufferedImage rotation_90 (BufferedImage image) {
try {

int width = image.getWidth()-1;


int height = image.getHeight()-1;
double angle = Math.toRadians(90);
double sin = Math.sin(angle);
double cos = Math.cos(angle);
double x0 = 0.5 * (width - 1);
double y0 = 0.5 * (height - 1);
for (int x = 0; x < width; x++)
{ for (int y = 0; y < height; y++)
{
double a = x - x0;
double b = y - y0;
int xx = (int) (x0+a * cos - b * sin );
int yy = (int) (y0+b * cos - a * sin );
if (xx >= 0 && xx < width && yy >= 0 && yy < height)
{ Color c = new Color(image.getRGB(xx, yy));
image.setRGB(x,y,c.getRGB());
}
else
{
image.setRGB(x,y,0);
}
}
}
return image;
} catch (Exception e) {}
return null;
}

5.4 Cropping

Operasi cropping adalah pengolahan citra dengan kegiatan memotong suatu bagian
dari citra. Sebuah citra di-cropping sebesar W x H. titik(x1,y1) dan(x2,y2) adalah kordinat
titik pojok kiri atas dan pojok kanan bawah citra yang akan di-crop. Rumus yang digunakan
adalah:

W=x2-x1 dan H=y2-y1


Dimana:
W=width
H=
height

//Source Code 5.3 Crooping


package guicitra;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
/**
*
* @author sayuti
*/
public class CropImage extends javax.swing.JFrame implements MouseListener,
MouseMotionListener {

/**
* Creates new form CropImage
*/
int drag_status=0,c1,c2,c3,c4;
public static void main(String args[])
{ new CropImage().start();
}
public void start() {
ImagePanel im=new ImagePanel("faeza.jpg");
add(im); setSize(400,400);
setVisible(true);
addMouseListener(this);
addMouseMotionListener( this );
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public void draggedScreen()throws Exception {
int w = c1 - c3;
int h = c2 - c4;
w = w * -1;
h = h * -1;
Robot robot = new Robot();
BufferedImage img = robot.createScreenCapture(new Rectangle(c1, c2,w,h));
File save_path=new File("screen1.jpg");
ImageIO.write(img, "JPG", save_path);
System.out.println("Cropped image saved successfully.");
}
@Override
public void mouseClicked(MouseEvent arg0) {
}
@Override
public void mouseEntered(MouseEvent arg0) {
}
@Override
public void mouseExited(MouseEvent arg0) {
} @Override
public void mousePressed(MouseEvent arg0)
{ repaint();
c1=arg0.getX();
c2=arg0.getY();
}
@Override
public void mouseReleased(MouseEvent arg0)
{ repaint();
if(drag_status==1) {
c3=arg0.getX();
c4=arg0.getY();
try {
draggedScreen();
} catch(Exception e)
{ e.printStackTrace(
);
}
}
}
@Override public void mouseDragged(MouseEvent arg0)
{ repaint();
drag_status=1;
c3=arg0.getX();
c4=arg0.getY();
}
@Override public void mouseMoved(MouseEvent arg0) {
}
public void paint(Graphics g)
{ super.paint(g);
int w = c1 - c3;
int h = c2 - c4;
w = w * -1;
h = h * -1;
if(w<0) w = w * -1;
g.drawRect(c1, c2, w, h);
}
public CropImage() {
initComponents();
}}

5.5 Tugas
1. Buat Program untuk pencerminan citra secara vertikal dan horizontal bersamaan.
2. Modifikasi Program rotasi hingga dapat digunakan dengan berbagai sudut.
BAB VI

SEGMENTASI CITRA

6.1 Pendahuluan
Segmentasi citra bertujuan untuk membagi wilayah-wilayah yang homogen.
Segmentasi adalah salah satu metode penting yang digunakan untuk mengubah citra input ke
dalam citra output berdasarkan atribut yang diambil dari citra tersebut. Segmentasi membagi
citra ke dalam daerah intensitasnya masing-masing sehingga bisa membedakan antara objek
dan background-nya. Pembagian ini tergantung pada masalah yang akan diselesaikan.
Segmentasi harus dihentikan apabila masing-masing objek telah terisolasi atau terlihat
dengan jelas. Tingkat keakurasian segmentasi bergantung pada tingkat keberhasilan prosedur
analisis yang dilakukan. Dan diharapkan proses segmentasi memiliki tingkat keakuratan yang
tinggi.

6.2 Operator Sobel


Operator sobel adalah salah satu operator yang menghindari adanya perhitungan
gradient di titik interpolasi. Operator ini menggunakan kernel ukuran 3x3 piksel untuk
perhitungan gradient sehingga perkiraan gradient berada tepat ditengah jendela. Misalnya
susunan piksel-piksel disekitar piksel (x,y) adalah:
a0 a1 a2
a7 (x,y) a3
a6 a5 a4
Berdasarkan susunan piksel tetangga tersebut, besar gradient yang dihitung
menggunakan operator sobel adalah:
M = √𝑆2𝑆2
𝑥 𝑦

Dimana M adalah besar gradient di titik tengah kernel dan turunan parsial dihitung
menggunakan persamaan berikut.
𝑆𝑥 = (𝑎2 + 𝑐𝑎3 + 𝑎4) − (𝑎0 + 𝑐𝑎7 + 𝑎6)
𝑆𝑦 = (𝑎0 + 𝑐𝑎1 + 𝑎2) − ( 𝑎6 + 𝑐𝑎5 + 𝑎4)
Dimana c adalah konstanta yang bernilai 2. Sx dan Sy diimplementasikan menjadi kernel
berikut.
-1 0 1 1 2 1

𝑆𝑥 = -2 0 2 𝑆𝑦 = 0 0 0

-1 0 1 -1 -2 -1

Tampak bahwa operator sobel menggunakan pembobotan pada piksel yang lebih dekat
dengan titik pusat kernel. Oleh karena itu, pengaruh piksel-piksel tetangga akan berbeda
sesuai dengan letaknya terhadap titik dimana gradient dihitung. Dalam melakukan
perhitungan gradient, operator ini merupakan gabungan dari posisi mendatar dan posisi
vertikal.

//Source Code 6.1 Sobel Horizontal

public static BufferedImage sobel_hor (BufferedImage image)


{ try {
int green,red,blue,grey,m,n;
int width = image.getWidth()-1;
int height = image.getHeight()-1;
int[][] grey1,maks;
grey1=new int [width+1][height+1];

maks=new int[3][3];
maks[0][0]=1;
maks[0][1]=2;
maks[0][2]=1;
maks[1][0]=0;
maks[1][1]=0;
maks[1][2]=0;
maks[2][0]=-1;
maks[2][1]=-2;
maks[2][2]=-1;
for(int i=0; i<height; i++)
{ for(int j=0; j<width; j+
+){
grey=0;
if ((i>0 && i< height-1) && (j>0 && j<width-1))
{ m=
0;
for(int x=i-1;x<=i+1;x++)
{
n=0;
for (int y=j-1;y<=j+1;y++)
{

Color c1 = new Color(image.getRGB(y, x));


red = ((int)(c1.getRed()));
green =((int)(c1.getGreen()));
blue = ((int)(c1.getBlue())); grey+=(int)
(red+green+blue)/3*maks[m][n];
//System.out.println(String.valueOf(maks[m][n]));
n+=1;
}
m+=1;
}

}
else
{
Color c = new Color(image.getRGB(j, i));
red = (int)(c.getRed());
green = (int)(c.getGreen());
blue = (int)(c.getBlue());
grey=(int)(red+green+blue)/3;
}
grey1[j][i]=(int)grey;
}
}
for(int i=0; i<height; i++)
{ for(int j=0; j<width; j+
+){
grey=grey1[j][i];
if (grey>255)
{
grey=255;
}
else if(grey<0)
{
grey=0;
}
// System.out.println(String.valueOf(red));

Color newColor = new Color(grey,grey,grey);


image.setRGB(j,i,newColor.getRGB());
}
}
return image;
} catch (Exception e) {}
return null;
}

6.3 Tugas

1. Lengkapi program operator sobel sehingga untuk vertikal dan horizontal

2. Buat program untuk operator robert.

3. Buat program untuk prewitt.

4. Lengkapi seluruh program dari bab 1 sampai bab 6, hingga seluruh tugas dalam masing-
masing menu.

Anda mungkin juga menyukai