Jumat, 21 November 2008

Proses Konvolusi [PCD]

Source code konvolusi menggunakan Class. Di dalam Formnya hanya memanggil class yang tersedia. Berikut code contoh proses konvolusi (Sharpening) yang berada di dalam class tersebut.

here is the code :

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Windows.Forms;

namespace Konvolusi
{
class Class1
{
public double[] matriks3x3(double m0, double m1, double m2, double m3,
double m4, double m5, double m6, double m7, double m8)
{
double[] m = new double[9];
m[0] = m0;
m[1] = m1;
m[2] = m2;
m[3] = m3;
m[4] = m4;
m[5] = m5;
m[6] = m6;
m[7] = m7;
m[8] = m8;
return m;
}

public Bitmap proses(Bitmap b)
{
Color pixelColor;
int[] pixelR = new int[9];
int[] pixelG = new int[9];
int[] pixelB = new int[9];
int nRed, nGreen, nBlue;
Bitmap img2 = new Bitmap(b);
double[] m = new double[9];
int offset = 0;

//The Matrix
//fix sharpen
m = matriks3x3(0, -2, 0, -2, 11, -2, 0, -2, 0);


int total = Convert.ToInt32(m[0] + m[1] + m[2] + m[3] + m[4] + m[5] + m[6] + m[7] + m[8]);
if (total == 0)
total = 1;

MessageBox.Show("Matriksnya: "+m[0].ToString() + "," + m[1].ToString() + "," + m[2].ToString() + "," + m[3].ToString() + "," +
m[4].ToString() + "," + m[5].ToString() + "," + m[6].ToString() + "," + m[7].ToString() + "," + m[8].ToString() + ",");

for (int x = 1; x <= img2.Width-2; x++)
{
for (int y = 1; y <= img2.Height-2; y++)
{
if ((x - 1 < 0) && (y - 1 < 0))
{
//pojok kiri atas
}
else if ((x + 1 == img2.Width) && (y - 1 < 0))
{
//pojok kanan atas
}
else if ((x - 1 < 0) && (y + 1 == img2.Height))
{
//pojok kiri bawah
}
else if ((x + 1 == img2.Width) && (y + 1 == img2.Height))
{
//pojok kanan bawah
}
else if (x - 1 < 0)
{
//kiri
}
else if (x + 1 > img2.Width)
{
//kanan
}
else if (y - 1 < 0)
{
//atas
}
else if (y + 1 == img2.Height)
{
//bawah
}
else
{
//i[0]
pixelColor = b.GetPixel(x - 1, y - 1);
pixelR[0] = pixelColor.R;
pixelG[0] = pixelColor.G;
pixelB[0] = pixelColor.B;
//i[1]
pixelColor = b.GetPixel(x, y - 1);
pixelR[1] = pixelColor.R;
pixelG[1] = pixelColor.G;
pixelB[1] = pixelColor.B;
//i[2]
pixelColor = b.GetPixel(x + 1, y - 1);
pixelR[2] = pixelColor.R;
pixelG[2] = pixelColor.G;
pixelB[2] = pixelColor.B;
//i[3]
pixelColor = b.GetPixel(x - 1, y);
pixelR[3] = pixelColor.R;
pixelG[3] = pixelColor.G;
pixelB[3] = pixelColor.B;
//i[4]
pixelColor = b.GetPixel(x, y);
pixelR[4] = pixelColor.R;
pixelG[4] = pixelColor.G;
pixelB[4] = pixelColor.B;
//i[5]
pixelColor = b.GetPixel(x + 1, y);
pixelR[5] = pixelColor.R;
pixelG[5] = pixelColor.G;
pixelB[5] = pixelColor.B;
//i[6]
pixelColor = b.GetPixel(x - 1, y + 1);
pixelR[6] = pixelColor.R;
pixelG[6] = pixelColor.G;
pixelB[6] = pixelColor.B;
//i[7]
pixelColor = b.GetPixel(x, y + 1);
pixelR[7] = pixelColor.R;
pixelG[7] = pixelColor.G;
pixelB[7] = pixelColor.B;
//i[8]
pixelColor = b.GetPixel(x + 1, y + 1);
pixelR[8] = pixelColor.R;
pixelG[8] = pixelColor.G;
pixelB[8] = pixelColor.B;
}

nRed = Convert.ToInt32((m[0] * pixelR[0] + m[1] * pixelR[1] + m[2] * pixelR[2] + m[3] * pixelR[3] +
m[4] * pixelR[4] + m[5] * pixelR[5] + m[6] * pixelR[6] + m[7] * pixelR[7] +
m[8] * pixelR[8]) / total + offset);
nGreen = Convert.ToInt32((m[0] * pixelG[0] + m[1] * pixelG[1] + m[2] * pixelG[2] + m[3] * pixelG[3] +
m[4] * pixelG[4] + m[5] * pixelG[5] + m[6] * pixelG[6] + m[7] * pixelG[7] +
m[8] * pixelG[8]) / total + offset);
nBlue = Convert.ToInt32((m[0] * pixelB[0] + m[1] * pixelB[1] + m[2] * pixelB[2] + m[3] * pixelB[3] +
m[4] * pixelB[4] + m[5] * pixelB[5] + m[6] * pixelB[6] + m[7] * pixelB[7] +
m[8] * pixelB[8]) / total + offset);

//set pixel
if (nRed > 255)
nRed = 255;
else if (nRed < 0)
nRed = 0;

if (nGreen > 255)
nGreen = 255;
else if (nGreen < 0)
nGreen = 0;

if (nBlue > 255)
nBlue = 255;
else if (nBlue < 0)
nBlue = 0;

Color newPixelColor = Color.FromArgb(nRed, nGreen, nBlue);
img2.SetPixel(x, y, newPixelColor);
}
}
return img2;
}
}
}

Tidak ada komentar: