Pcd (pemrograman citra digital)
Pengertian Citra
Pengolahan Citra Digital
|
Citra adalah suatu representasi (gambaran), kemiripan, atau
imitasi dari suatu objek. Citra terbagi 2 yaitu citra yang bersifat analog dan
ada citra yang bersifat digital. Citra analog adalah citra yang bersifat continue seperti gambar pada monitor televisi, foto sinar X,
dan lain-lain. Sedangkan pada citra digital adalah citra yang dapat diolah oleh
komputer (Sutojo, 2009).
Citra dapat didefinisikan sebagai fungsi f(x,y) berukuran M baris dan N kolom, dengan x dan y adalah koordinat spasial, dan amplitudo f di titik koordinat (x,y) dinamakan intensitas atau tingkat keabuan dari citra pada citra tersebut (Putra, 2010:19).
Citra dapat didefinisikan sebagai fungsi f(x,y) berukuran M baris dan N kolom, dengan x dan y adalah koordinat spasial, dan amplitudo f di titik koordinat (x,y) dinamakan intensitas atau tingkat keabuan dari citra pada citra tersebut (Putra, 2010:19).
Perbedaan Citra
Analog dan Citra Digital
Citra Analog
Citra analog adalah citra yang bersifat continue, seperti
gambar pada monitor televisi, foto sinar X, foto yang tercetak di kertas foto,
lukisan, pemandangan alam, hasil CT scan, gambar-gambar yang terekam pada pita
kaset, dan lain sebagainya. Citra analog tidak dapat direpresentasikan dalam
komputer, sehingga tidak bisa diproses di komputer secara langsung.
Oleh sebab itu, agar ini dapat diproses di komputer, proses konversi analog ke digital harus dilakukan terlebih dahulu. Citra analog dihasilkan dari alat-alat analog, seperti video kamera analog, kamera foto analog, cam, CT scan, sensor rontgen untuk foto thorax, sensor gelombang pendek pada sistem radar, sensor ultrasound pada sistem USG, dan lain-lain.
Oleh sebab itu, agar ini dapat diproses di komputer, proses konversi analog ke digital harus dilakukan terlebih dahulu. Citra analog dihasilkan dari alat-alat analog, seperti video kamera analog, kamera foto analog, cam, CT scan, sensor rontgen untuk foto thorax, sensor gelombang pendek pada sistem radar, sensor ultrasound pada sistem USG, dan lain-lain.
Citra Digital
Citra digital merupakan representatif dari citra yang diambil
oleh mesin dengan bentuk pendekatan berdasarkan sampling dan kuantisasi.
Sampling menyatakan besarnya kotak-kotak yang disusun dalam baris dan kolom.
Dengan kata lain, sampling pada citra menyatakan besar kecilnya ukuran pixel (titik) pada citra, dan kuantisasi menyatakan besarnya
nilai tingkat kecerahan yang dinyatakan dalam nilai tingkat keabuan (grayscale) sesuai dengan jurnlah
bit biner yang digunakan oleh mesin, dengan kata lain kuantisasi pada citra
menyatakan jumlah warna yang ada pada citra. (Basuki, 2005:4).
Jenis-Jenis Citra
Digital
Ada banyak cara untuk menyimpan citra digital di dalam
memori. Cara penyimpanan menentukan jenis citra digital yang terbentuk.
Beberapa jenis citra digital yang sering digunakan adalah citra biner, citra grayscale dan citra warna (Sutoyo, 2009:21).
1.
Citra Biner (Monokrom). Banyaknya dua warna, yaitu hitam dan putih.
Dibutuhkan 1 bit di memori untuk menyimpan kedua warna ini.
2.
Citra Grayscale (Skala Keabuan). Banyaknya warna tergantung pada jumlah bit
yang disediakan di memori untuk menampung kebutuhan warna ini. Citra 2 bit
mewakili 4 warna, citra 3 bit mewakili 8 warna, dan seterusnya. Semakin besar
jumlah bit warna yang disediakan di memori, semakin halus gradasi warna yang
terbentuk.
3.
Citra Warna (True
Color).
Setiap piksel pada citra warna mewakili warna yang merupakan kombinasi dari
tiga warna dasar (RG8 = Red
Green Blue). Setiap warna dasar menggunakan penyimpanan 8 bit = 1 byte, yang berarti setiap warna
mempunyai gradasi sebanyak 255 warna. Berarti setiap piksel mempunyai kombinasi
warna sebanyak 28 x 28 x 28 = 224 =16 juta warna lebih. Itulah sebabnya format
ini dinamakan true color karena
mempunyai jumlah warna yang cukup besar sehingga bisa dikatakan hampir mencakup
semua warna di alam.
Elemen-elemen Citra Digital
Berikut adalah elemen-elemen yang terdapat pada citra digital
(Sutoyo, 2009:24):
1.
Kecerahan (Brightness). Brightness merupakan
intensitas cahaya yang dipancarkan piksel dari citra yang dapat ditangkap
oleh sistem penglihatan. Kecerahan pada sebuah titik (piksel) di dalam citra
merupakan intensitas rata-rata dari suatu area yang melingkupinya.
2.
Kontras (Contrast). Kontras menyatakan
sebaran terang dan gelap dalam sebuah citra. Pada citra yang baik, komposisi
gelap dan terang tersebar secara merata.
3.
Kontur (Contour). Kontur adalah keadaan
yang ditimbulkan oleh perubahan intensitas pada piksel-piksel yang bertetangga.
Karena adanya perubahan intensitas inilah mata mampu mendeteksi tepi-tepi objek
di dalam citra.
4.
Warna. Warna sebagai persepsi yang ditangkap
sistem visual terhadap panjang gelombang cahaya yang dipantulkan oleh objek.
5.
Bentuk (Shape). Shape adalah properti
intrinsik dari objek 3 dimensi, dengan pengertian bahwa bentuk merupakan
properti intrinsik utama untuk sistem visual manusia.
6.
Tekstur (Texture). Texture dicirikan
sebagai distribusi spasial dari derajat keabuan di dalam sekumpulan
piksel-piksel yang bertetangga. Tekstur adalah sifat-sifat atau karakteristik
yang dimiliki oleh suatu daerah yang cukup besar, sehingga secara alami
sifat-sifat tadi dapat berulang dalam daerah tersebut. Tekstur adalah
keteraturan pola-pola tertentu yang terbentuk dari susunan piksel-piksel dalam
citra digital. Informasi tekstur dapat digunakan untuk membedakan sifat-sifat
permukaan suatu benda dalam citra yang berhubungan dengan kasar dan halus, juga
sifat-sifat spesifik dari kekasaran dan kehalusan permukaan tadi, yang sama
sekali terlepas dari warna permukaan tersebut.
Pengolahan Citra
Pengolahan citra (image
Processing) merupakan proses mengolah piksel-piksel di dalam citra
digital untuk tujuan tertentu. Pada awalnya pengolahan citra ini dilakukan
untuk memperbaiki kualitas citra, namun dengan berkembangnya dunia komputasi
yang ditandai dengan semakin meningkatnya kapasitas dan kecepatan proses
komputer serta munculnya ilmu-ilmu komputasi yang memungkinkan manusia dapat
mengambil informasi dari suatu citra.
Proses pengolahan citra secara diagram proses dimulai dari pengambilan citra, perbaikan kualitas citra, sampai dengan pernyataan representatif citra yang dicitrakan sebagai berikut:
Proses pengolahan citra secara diagram proses dimulai dari pengambilan citra, perbaikan kualitas citra, sampai dengan pernyataan representatif citra yang dicitrakan sebagai berikut:
Proses Pengolahan Citra
|
Dalam perkembangan lebih lanjut, image processing dan computer vision digunakan
sebagai mata manusia, dengan perangkat input image capture seperti
kamera dan scanner dijadikan sebagai mata dan mesin komputer (dengan
program komputasinya) dijadikan sebagai otak yang mengolah informasi. Sehingga
muncul beberapa pecahan bidang yang menjadi penting dalam computer vision, antara lain: pattern recognition (pengenalan
pola), biometric pengenalan identifikasi manusia berdasarkan ciri-ciri
biologis yang tampak pada badan manusia), content based image and video retrieval (mendapatkan kembali citra atau video dengan informasi
tertentu), video editing, dan lain-lain (Basuki, 2005:1).
Teknik-Teknik
Pengolahan Citra Digital
Secara umum, teknik pengolahan citra digital dibagi menjadi
tiga tingkat pengolahan, yakni sebagai berikut:
1.
Pengolahan Tingkat Rendah (Low-Level Processing). Pengolahan ini merupakan
operasional-operasional dasar dalam pengolahan citra, seperti pengurangan noise
(noise reduction), perbaikan
citra (image enhancement) dan restorasi
citra (image restoration).
2.
Pengolahan Tingkat Menengah (Mid-Level Processing). Pengolahan ini meliputi segmentasi pada
citra, deskripsi objek, dan klasifikasi objek secara terpisah.
3.
Pengolahan Tingkat Tinggi (High-Level Processing). Pengolahan ini meliputi analisis Citra.
kode program mengubah citra berwarna ke citra abu-abu
-------------------------------------------------------------------------
img=imread('c:\image\rino.tif');
x=uint8(0.2989 * double(img(:,:,1))...
+ 0.5870 *double(img(:,:,2)) + 0.1141 *double(img(:,:,3)));
kode program mengetahui susunan warna pada citra
===========================================
a=imread('c:\image\rino.tif');
red =a(:,:,1);
green=a(:,:,2);
blue =a(:,:,3);
subplot(2,2,1);imshow(a),title('empat bola')
subplot(2,2,2);imshow(red),title('empat bola merah')
subplot(2,2,3);imshow(green),title('empat bola hijau')
subplot(2,2,4);imshow(blue),title('empat bola biru')
kode program mengubah citra abu-abu ke citra biner
========================================
img=imread('c:\image\rino.tif');
[tinggi,lebar] = size(img);
ambang=150;
biner=zeros(tinggi, lebar);
for baris=1 : tinggi
for kolom=1 : lebar
if img(baris,kolom) >=ambang
biner(baris, kolom) = 0;
else
biner(baris,kolom) =1;
end
end
end
imshow(biner)
mengkonversi citra berwarna ke abu abu dan biner
=======================================
RGB=imread('C:\Image\rino.tif');
YCBCR = rgb2ntsc(RGB);
Y=YCBCR(:,:,1); %Ekstraksi matriks Y
Cb=YCBCR(:,:,2); %Ekstraksi matriks Bc
Cr=YCBCR(:,:,3); %Ekstraksi matriks Br
subplot(2,2,1); imshow(RGB);
subplot(2,2,2); imshow(Y);
subplot(2,2,3); imshow(Cb);
subplot(2,2,4); imshow(Cr);
program histogram citra keabuan
=============================
img=imread('c:\image\rino.tif');
[jum_baris,jum_kolom]=size(img);
histogram=zeros(256,1);
for baris=1 : jum_baris
for kolom=1 : jum_kolom
histogram(img(baris,kolom) + 1) = ...
histogram(img(baris,kolom) + 1) + 1;
end
end
horijontal=(0:255) ;
bar(horijontal,histogram);
subplot(1,2,1);imshow(img)
subplot(1,2,2);bar(horijontal,histogram)
program pemotongan aras keabuan (menghilangkan derau)
================================================
function [img] = potong(citra,f1,f2)
img=imread(citra);
[jum_baris,jum_kolom]=size(img);
for baris=1 : jum_baris
for kolom=1 : jum_kolom
if img(baris, kolom ) <=f1
img(baris,kolom)=0;
end
if img(baris,kolom) >=f2
img(baris,kolom)=255;
end
end
end
end %akhir fungsi
h=potong('c:\image\rino.tif',30,140);
imshow(h)
p=imread('c:\image\rino.tif');
subplot(1,2,1);imshow(p)
subplot(1,2,2);imshow(h)
cara kedua program pemotongan aras keabuan (masih menyimpan debug)
=======================================================
img=imread('c:\image\rino.tif');
[jum_baris,jum_kolom]=size(img);
for baris=1 : jum_baris
for kolom= 1 : jum_kolom
citra=img;
if citra(baris,kolom) <=30
citra(baris,kolom)=0;
end
if citra(baris,kolom) >=150
citra(baris,kolom)=255;
end
end
end
program penggeseran citra
---------------------------------------------
f=imread('c:\image\rino.tif');
[jum_baris,jum_kolom]=size(f);
sx=20; %penggeseran arah horizontal
sy=60; %penggeseran arah vertikal
f2=double(f);
g=zeros(size(f2));
for baris=1 : jum_baris
for kolom=1: jum_kolom
xlama=baris - sx;
ylama=kolom - sy;
if (xlama >=1) && (xlama<=jum_baris) && ...
(ylama >=1) && (ylama<=jum_kolom)
g(baris,kolom)=f2(xlama, ylama);
else
g(baris,kolom)=0;
end
end
end
h=uint8(g);
subplot(1,2,1);imshow(f)
subplot(1,2,2);imshow(h)
program memutar citra
============================
f=imread('c:\image\rino.tif');
[jum_baris, jum_kolom]=size(f);
sudut=10; %sudut pemutaran
rad=pi * sudut/180;
cosa=cos(rad);
sina=sin(rad);
f2=f;
for y=1 : jum_baris
for x=1 :jum_kolom
x2=round(x * cosa + y * sina);
y2=round(y * cosa - x * sina);
if (x2>= 1) && (x2<=jum_kolom) && ...
(y2 >=1) && (y2<=jum_baris)
g(y,x)=f2(y2,x2);
else
g(y,x)=0;
end
end
end
subplot(1,2,1);imshow(f)
subplot(1,2,2);imshow(g)
Program memperbesar Citra dengan fungsi
----------------------------------------------------
function g = perbesar(citra, sy, sx)
f = imread(citra);
[baris, kolom] = size(f);
baris_baru = baris * sy;
kolom_baru = kolom * sx;
f2 = double(f);
for y=1 : baris_baru
y2 = ((y-1) / sy) + 1;
for x=1 : kolom_baru
x2 = ((x-1) / sx) + 1;
g(y, x) = f(floor(y2), floor(x2));
end
end
h = uint8(g);
end %akhir fungsi
u=imread('c:\image\rino.tif');
z=perbesar('c:\image\rino.tif', 0.25, 0.25);
subplot(1,2,1);imshow(u),title('citra masukan')
subplot(1,2,2);imshow(z),title('citra perbesar')
program memperbesar citra cara tanpa fungsi
=========================================
f=imread('c:\image\rino.tif');
[baris, kolom] = size(f);
sy=0.5;
sx=2;
baris_baru = baris * sy;
kolom_baru = kolom * sx;
f2=f;
for y=1 : baris_baru
y2 = ((y-1) / sy) + 1;
for x=1 : kolom_baru
x2 = ((x-1) / sx) + 1;
g(y, x) = f(floor(y2), floor(x2));
end
end
subplot(1,2,1);imshow(f),title('citra masukan')
subplot(1,2,2);imshow(g),title('citra perbesar')
memperkecil citra
------------------------------
z=perbesar('c:\image\rino.tif', 0.5, 0.5);
program pencerminan citra secara horizontal dengan fungsi
==============================================
function g = cerminh(f)
[tinggi, lebar] = size(f);
for y=1 : tinggi
for x=1 : lebar
x2 = lebar - x + 1;
y2 = y;
g(y, x) = f(y2, x2);
end
end
h = uint8(g);
end %akhir fungsi
f=imread('c:\image\rino.tif');
h=cerminh(f);
subplot(1,2,1);imshow(f),title('citra masukan')
subplot(1,2,2);imshow(h),title('citra cermin horizontal')
program pencerminan citra secara horizontal dengan fungsi cara kedua
====================================================
function g = cerminh(f)
[jum_baris, jum_kolom] = size(f);
for baris=1 : jum_baris
for kolom=1 : jum_kolom
x2 = jum_kolom - kolom + 1;
y2 = baris;
g(baris,kolom) = f(y2, x2);
end
end
%g = uint8(g);
end %akhir fungsi
f=imread('c:\image\rino.tif');
g=cerminh(f);
subplot(1,2,1);imshow(f),title('citra masukan')
subplot(1,2,2);imshow(g),title('citra cermin horizontal')
program pencerminan citra secara horizontal tanpa fungsi
==============================================
f=imread('c:\image\hotmaabu.jpg');
[jum_baris, jum_kolom] = size(f);
for baris=1 : jum_baris
for kolom=1 : jum_kolom
x2 = jum_kolom - kolom + 1;
y2 = baris;
g(baris,kolom) = f(y2, x2);
end
end
subplot(1,2,1);imshow(f),title('citra masukan')
subplot(1,2,2);imshow(g),title('citra cermin horizontal')
Program pencerminan citra secara Vertikal dengan fungsi
===========================================
function g = cerminv(f)
% Masukan: f = Citra berskala keabuan
[tinggi, lebar] = size(f);
for y=1 : tinggi
for x=1 : lebar
x2 = x;
y2 = tinggi - y + 1;
g(y, x) = f(y2, x2);
end
end
h = uint8(g);
end %akhir fungsi
f=imread('c:\image\rino.tif');
h=cerminv(f);
subplot(1,2,1);imshow(f),title('citra masukan')
subplot(1,2,2);imshow(h),title('citra cermin vertikal')
Program pencerminan citra secara Vertikal dengan fungsi cara kedua
===================================================
function g = cerminv(f)
% Masukan: f = Citra berskala keabuan
[jum_baris, jum_kolom] = size(f);
for baris=1 : jum_baris
for kolom=1 : jum_kolom
y2 = jum_baris - baris + 1;
x2 = kolom;
g(baris,kolom) = f(y2, x2);
end
end
g = uint8(g);
end %akhir fungsi
f=imread('c:\image\rino.tif');
g=cerminv(f);
subplot(1,2,1);imshow(f),title('citra masukan')
subplot(1,2,2);imshow(g),title('citra cermin vertikal')
Program pencerminan citra secara Vertikal tanpa fungsi
==========================================
f=imread('c:\image\rino.tif');
[jum_baris, jum_kolom] = size(f);
for baris=1 : jum_baris
for kolom=1 : jum_kolom
y2 = jum_baris - baris + 1;
x2 = kolom;
g(baris,kolom) = f(y2, x2);
end
end
subplot(1,2,1);imshow(f),title('citra masukan')
subplot(1,2,2);imshow(g),title('citra cermin vertikal')
Program mencari tepi biner objek dengan fungsi
===========================================
function [g] = tepibiner(f)
% tepi biner Berguna untuk mendapatkan tepi objek
% pada citra biner
[jum_baris, jum_kolom] = size(f);
g = zeros(jum_baris, jum_kolom);
for q = 2 : jum_baris - 1
for p = 2 : jum_kolom - 1
p0 = f(q, p+1);
p1 = f(q-1, p+1);
p2 = f(q-1, p);
p3 = f(q-1, p-1);
p4 = f(q, p-1);
p5 = f(q+1, p-1);
p6 = f(q+1, p);
p7 = f(q+1, p+1);
sigma = p0 + p1 + p2 + p3 + p4 + p5 + p6 + p7;
if sigma == 8
g(q, p) = 0;
else
g(q, p) = f(q, p);
end
end
end
end % akhir fungsi
u=imread('c:\image\rino.tif');
g=tepibiner(u);imshow(g)
program mencari tepi biner objek tanpa fungsi
===========================================
f=imread('c:\image\rino.tif');
[jum_baris, jum_kolom] = size(f);
g=f;
g = zeros(jum_baris, jum_kolom);
for q = 2 : jum_baris - 1
for p = 2 : jum_kolom - 1
p0 = f(q, p+1);
p1 = f(q-1, p+1);
p2 = f(q-1, p);
p3 = f(q-1, p-1);
p4 = f(q, p-1);
p5 = f(q+1, p-1);
p6 = f(q+1, p);
p7 = f(q+1, p+1);
sigma = p0 + p1 + p2 + p3 + p4 + p5 + p6 + p7;
if sigma == 8
g(q, p) = 0;
else
g(q, p) = f(q, p);
end
end
end
subplot(1,2,1);imshow(f)
subplot(1,2,2);imshow(g)
function hasil=perim1(bw)
u=inbound_tracing(bw);
hasil=length(u) -1;
end %akhir fungsi
img=imread('c:\image\rino.tif');
perim1(img)
program perimeter/keliling tanpa inbound_tracing
=========================================
img=imread('c:\image\rino.tif');
perimeter=length(img) -1
program mencari luas objek citra biner denga fungsi
===========================================
function hasil = luas(bw)
% Untuk menghitung luas citra bw (citra biner)
[tinggi, lebar] = size(bw);
hasil = 0;
for p = 1 : tinggi
for q = 1 : lebar
if bw(p, q) == 1
hasil = hasil + 1;
end
end
end
end % akhir fungsi
Daun = imread('c:\image\rino.tif');
luas(Daun)
program mencari luas objek citra biner tanpa fungsi
==========================================
x = imread('c:\image\rino.tif');
[tinggi, lebar] = size(x);
hasil = 0;
for p = 1 : tinggi
for q = 1 : lebar
if x(p, q) == 1
hasil = hasil + 1;
end
end
end
luas_citra_daun_bin=hasil
output
luas_citra_daun_bin = 31862
program diameter objek biner dengan fungsi (masih debug)
================================================
function [diameter, x1, y1, x2, y2] = peroleh_diameter(BW)
U = get_contour(BW);
n = length(U);
jarak_maks = 0;
piksel1 = 0;
piksel2 = 0;
for p=1 : n-1
for q=p+1 : n
jarak = sqrt((U(p,1)-U(q,1)) ^ 2 + (U(p,2)-U(q,2)) ^ 2);
if jarak > jarak_maks
jarak_maks = jarak;
piksel1 = p;
piksel2 = q;
end
end
end
y1 = U(piksel1, 1);
x1 = U(piksel1, 2);
y2 = U(piksel2, 1);
x2 = U(piksel2, 2);
diameter = jarak_maks;
end %akhir fungsi
rino = imread('c:\image\rino.tif.tif');
[d,x1,y1,x2,y2] = peroleh_diameter(rino);
d
program diameter objek biner tanpa fungsi
==============================
x= imread('c:\image\rino.tif');
n = length(x);
jarak_maks = 0;
piksel1 = 0;
piksel2 = 0;
for p=1 : n-1
for q=p+1 : n
jarak = sqrt((x(p,1)-x(q,1)) ^ 2 + (x(p,2)-x(q,2)) ^ 2);
if jarak > jarak_maks
jarak_maks = jarak;
piksel1 = p;
piksel2 = q;
end
end
end
diameter = jarak_maks
program pusat massa dan fitur menggunakan pusat massa dengan fungsi
==========================================================
function [pusat_x, pusat_y] = centroid(BW)
% CENTROID Untuk memperoleh pusat massa sebuah objek
% yang terletak pada citra biner BW
[tinggi, lebar] = size(BW);
pusat_x = 0;
pusat_y = 0;
luas = 0;
for q = 1 : tinggi
for p = 1 : lebar
if BW(q, p) == 1
luas = luas + 1;
pusat_x = pusat_x + p;
pusat_y = pusat_y + q;
end
end
end
pusat_x = pusat_x / luas;
pusat_y = pusat_y / luas;
end %akhir fungsi
rino = imread('C:\Image\rino.tif');
[x, y] = centroid(rino); imshow(rino);
[panjang, lebar] = size(rino);
line([0 lebar], [round(y) round(y)],’Color’,’b’)
line([round(x) round(x)], [0 panjang],’Color’,’b’)
program pusat massa dan fitur menggunakan pusat massa tanpa fungsi
==========================================================
objek = imread('C:\Image\rino.tif');
[tinggi, lebar] = size(objek);
pusat_x = 0;
pusat_y = 0;
luas = 0;
for q = 1 : tinggi
for p = 1 : lebar
if objek(q, p) ==1
luas = luas + 1;
pusat_x = pusat_x + p;
pusat_y = pusat_y + q;
end
end
end
pusat_x = pusat_x / luas;
pusat_y = pusat_y / luas;
imshow(objek);
line([0 lebar], [round(pusat_y) round(pusat_y)],’Color’,’b’)
line([round(pusat_x) round(pusat_x)], [0 tinggi],’Color’,’b’)
Program Citra berwarna RGB Ke CMYK dengan fungsi sudah dimodifikasi hotma
=====================================================================
function [c,m,y,k] = rgbkecmyk(r,g,b)
if max(max(r)) > 1.0 || max(max(g)) > 1.0 || max(max(b)) > 1.0
r = double(r) / 255;
g = double(g) / 255;
b = double(b) / 255;
end
u = 0.5;
be = 1;
[tinggi, lebar] = size(r);
for baris=1: tinggi
for kolom=1: lebar
kb = min([(1-r(baris,kolom)) (1-g(baris,kolom)) (1-b(baris,kolom))]);
if kb == 1
c(baris,kolom) = 0;
m(baris,kolom) = 0;
y(baris,kolom) = 0;
else
c(baris,kolom) = (1.0 - r(baris,kolom) - u * kb);
m(baris,kolom) = (1.0 - g(baris,kolom) - u * kb);
y(baris,kolom) = (1.0 - b(baris,kolom) - u * kb);
k(baris,kolom) = be * kb;
end
end
end
% Konversikan ke jangkauan [0,255]
c = uint8(c * 255);
m = uint8(m * 255);
y = uint8(y * 255);
k = uint8(k * 255);
end %akhir fungsi
[c,m,y,k] = rgbkecmyk(171, 215, 170)
konversi rgb ke cmyk dengan nilai =
c = 64
m = 20
y = 65
k = 40
img = imread('c:\Image\rino.tif');
[c,m,y,k] = rgbkecmyk(img(:,:,1), img(:,:,2), img(:,:,3));
subplot(1,2,1);imshow(img)
subplot(1,2,2);imshow([c,m,y,k])
Program Citra berwarna RGB Ke CMYK dengan fungsi dari buku
==============================================
function [C,M,Y,K] = RGBkeCMY(R,G,B)
if max(max(R)) > 1.0 || max(max(G)) > 1.0 || max(max(B)) > 1.0
R = double(R) / 255;
G = double(G) / 255;
B = double(B) / 255;
end
u = 0.5;
b = 1;
[tinggi, lebar] = size(R);
for m=1: tinggi
for n=1: lebar
Kb = min([(1-R(m,n)) (1-G(m,n)) (1-B(m,n))]);
if Kb == 1
C(m,n) = 0;
M(m,n) = 0;
Y(m,n) = 0;
else
C(m,n) = (1.0 - R(m,n) - u * Kb);
M(m,n) = (1.0 - G(m,n) - u * Kb);
Y(m,n) = (1.0 - B(m,n) - u * Kb);
K(m,n) = b * Kb;
end
end
end
% Konversikan ke jangkauan [0,255]
C = uint8(C * 255);
M = uint8(M * 255);
Y = uint8(Y * 255);
K = uint8(K * 255);
end %akhir fungsi
[C,M,Y,K] = RGBkeCMY(171, 215, 170)
hasil konversi RGB ke CMYK=
C = 64
M = 20
Y = 65
K = 40
img = imread('C:\Image\rino.tif');
[C,M,Y,K] = RGBkeCMY(img(:,:,1), img(:,:,2), img(:,:,3));
subplot(1,2,1);imshow(img)
subplot(1,2,2);imshow([C,M,Y,K])
program cmyk ke rgb dengan fungsi dari buku
=======================================
function [R,G,B] = CMYkeRGB(C,M,Y,K)
% CMYkeRGB digunakan untuk mengonversi CMYK ke RGB
% Berdasarkan Pratt (2001)
% Dasar: b=1 dan u = 0,5
% Normalisasi CMY ke [0, 1]
C = double(C);
M = double(M);
Y = double(Y);
K = double(K);
if max(max(C)) > 1.0 || max(max(M)) > 1.0 || ...
max(max(Y)) > 1.0 || max(max(K)) > 1.0
C = double(C) / 255;
M = double(M) / 255;
Y = double(Y) / 255;
K = double(K) / 255;
end
u = 0.5;
b = 1;
[tinggi, lebar] = size(C);
for m=1: tinggi
for n=1: lebar
Kb = K(m,n) / b;
if Kb == 1
R(m,n)=0;
G(m,n)=0;
B(m,n)=0;
else
R(m,n) = 1 - (C(m, n) + u * Kb);
G(m,n) = 1 - (M(m, n) + u * Kb);
B(m,n) = 1 - (Y(m, n) + u * Kb);
end
end
end
% Konversikan ke jangkauan [0,255]
R = uint8(R * 255);
G = uint8(G * 255);
B = uint8(B * 255);
end %akhir fungsi
[R,G,B] = CMYkeRGB(64,20,65,40)
hasil konversi CMYK ke RGB =
R = 171
G = 215
B = 170
img=imread('c:\image\rino.tif');
[R,G,B] = CMYkeRGB(img(:,:,1), img(:,:,2), img(:,:,3));
Program rgb ke yiq dengan fungsi sudah dimodifikasi Hotma
==================================================
function [y, i, q] = rgbkeyiq(r,g,b)
if max(max(r)) > 1 || max(max(g)) > 1 || max(max(b)) > 1
r = double(r) / 255;
g = double(g) / 255;
b = double(b) / 255;
end
[tinggi, lebar] = size(r);
for m=1: tinggi
for n=1: lebar
y(m,n) = 0.299 * r(m,n) + 0.587 * g(m,n) + 0.114*b(m,n);
i(m,n) = 0.596 * r(m,n) - 0.274 * g(m,n) - 0.322*b(m,n);
q(m,n) = 0.211 * r(m,n) - 0.523 * g(m,n) + 0.312*b(m,n);
end
end
% Konversikan ke jangkauan [0,255]
y = uint8(y * 255);
i = uint8(i * 255);
q = uint8(q * 255);
end %akhir fungsi
[y,i,q] = rgbkeyiq(171, 20, 250)
hasil konversi RGB ke YIQ =
Y = 91
I = 16
Q = 104
img = imread('C:\Image\rino.tif');
[y,i,q] = rgbkeyiq(img(:,:,1), img(:,:,2), img(:,:,3));
subplot(1,2,1);imshow(img)
subplot(1,2,2);imshow([y,i,q])
Program RGB ke YIQ dengan fungsi
======================================
function [Y, I, Q] = RGBkeYIQ(R,G,B)
% RGBkeYIQ digunakan untuk mengonversi RGB ke YIQ
% Normalisasi RGB ke [0, 1]
R = double(R);
G = double(G);
B = double(B);
if max(max(R)) > 1.0 || max(max(G)) > 1.0 || max(max(B)) > 1.0
R = double(R) / 255;
G = double(G) / 255;
B = double(B) / 255;
end
[tinggi, lebar] = size(R);
for m=1: tinggi
for n=1: lebar
Y(m,n) = 0.299 * R(m,n) + 0.587 * G(m,n) + 0.114*B(m,n);
I(m,n) = 0.596 * R(m,n) - 0.274 * G(m,n) - 0.322*B(m,n);
Q(m,n) = 0.211 * R(m,n) - 0.523 * G(m,n) + 0.312*B(m,n);
end
end
% Konversikan ke jangkauan [0,255]
Y = uint8(Y * 255);
I = uint8(I * 255);
Q = uint8(Q * 255);
end %akhir fungsi
[Y,I,Q] = RGBkeYIQ(171, 20, 250)
hasil konversi RGB ke YIQ =
Y = 91
I = 16
Q = 104
img = imread('C:\Image\rino.tif');
[Y,I,Q] = RGBkeYIQ(img(:,:,1), img(:,:,2), img(:,:,3));
subplot(1,2,1);imshow(img)
subplot(1,2,2);imshow([Y,I,Q])
Program RGB ke YCB dengan fungsi dari buku
=========================================
function [Y, Cb, Cr] = RGBkeYCB(R,G,B)
% RGBkeYCB digunakan untuk mengonversi RGB ke YCbCr
% Normalisasi RGB ke [0, 1]
R = double(R);
G = double(G);
B = double(B);
if max(max(R)) > 1.0 || max(max(G)) > 1.0 || ...
max(max(B)) > 1.0
R = double(R) / 255;
G = double(G) / 255;
B = double(B) / 255;
end
[tinggi, lebar] = size(R);
for m=1: tinggi
for n=1: lebar
Y(m,n)=0.299*R(m,n)+0.587*G(m,n)+ 0.114*B(m,n);
Cb(m,n)=-0.1687*R(m,n)-0.33126*G(m,n)+0.5*B(m,n);
Cr(m,n)=0.5*R(m,n)-0.41869*G(m,n)-0.08131*B(m,n);
end
end
Y = Y * 255;
Cb = Cb * 255;
Cr = Cr * 255;
end %akhir fungsi
[Y,Cb,Cr] = RGBkeYCB(9, 16, 250)
hasil konversi RGB ke YCB dengan angka
Y = 40.583
Cb = 118.18
Cr = -22.527
perintah untuk melihat konversi dengan citra
=======================================
img = imread('C:\Image\rino.tif');
[Y,Cb,Cr] = RGBkeYCB(img(:,:,1), img(:,:,2), img(:,:,3));
subplot(1,2,1);imshow(img)
subplot(1,2,2);imshow([Y,Cb,Cr])
Program derau gaussian dengan fungsi
==================================================
function [g] = gaussian(f, sigma, mu)
% g = Menghasilkan citra yang telah diberi derau menggunakan gaussian.
% f = citra masukan berskala keabuan
% sigma = standar deviasi fungsi gaussian
% mu = rerata fungsi Gaussian
if nargin < 3
mu = 0; % Nilai bawaan mu
end
if nargin < 2
sigma = 1; % Nilai bawaan standar deviasi
end
[m, n] = size(f);
g = double(f);
for i=1 : m
for j=1 : n
derau = randn * sigma + mu;
g(i,j) = round(f(i, j) + derau);
if g(i,j) >= 255
g(i,j) = 255;
elseif g(i,j) <= 0
g(i,j) = 0;
end
end
end
g = uint8(g);
end %akhir fungsi
f = imread('c:\image\rino.tif');
g = gaussian(f, 150);
subplot(1,2,1);imshow(f), title('citra masukan')
subplot(1,2,2);imshow(g), title('citra keluaran')
Program garam dan merica dengan fungsi
=================================
function [g] = gamer(f, probabilitas)
if nargin < 2
probabilitas = 0.05; % Nilai bawaan
end;
[m, n] = size(f);
g = double(f);
for i=1 : m
for j=1 : n
nilai_acak = rand;
if nilai_acak <= probabilitas / 2
g(i,j) = 0;
elseif (nilai_acak > probabilitas / 2) && ...
(nilai_acak <= probabilitas)
g(i,j) = 255;
end
end
end
g = uint8(g);
end %akhir fungsi
f = imread('c:\image\rino.tif');
g = gamer(f, 0.05);
subplot(1,2,1);imshow(f), title('citra masukan')
subplot(1,2,2);imshow(g), title('citra keluaran')
Program derau periodik dengan fungsi
=======================================================
function [G] = drperiodik(F, a, bx, by)
% DRPERIODIK Menghasilkan citra yang teklah ditambahi
% derau periodis.
%
% F = Citra berskala keabuan
% b = penegas derau (1, 2, 3, ...)
% ax dan ay menentukan kemiringan derau
if nargin < 4
a = 3; bx = 3; by = 5;
end
[m, n] = size(F);
for i=1:m
for j=1:n
X(i,j) = j;
Y(i,j) = i;
end
end
derau = a * sin(X/bx + Y/by) + 1;
G = uint8(double(F) + derau);
end %akhir fungsi
f = imread('c:\image\rino.tif');
g = drperiodik(f, 10,3,4);
subplot(1,2,1);imshow(f), title('citra masukan')
subplot(1,2,2);imshow(g), title('citra keluaran')
program penghilangan derau rerata aritmatik dengan fungsi
=============================================
function [G] = filarithmean(F, ukuran)
% FILARITHMEAN Melakukan penghilangan derau dengan
% menggunakan filter rerata aritmetik
% F = Citra berskala keabuan
% ukuran = ukuran jendela
% G = Citra hasil pemrosesan
if nargin < 2
ukuran = 5;
end
[m, n] = size(F);
setengah = floor(ukuran / 2);
F = double(F);
G = zeros(m-2*setengah, n-2*setengah);
for i=1+setengah : m-setengah
for j=1+setengah: n-setengah
jum = 0;
for p = -setengah : setengah
for q = -setengah : setengah
jum = jum + F(i+p, j+q);
end
end
G(i-setengah, j-setengah) = jum / (ukuran * ukuran);
end
end
G = uint8(G);
end %akhir fungsi
F = imread('C:\Image\rino.tif');
G = filarithmean(F);
subplot(1,2,1);imshow(F)
subplot(1,2,2);imshow(G)
Program filter harmonik dengan fungsi
=======================================================
function [G] = filharmonik(F, ukuran)
% FILHARMONIK Melakukan penghilangan derau dengan
% menggunakan filter rerata harmonik
% F = Citra berskala keabuan
% ukuran = ukuran jendela
% G = Citra hasil pemrosesan
if nargin < 2
ukuran = 3;
end
[m, n] = size(F);
setengah = floor(ukuran / 2);
F = double(F);
G = zeros(m-2*setengah, n-2*setengah);
for i=1+setengah : m-setengah
for j=1+setengah: n-setengah
jum = 0;
for p = -setengah : setengah
for q = -setengah : setengah
jum = jum + 1 / F(i+p, j+q);
end
end
G(i-setengah, j-setengah) = (ukuran * ukuran) / jum;
end
end
G = uint8(G);
end %akhir fungsi
F = imread('C:\Image\rino.tif');
G = filharmonik(F, 5);
subplot(1,2,1);imshow(F)
subplot(1,2,2);imshow(G)
Program pengambangan dwi-aras dengan fungsi sudah di modif
================================================================
function [g] = ambang(f, t)
% fungsi ambang Menentukan nilai ambang yang digunakan
% untuk melakukan pengambangan
% f = Citra Masukan berskala keabuan
% t = nilai ambang
% Keluaran: g = citra biner
[m, n] = size(f);
for i=1 : m
for j=1:n
if f(i,j) <= t
g(i,j) = 0;
else
g(i,j) = 1;
end
end
end
end %akhir fungsi
f = imread('c:\image\rino.tif');
g = ambang(f, 100);
subplot(1,2,1);imshow(f)
subplot(1,2,2);imshow(1-g)
f = imread('c:\image\rino.tif');
g = ambang(f, 100);
subplot(1,2,1);imshow(f),title('citra Masukan')
subplot(1,2,2);imshow(1-g),title('citra Keluaran')
f = imread('c:\image\rino.tif');
g = ambang(f, 100);
subplot(1,2,1);imshow(f),title('citra Masukan')
subplot(1,2,2);imshow(1-g),title('citra Keluaran')
Program pengambangan aras jamak dengan fungsi sudah di modif
================================================
function [g] = arasjamak(f, t1, t2)
% Pengambanan dengan dua nilai ambang
% f = Citra berskala keabuan
% t1 = nilai ambang bawah
% t2 = nilai ambang atas
% Masukan : f = citra biner
% Keluaran: g = citra biner
[m, n] = size(f);
for i=1 : m
for j=1:n
if f(i,j) <= t1 || f(i,j) >= t2
g(i,j) = 0;
else
g(i,j) = 1;
end
end
end
end %akhir fungsi
f = imread('c:\image\rino.tif');
g = arasjamak(f, 50, 100);
subplot(1,2,1);imshow(f), title('citra masukan')
subplot(1,2,2);imshow(g), title('citra keluaran dengan t1=50 dan t2=100')
Program pengambangan adaftif dengan fungsi sudah dimodif
======================================================
function [g] = adapmean(f, w, c)
% adapmean Melakukan pengambangan adaptif dengan menggunakan mean.
% f = variabel Citra masukan berskala keabuan
% w = ukuran jendela
% c = nilai konstan
% g = variabel citra keluaran
if nargin == 0
disp('Penggunaan adapmean(Citra, ukuran, konstanta');
return;
end
if nargin == 1
w = 2;
c = 0;
end
if nargin == 2
c = 0;
end
% Lakukan pemrosesan citra
[m, n] = size(f);
delta = floor(w/2);
if c < 0
g = zeros(m, n); % Diasumsikan berlatarbelakang 0
else
g = ones(m, n); % Diasumsikan berlatarbelakang 1
end
f=double(f);
for y=1+delta : m-delta
for x=1+delta : n-delta
rerata = 0.0;
jum = w * w;
for p=1 : w
for q=1 : w
rerata = rerata + f(y-round(w/2)+p, ...
x-round(w/2)+q);
end
end
rerata = floor(rerata / jum) - c;
if f(y,x) >= rerata
g(y, x) = 1;
else
g(y, x) = 0;
end
end
end
end %akhir fungsi
f = imread('c:\image\rino.tif');
g = adapmean(f, 2, 0);
subplot(1,2,1);imshow(f) , title('citra masukan')
subplot(1,2,2);imshow(g) , title('citra keluaran dengan w=2 dan c=0')
f = imread('c:\image\rino.tif');
g = adapmean(f, 2, 0);
subplot(1,2,1);imshow(f) , title('citra masukan')
subplot(1,2,2);imshow(g) , title('citra keluaran dengan w=2 dan c=0')
f = imread('c:\image\rino.tif');
g = adapmean(f, 13, 15);
subplot(1,2,1);imshow(f) , title('citra masukan')
subplot(1,2,2);imshow(g) , title('citra keluaran dengan w=13 dan c=15')
program segmentasi warna denga fungsi
===========================
function [RGB] = segwarna(nama_file)
% SEGWARNA Digunakan untuk melakukan segmentasi citra
% berdasarkan warna
% F = citra berwarna
% Keluaran:
% G = citra berwarna yang telah disegmentasi
Img = imread(nama_file);
[tinggi, lebar, dim] = size(Img);
if dim < 3
error('Masukan harus berupa citra berwarna');
end
% Konversi ke HVS
[H,S,L] = RGBkeHSL(Img(:,:,1),Img(:,:,2),Img(:,:,3));
for y=1: tinggi
for x=1: lebar
h = H(y,x);
% Ubah warna
if h < 11
h = 0;
elseif h < 32
h = 21;
elseif h < 54
h = 43;
elseif h < 116
h = 85;
elseif h < 141
h = 128;
elseif h < 185
h = 170;
elseif h < 202
h = 191;
elseif h < 223
h = 213;
elseif h < 244
h = 234;
else
h = 0;
end
% Ubah komponen H
H(y,x) = h;
% Ubah komponen S
if S(y,x) >= 200
S(y,x) = 255;
elseif S(y,x) <= 20
S(y,x) = 0;
else
S(y,x) = 128;
end
% Ubah komponen L
if L(y,x) >= 200
L(y,x) = 255;
elseif L(y,x) <= 20
L(y,x) = 0;
else
L(y,x) = 128;
end
end
end
[R, G, B] = HSLkeRGB(H, S, L);
RGB(:,:,1) = R;
RGB(:,:,2) = G;
RGB(:,:,3) = B;
return
end %akhir fungsi
G = segwarna('C:\Image\rino.tif'); imshow(G)
Program tanda tangan kontur dengan fungsi
==========================================
function [Jarak] = tandatangan(BW)
% TANDATANGAN Digunakan untuk memperoleh jarak-jarak antara
% piksel dalam batas objek dri citra biner BW
% Keluaran: Jarak - Berisi sejumlah pasangan Y, X
% yang menyatakan jarak
[m,n] = size(BW);
Batas = double(BW);
[jum, z] = size(Batas);
[pusat_x, pusat_y] = centroid(BW);
Jarak = zeros(1,m);
for p=1 : jum
Jarak(p) = sqrt((Batas(p,1)-pusat_y)^2 + ...
(Batas(p,2)-pusat_x)^2);
end
% Plot jarak
X = 1: p;
plot(X, Jarak);
end %akhir fungsi
img =imread('C:\Image\rino.tif');
jarak = tandatangan(img, 0.5);
function [G] = fiturFourier(F, n)
% FITURFOURIER Memperoleh fitur Fourier sebanyak n buah.
% Masukan:
% F : Deskriptor Fourier yang lengkap
% n : Jumlah fitur yang dikehendaki
% Keluaran:
% G : Deskriptor Fourier sebanyak n buah
jum = length(F);
if jum > n
K1 = fftshift(F);
delta = round((jum-n) / 2);
K2 = K1(1 + delta : n+delta);
G = ifftshift(K2);
else
G = F;
end
end %akhir fungsi
F=imread('c:\image\rino.tif')
G = fiturFourier(F, 20);
imshow(G)
function [G] = plotFD(F)
% PLOTFD Menampilkan kontur berdasarkan deskriptor Fourier.
% Masukan: F = Deskriptor Fourier
jum = length(F);
if jum > 0
G = ifft(F); % Transformasi balik
G = [G; G(1)]; % Tambahkan elemen pertama
plot(G);
axis off;
end
end %akhir fungsi
F=imread('c:\image\rino.tif');
G=plotFD(F) ;
imshow(G)
function [F] = perolehFD(Kontur)
% PEROLEHFD Memperoleh deskriptor Fourier berdasarkan
% kontur suatu bentuk.
% Masukan: Kontur = kontur objek
% Keluaran: F = deskriptor Fourier
jum = length(Kontur);
% Atur supaya jumlah elemen genap
if rem(jum, 2) == 1
Kontur = [Kontur; Kontur(1,:)];
end
% Peroleh bentuk Fourier kontur
K = Kontur(:, 2) - i * Kontur(:,1);
F = fft(K);
end %akhir fungsi
Img = im2bw(imread('C:\Image\rino.tif'), 0.5);
Kontur = inbound_tracing(Img);
F = perolehFD(Kontur);
length(F)
[m,n]=size(Img); m * n
function [] = amatiFD(berkas)
% AMATIFD Digunakan untuk mengamati deskriptor Fourier
% yang telah dinormalisasi.
Img = im2bw(imread(berkas),0.5);
K = inbound_tracing(Img);
F = perolehFD(K);
G = fiturFourier(F,30);
H = normalisasiFD(G);
bar(H);
end %akhir fungsi
amatiFD('C:\Image\rino.tif');
Kesimpulan
Manfaat pengolahan citra adalah menunjang kebutuhan
kehidupan seharisahari khususnya untuk : Memfasilitasi penyimpanan dan
transmisi citra seperti menentukan metode penyimpanan citra yang
efisien dalam suatu kamera digital sehingga mempercepat proses pengirim citra dari jarak jauh
misalkan dari planet Mars ke Bumi. Menyiapkan untuk ditampilkan di monitor atau
di cetak. Proses yang dilakukan adalah melakukan merubah ukuran citra yang
harus disesuaikan dengan ukuran media tampilan serta proses halftoning untuk
proses pencetakan. Meningkatkan dan memperbaiki
citra dengan menghilangkan goresan-goresan pada
ataupun meningkatkan
visibilitas citra. Ekstrasi informasi citra misalkan
character recognizing, pengukuran plusi air dari citra aerial.
Komentar
Posting Komentar