Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Xml.Schema;
- namespace FeatureDetectionLib
- {
- public static class Algo
- {
- public static float[,] CalculateGaussianFilter(int _size, float _sig)
- {
- int d = _size / 2;
- var result = new float[_size, _size];
- for (int i = -d; i <= d; i++)
- {
- for (int j = -d; j <= d; j++)
- {
- result[i + d, j + d] = (float)((1 / (2 * Math.PI * Math.Pow(_sig, 2))) * Math.Exp(- (i * i + j * j) / (2 * _sig * _sig)));
- }
- }
- return result;
- }
- public static void SaveGaussianFilterToImage(float[,] _filter, string _path)
- {
- var img = new Bitmap(_filter.GetLength(1), _filter.GetLength(0));
- var nfilter = Normalize(_filter, 255);
- for (int i = 0; i < img.Width; i++)
- for (int j = 0; j < img.Height; j++)
- {
- var value = (byte)nfilter[i, j];
- var pixel = Color.FromArgb(value, value, value);
- img.SetPixel(i, j, pixel);
- }
- img.Save(_path);
- }
- public static float[,] Normalize(float[,] _matrix, float _max)
- {
- var max = float.MinValue;
- var min = float.MaxValue;
- for (int i = 0; i < _matrix.GetLength(0); i++)
- for (int j = 0; j < _matrix.GetLength(1); j++)
- {
- if (_matrix[i, j] > max)
- max = _matrix[i, j];
- if (_matrix[i, j] < min)
- min = _matrix[i, j];
- }
- var result = new float[_matrix.GetLength(0), _matrix.GetLength(1)];
- for (int i = 0; i < _matrix.GetLength(0); i++)
- for (int j = 0; j < _matrix.GetLength(1); j++)
- result[i, j] = (byte)((_matrix[i, j] - min) / (max - min) * _max);
- return result;
- }
- public static float[,] Convolution(float[,] _matrix, float[,] _ker)
- {
- var hdelta = (_ker.GetLength(0) - 1) / 2;
- var wdelta = (_ker.GetLength(1) - 1) / 2;
- var tmpmatrix = new float
- [_matrix.GetLength(0) + _ker.GetLength(0) - 1,
- _matrix.GetLength(1) + _ker.GetLength(1) - 1];
- for (int i = 0; i < _matrix.GetLength(0); i++)
- {
- for (int j = 0; j < _matrix.GetLength(1); j++)
- {
- tmpmatrix[hdelta + i, wdelta + j] = _matrix[i, j];
- }
- }
- for (int i = 0; i < hdelta; i++)
- {
- for (int j = 0; j < wdelta; j++)
- {
- tmpmatrix[i, j] = _matrix[0, 0];
- tmpmatrix[i, _matrix.GetLength(1) + j + wdelta] = _matrix[0, _matrix.GetLength(1) - 1];
- }
- }
- for (int i = _matrix.GetLength(0) + hdelta; i < _matrix.GetLength(0) + hdelta * 2; i++)
- {
- for (int j = 0; j < wdelta; j++)
- {
- tmpmatrix[i, j] = _matrix[0, 0];
- tmpmatrix[i, _matrix.GetLength(1) + j + wdelta] = _matrix[0, _matrix.GetLength(1) - 1];
- }
- }
- for (int i = 0; i < _matrix.GetLength(0); i++)
- {
- for (int j = 0; j < wdelta; j++)
- {
- tmpmatrix[i + hdelta, j] = _matrix[i, 0];
- tmpmatrix[i + hdelta, _matrix.GetLength(1) + j + wdelta] = _matrix[i, _matrix.GetLength(1) - 1];
- }
- }
- for (int i = 0; i < wdelta; i++)
- {
- for (int j = 0; j < _matrix.GetLength(1); j++)
- {
- tmpmatrix[i, j + wdelta] = _matrix[i, 0];
- tmpmatrix[_matrix.GetLength(0) + i + hdelta, j + wdelta] = _matrix[_matrix.GetLength(0) - 1, j];
- }
- }
- var r = new float[_matrix.GetLength(0), _matrix.GetLength(1)];
- for (int i = 0; i < _matrix.GetLength(0); i++)
- {
- for (int j = 0; j < _matrix.GetLength(1); j++)
- {
- var sum = 0.0f;
- for (int k = 0; k < _ker.GetLength(0); k++)
- for (int l = 0; l < _ker.GetLength(1); l++)
- sum += tmpmatrix[i + k, j + l] * _ker[k, l];
- r[i, j] = sum;
- }
- }
- return r;
- }
- public static float[,] LoadMatrixFromFile(string _path)
- {
- var img = (Bitmap)Bitmap.FromFile(_path);
- var result = new float[img.Width, img.Height];
- for (int i = 0; i < img.Width; i++)
- for (int j = 0; j < img.Height; j++)
- {
- var value = img.GetPixel(i, j);
- result[i, j] = (value.R + value.G + value.B)/3.0f;
- }
- return result;
- }
- public static void SaveMatrixToFile(float[,] _matrix, string _path)
- {
- var img = new Bitmap(_matrix.GetLength(1), _matrix.GetLength(0));
- var nmatrix = Normalize(_matrix, 255);
- for (int i = 0; i < img.Width; i++)
- for (int j = 0; j < img.Height; j++)
- {
- var value = (byte)nmatrix[i, j];
- var pixel = Color.FromArgb(value, value, value);
- img.SetPixel(i, j, pixel);
- }
- img.Save(_path);
- }
- public static float[,] MatrixSubtraction(float[,] _fst, float[,] _snd)
- {
- var result = new float[_fst.GetLength(0), _fst.GetLength(1)];
- for (int i = 0; i < _fst.GetLength(0); i++)
- for (int j = 0; j < _fst.GetLength(1); j++)
- result[i, j] = _fst[i,j] - _snd[i,j];
- return result;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement