Jeśli powinno być w dziale C# to przepraszam, miałem dylemat.
A więc tak, napisałem program wyostrzający bitmapę za pomocą maski 3x3 w C przy użyciu metod ze strony: http://www.algorytm.org/przetwarzanie-obrazow/filtrowanie-obrazow.html Wszystko działało.
Maska, której użyłem wygląda tak:
1, -2, 1
-2, 5, -2
1, -2, 1
Teraz postanowiłem przenieść program do C# (to mój pierwszy kontakt z C#, ale postanowiłem trochę się nauczyć z tego języka). Coś jednak jest nie tak w moim kodzie, co powoduje, że nowe wartości co chwile wyskakują powyżej 255. Byłbym bardzo wdzięczny, jeśli ktoś by znalazł błąd w moim rozumowaniu.
Windows Forms:
namespace Testing
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Bitmapa bitmap = new Bitmapa();
pictureBox1.Image = bitmap.bitmapIt();
pictureBox1.SizeMode = PictureBoxSizeMode.Normal;
}
}
}
Zaraz pod tym znajduje się klasa odpowiedzialna za operacje na bitmapie:
/*
* Class responsible for creating and modyfying bitmap.
*/
class Bitmapa
{
Bitmap image = new Bitmap(Bitmap.FromFile("../av.bmp"));
public Bitmap bitmapIt()
{
int[,] mask = generateMask(); //generating 3x3 mask
for (int x = 1; x < image.Width-1; x++)
{
for (int y = 1; y < image.Height-1; y++)
{
int newR = 0, newG = 0, newB = 0;
Color[,] pixels = generatePixels(image, x, y);
for (int a = 0; a < 3; a++)
{
for (int b = 0; b < 3; b++)
{
newR += mask[a, b] * pixels[a, b].R;
newG += mask[a, b] * pixels[a, b].G;
newB += mask[a, b] * pixels[a, b].B;
}
}
//debugger tu pokazuje błąd jako, że pobiera inty większe od 255
Color newColor = Color.FromArgb(255, Math.Abs(newR), Math.Abs(newG), Math.Abs(newB));
image.SetPixel(x, y, newColor);
}
}
return image;
}
public Color[,] generatePixels(Bitmap image, int x, int y)
{
Color [,]pixelsColor = new Color[3, 3];
for (int a = 0; a < 3; a++)
{
for (int b = 0; b < 3; b++)
{
pixelsColor[a, b] = image.GetPixel(x-1+a, y-1+b);
}
}
return pixelsColor;
}
public int[,] generateMask()
{
int[,] pixelsMask = new int[3, 3] { {1, -2, 1}, {-2, 5, -2}, {1, -2, 1} };
return pixelsMask;
}
}
BTW. Potrzebuje zrobić ten program na razie w C#, żeby zrozumieć zasadę i działanie. Potem procedurę wyostrzania mam zrobić w asemblerze i porównać czasy wykonania tych programów. I tu też mi się przyda C#, bo GUI i wczytywanie będę dalej wykonywał w C#, a tylko algorytm wyostrzania będzie miał miejsce w procedurze asemblerowej.