“Dilasi”
Oleh :
Kris Widyo Febyanti (1641720006)
Piping Adel Wijaya Putri Y. (1741723006)
Sheyba Adinda Azigita (1641720170)
Syilvia Windy Kharisma P. (1641720026)
TI - 4C
A. TUJUAN
- Mahasiswa dapat membuat aplikasi dengan Operasi Delasi
B. PETUNJUK
1. Awali setiap kegiatan praktikum dengan berdoa
2. Baca dan pahami tujuan, dasar teori, dan latihan-latihan praktikum dengan baik
3. Kerjakan tugas-tugas praktikum dengan baik, sabar dan jujur
4. Tanyakan kepada dosen apabila ada hal-hal yang kurang jelas
C. ALOKASI WAKTU: 6 jam pelajaran
D. DASAR TEORI
- Operasi Morfologi
Morfologi merupakan teknik pengolahan citra berdasarkan bentuk segmen
citra. Yang bertujuan untuk memperbaiki hasil segmentasi. Teknik morfologi biasanya
digunakan pada citra biner atau untuk beberapa kasus juga bisa diterapkan pada citra
keabuan (grayscale).
Secara umum, pemrosesan citra secara morfologi dilakukan dengan cara mem-
passing sebuah structuring element terhadap sebuah citra dengan cara yang hampir
sama dengan konvolusi. Structuring element dapat diibaratkan dengan mask pada
pemrosesan citra biasa (bukan secara morfologi).
Structuring Element
● Structuring element dapat berukuran sembarang
● Structuring element juga memiliki titik poros (disebut juga titik origin/ titik
asal/titik acuan)
Pada contoh berikut, piksel pusat (biasa diberi nama hotspot) ditandai dengan warna
abu-abu. Piksel pusat ini yang menjadi pusat dalam melakukan operasi terhadap citra,
sebagaimana diilustrasikan pada Gambar 1.
- Operasi Delasi
Delasi adalah teknik untuk memperbesar segmen objek (citra biner) dengan
menambah lapisan disekeliling objek. Atau dengan menjadi titik latar (0) yang
bertetangga dengan titik objek (1) menjadi titik objek (1).
Delasi ini sangat berguna ketika diterapkan dalam obyek-obyek yang terputus
dikarenakan hasil pengambilan citra yang terganggu oleh noise, kerusakan objek fisik
yang dijadikan citra digital, atau disebabkan resolusi yang jelek. Misalnya teks pada
kertas yang sudah agak rusak sehingga bentuk hurufnya terputus, dan sebagainya.
Perhitungan Delasi :
Fully Match 1
Some Match 1
No Match 0
Rumus :
Berikut adalah ilustrasi hasil operasi morfologi menggunakan erosi.
E. TUGAS PRAKTIKUM DILATION
Pertama-tama tambah menu Dilasi pada form utama, lalu tambahkan syntax program
seperti berikut pada form utama.
Source Code :
Fungsi Cross 3x3
w = bit.Width - 1;
h = bit.Height - 1;
blok = 0;
prog.Visible = true;
for (int i = 0; i <= w; i++)
{
for (int j = 0; j <= h; j++)
{
b01 = b02 = b03 = false;
b04 = b05 = b06 = false;
b07 = b08 = b09 = false;
sumR = sumG = sumB = 0;
blok = 0;
// top
if (j == 0)
{
// top left
if (i == 0)
{
b05 = b06 = true;
b08 = b09 = true;
}
// top center
else if (0 < i && i < w)
{
b04 = b05 = b06 = true;
b07 = b08 = b09 = true;
}
// top right
else if (i == w)
{
b04 = b05 = true;
b07 = b08 = true;
}
}
// middle
else if (0 < j && j < h)
{
// middle left
if (i == 0)
{
b02 = b03 = true;
b05 = b06 = true;
b08 = b09 = true;
}
// middle center
else if (0 < i && i < w)
{
b01 = b02 = b03 = true;
b04 = b05 = b06 = true;
b07 = b08 = b09 = true;
}
// middle right
else if (i == w)
{
b01 = b02 = true;
b04 = b05 = true;
b07 = b08 = true;
}
}
// bottom
else if (j == h)
{
// bottom left
if (i == 0)
{
b02 = b03 = true;
b05 = b06 = true;
}
// bottom center
else if (0 < i && i < w)
{
b01 = b02 = b03 = true;
b04 = b05 = b06 = true;
}
// bottom right
else if (i == w)
{
b01 = b02 = true;
b04 = b05 = true;
}
}
if (b01)
{
c = bit.GetPixel(i - 1, j - 1);
sumR += (c.R * kernel[0]);
sumG += (c.G * kernel[0]);
sumB += (c.B * kernel[0]);
blok += kernel[0];
}
if (b02)
{
c = bit.GetPixel(i, j - 1);
sumR += (c.R * kernel[1]);
sumG += (c.G * kernel[1]);
sumB += (c.B * kernel[1]);
blok += kernel[1];
}
if (b03)
{
c = bit.GetPixel(i + 1, j - 1);
sumR += (c.R * kernel[2]);
sumG += (c.G * kernel[2]);
sumB += (c.B * kernel[2]);
blok += kernel[2];
}
///
if (b04)
{
c = bit.GetPixel(i - 1, j);
sumR += (c.R * kernel[3]);
sumG += (c.G * kernel[3]);
sumB += (c.B * kernel[3]);
blok += kernel[3];
}
if (b05)
{
c = bit.GetPixel(i, j);
sumR += (c.R * kernel[4]);
sumG += (c.G * kernel[4]);
sumB += (c.B * kernel[4]);
blok += kernel[4];
}
if (b06)
{
c = bit.GetPixel(i + 1, j);
sumR += (c.R * kernel[5]);
sumG += (c.G * kernel[5]);
sumB += (c.B * kernel[5]);
blok += kernel[5];
}
///
if (b07)
{
c = bit.GetPixel(i - 1, j + 1);
sumR += (c.R * kernel[6]);
sumG += (c.G * kernel[6]);
sumB += (c.B * kernel[6]);
blok += kernel[6];
}
if (b08)
{
c = bit.GetPixel(i, j + 1);
sumR += (c.R * kernel[7]);
sumG += (c.G * kernel[7]);
sumB += (c.B * kernel[7]);
blok += kernel[7];
}
if (b09)
{
c = bit.GetPixel(i + 1, j + 1);
sumR += (c.R * kernel[8]);
sumG += (c.G * kernel[8]);
sumB += (c.B * kernel[8]);
blok += kernel[8];
}
if (str.Equals(""))
{
r = blok != 0 ? (int)sumR / blok : (int)sumR;
g = blok != 0 ? (int)sumG / blok : (int)sumG;
b = blok != 0 ? (int)sumB / blok : (int)sumB;
}
else
{
if (str.Equals("erosi"))
{
r = erosi((int)sumR, blok);
g = erosi((int)sumG, blok);
b = erosi((int)sumB, blok);
}
if (str.Equals("dilasi"))
{
r = dilasi((int)sumR, blok);
g = dilasi((int)sumG, blok);
b = dilasi((int)sumB, blok);
}
}
r = truncate(r);
g = truncate(g);
b = truncate(b);
return copy;
}
blok = 0;
prog.Visible = true;
for (int i = 0; i <= w; i++)
{
for (int j = 0; j <= h; j++)
{
b01 = b02 = b03 = b04 = b05 = false;
b06 = b07 = b08 = b09 = b10 = false;
b11 = b12 = b13 = b14 = b15 = false;
b16 = b17 = b18 = b19 = b20 = false;
b21 = b22 = b23 = b24 = b25 = false;
// row 1
if (j == 0)
{
// column 1
if (i == 0)
{
b13 = b14 = b15 = true;
b18 = b19 = b20 = true;
b23 = b24 = b25 = true;
}
// column 2
else if (i == 1)
{
b12 = b13 = b14 = b15 = true;
b17 = b18 = b19 = b20 = true;
b22 = b23 = b24 = b25 = true;
}
// column 3
else if (1 < i && i < w - 1)
{
b11 = b12 = b13 = b14 = b15 = true;
b16 = b17 = b18 = b19 = b20 = true;
b21 = b22 = b23 = b24 = b25 = true;
}
// column 4
else if (i == w - 1)
{
b11 = b12 = b13 = b14 = true;
b16 = b17 = b18 = b19 = true;
b21 = b22 = b23 = b24 = true;
}
// column 5
else if (i == w)
{
b11 = b12 = b13 = true;
b16 = b17 = b18 = true;
b21 = b22 = b23 = true;
}
}
// row 2
else if (j == 1)
{
// column 1
if (i == 0)
{
b08 = b09 = b10 = true;
b13 = b14 = b15 = true;
b18 = b19 = b20 = true;
b23 = b24 = b25 = true;
}
// column 2
else if (i == 1)
{
b07 = b08 = b09 = b10 = true;
b12 = b13 = b14 = b15 = true;
b17 = b18 = b19 = b20 = true;
b22 = b23 = b24 = b25 = true;
}
// column 3
else if (1 < i && i < w - 1)
{
b06 = b07 = b08 = b09 = b10 = true;
b11 = b12 = b13 = b14 = b15 = true;
b16 = b17 = b18 = b19 = b20 = true;
b21 = b22 = b23 = b24 = b25 = true;
}
// column 4
else if (i == w - 1)
{
b06 = b07 = b08 = b09 = true;
b11 = b12 = b13 = b14 = true;
b16 = b17 = b18 = b19 = true;
b21 = b22 = b23 = b24 = true;
}
// column 5
else if (i == w)
{
b06 = b07 = b08 = true;
b11 = b12 = b13 = true;
b16 = b17 = b18 = true;
b21 = b22 = b23 = true;
}
}
// row 3
else if (1 < j && j < h - 1)
{
// column 1
if (i == 0)
{
b03 = b04 = b05 = true;
b08 = b09 = b10 = true;
b13 = b14 = b15 = true;
b18 = b19 = b20 = true;
b23 = b24 = b25 = true;
}
// column 2
else if (i == 1)
{
b02 = b03 = b04 = b05 = true;
b07 = b08 = b09 = b10 = true;
b12 = b13 = b14 = b15 = true;
b17 = b18 = b19 = b20 = true;
b22 = b23 = b24 = b25 = true;
}
// column 3
else if (1 < i && i < w - 1)
{
b01 = b02 = b03 = b04 = b05 = true;
b06 = b07 = b08 = b09 = b10 = true;
b11 = b12 = b13 = b14 = b15 = true;
b16 = b17 = b18 = b19 = b20 = true;
b21 = b22 = b23 = b24 = b25 = true;
}
// column 4
else if (i == w - 1)
{
b01 = b02 = b03 = b04 = true;
b06 = b07 = b08 = b09 = true;
b11 = b12 = b13 = b14 = true;
b16 = b17 = b18 = b19 = true;
b21 = b22 = b23 = b24 = true;
}
// column 5
else if (i == w)
{
b01 = b02 = b03 = true;
b06 = b07 = b08 = true;
b11 = b12 = b13 = true;
b16 = b17 = b18 = true;
b21 = b22 = b23 = true;
}
}
// row 4
else if (j == h - 1)
{
// column 1
if (i == 0)
{
b03 = b04 = b05 = true;
b08 = b09 = b10 = true;
b13 = b14 = b15 = true;
b18 = b19 = b20 = true;
}
// column 2
else if (i == 1)
{
b02 = b03 = b04 = b05 = true;
b07 = b08 = b09 = b10 = true;
b12 = b13 = b14 = b15 = true;
b17 = b18 = b19 = b20 = true;
}
// column 3
else if (1 < i && i < w - 1)
{
b01 = b02 = b03 = b04 = b05 = true;
b06 = b07 = b08 = b09 = b10 = true;
b11 = b12 = b13 = b14 = b15 = true;
b16 = b17 = b18 = b19 = b20 = true;
}
// column 4
else if (i == w - 1)
{
b01 = b02 = b03 = b04 = true;
b06 = b07 = b08 = b09 = true;
b11 = b12 = b13 = b14 = true;
b16 = b17 = b18 = b19 = true;
}
// column 5
else if (i == w)
{
b01 = b02 = b03 = true;
b06 = b07 = b08 = true;
b11 = b12 = b13 = true;
b16 = b17 = b18 = true;
}
}
// row 5
else if (j == h)
{
// column 1
if (i == 0)
{
b03 = b04 = b05 = true;
b08 = b09 = b10 = true;
b13 = b14 = b15 = true;
}
// column 2
else if (i == 1)
{
b02 = b03 = b04 = b05 = true;
b07 = b08 = b09 = b10 = true;
b12 = b13 = b14 = b15 = true;
}
// column 3
else if (1 < i && i < w - 1)
{
b01 = b02 = b03 = b04 = b05 = true;
b06 = b07 = b08 = b09 = b10 = true;
b11 = b12 = b13 = b14 = b15 = true;
}
// column 4
else if (i == w - 1)
{
b01 = b02 = b03 = b04 = true;
b06 = b07 = b08 = b09 = true;
b11 = b12 = b13 = b14 = true;
}
// column 5
else if (i == w)
{
b01 = b02 = b03 = true;
b06 = b07 = b08 = true;
b11 = b12 = b13 = true;
}
}
if (b01)
{
c = bit.GetPixel(i - 2, j - 2);
sumR += (c.R * kernel[0]);
sumG += (c.G * kernel[0]);
sumB += (c.B * kernel[0]);
blok += kernel[0];
}
if (b02)
{
c = bit.GetPixel(i - 1, j - 2);
sumR += (c.R * kernel[1]);
sumG += (c.G * kernel[1]);
sumB += (c.B * kernel[1]);
blok += kernel[1];
}
if (b03)
{
c = bit.GetPixel(i, j - 2);
sumR += (c.R * kernel[2]);
sumG += (c.G * kernel[2]);
sumB += (c.B * kernel[2]);
blok += kernel[2];
}
if (b04)
{
c = bit.GetPixel(i + 1, j - 2);
sumR += (c.R * kernel[3]);
sumG += (c.G * kernel[3]);
sumB += (c.B * kernel[3]);
blok += kernel[3];
}
if (b05)
{
c = bit.GetPixel(i + 2, j - 2);
sumR += (c.R * kernel[4]);
sumG += (c.G * kernel[4]);
sumB += (c.B * kernel[4]);
blok += kernel[4];
}
///
if (b06)
{
c = bit.GetPixel(i - 2, j - 1);
sumR += (c.R * kernel[5]);
sumG += (c.G * kernel[5]);
sumB += (c.B * kernel[5]);
blok += kernel[5];
}
if (b07)
{
c = bit.GetPixel(i - 1, j - 1);
sumR += (c.R * kernel[6]);
sumG += (c.G * kernel[6]);
sumB += (c.B * kernel[6]);
blok += kernel[6];
}
if (b08)
{
c = bit.GetPixel(i, j - 1);
sumR += (c.R * kernel[7]);
sumG += (c.G * kernel[7]);
sumB += (c.B * kernel[7]);
blok += kernel[7];
}
if (b09)
{
c = bit.GetPixel(i + 1, j - 1);
sumR += (c.R * kernel[8]);
sumG += (c.G * kernel[8]);
sumB += (c.B * kernel[8]);
blok += kernel[8];
}
if (b10)
{
c = bit.GetPixel(i + 2, j - 1);
sumR += (c.R * kernel[9]);
sumG += (c.G * kernel[9]);
sumB += (c.B * kernel[9]);
blok += kernel[9];
}
///
if (b11)
{
c = bit.GetPixel(i - 2, j);
sumR += (c.R * kernel[10]);
sumG += (c.G * kernel[10]);
sumB += (c.B * kernel[10]);
blok += kernel[10];
}
if (b12)
{
c = bit.GetPixel(i - 1, j);
sumR += (c.R * kernel[11]);
sumG += (c.G * kernel[11]);
sumB += (c.B * kernel[11]);
blok += kernel[11];
}
if (b13)
{
c = bit.GetPixel(i, j);
sumR += (c.R * kernel[12]);
sumG += (c.G * kernel[12]);
sumB += (c.B * kernel[12]);
blok += kernel[12];
}
if (b14)
{
c = bit.GetPixel(i + 1, j);
sumR += (c.R * kernel[13]);
sumG += (c.G * kernel[13]);
sumB += (c.B * kernel[13]);
blok += kernel[13];
}
if (b15)
{
c = bit.GetPixel(i + 2, j);
sumR += (c.R * kernel[14]);
sumG += (c.G * kernel[14]);
sumB += (c.B * kernel[14]);
blok += kernel[14];
}
///
if (b16)
{
c = bit.GetPixel(i - 2, j + 1);
sumR += (c.R * kernel[15]);
sumG += (c.G * kernel[15]);
sumB += (c.B * kernel[15]);
blok += kernel[15];
}
if (b17)
{
c = bit.GetPixel(i - 1, j + 1);
sumR += (c.R * kernel[16]);
sumG += (c.G * kernel[16]);
sumB += (c.B * kernel[16]);
blok += kernel[16];
}
if (b18)
{
c = bit.GetPixel(i, j + 1);
sumR += (c.R * kernel[17]);
sumG += (c.G * kernel[17]);
sumB += (c.B * kernel[17]);
blok += kernel[17];
}
if (b19)
{
c = bit.GetPixel(i + 1, j + 1);
sumR += (c.R * kernel[18]);
sumG += (c.G * kernel[18]);
sumB += (c.B * kernel[18]);
blok += kernel[18];
}
if (b20)
{
c = bit.GetPixel(i + 2, j + 1);
sumR += (c.R * kernel[19]);
sumG += (c.G * kernel[19]);
sumB += (c.B * kernel[19]);
blok += kernel[19];
}
///
if (b21)
{
c = bit.GetPixel(i - 2, j + 2);
sumR += (c.R * kernel[20]);
sumG += (c.G * kernel[20]);
sumB += (c.B * kernel[20]);
blok += kernel[20];
}
if (b22)
{
c = bit.GetPixel(i - 1, j + 2);
sumR += (c.R * kernel[21]);
sumG += (c.G * kernel[21]);
sumB += (c.B * kernel[21]);
blok += kernel[21];
}
if (b23)
{
c = bit.GetPixel(i, j + 2);
sumR += (c.R * kernel[22]);
sumG += (c.G * kernel[22]);
sumB += (c.B * kernel[22]);
blok += kernel[22];
}
if (b24)
{
c = bit.GetPixel(i + 1, j + 2);
sumR += (c.R * kernel[23]);
sumG += (c.G * kernel[23]);
sumB += (c.B * kernel[23]);
blok += kernel[23];
}
if (b25)
{
c = bit.GetPixel(i + 2, j + 2);
sumR += (c.R * kernel[24]);
sumG += (c.G * kernel[24]);
sumB += (c.B * kernel[24]);
blok += kernel[24];
}
if (str.Equals(""))
{
r = blok != 0 ? (int)sumR / blok : (int)sumR;
g = blok != 0 ? (int)sumG / blok : (int)sumG;
b = blok != 0 ? (int)sumB / blok : (int)sumB;
}
else
{
if (str.Equals("erosi"))
{
r = erosi((int)sumR, blok);
g = erosi((int)sumG, blok);
b = erosi((int)sumB, blok);
}
if (str.Equals("dilasi"))
{
r = dilasi((int)sumR, blok);
g = dilasi((int)sumG, blok);
b = dilasi((int)sumB, blok);
}
}
r = truncate(r);
g = truncate(g);
b = truncate(b);
return copy;
}
Kernel 3x3
b. Dilation Square 5