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).


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.


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
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

Postingan populer dari blog ini