Advertisement
Guest User

Untitled

a guest
Dec 19th, 2014
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.19 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using System.Xml.Schema;
  8.  
  9. namespace FeatureDetectionLib
  10. {
  11. public static class Algo
  12. {
  13. public static float[,] CalculateGaussianFilter(int _size, float _sig)
  14. {
  15. int d = _size / 2;
  16.  
  17. var result = new float[_size, _size];
  18.  
  19. for (int i = -d; i <= d; i++)
  20. {
  21. for (int j = -d; j <= d; j++)
  22. {
  23. result[i + d, j + d] = (float)((1 / (2 * Math.PI * Math.Pow(_sig, 2))) * Math.Exp(- (i * i + j * j) / (2 * _sig * _sig)));
  24. }
  25. }
  26.  
  27. return result;
  28. }
  29.  
  30. public static void SaveGaussianFilterToImage(float[,] _filter, string _path)
  31. {
  32. var img = new Bitmap(_filter.GetLength(1), _filter.GetLength(0));
  33.  
  34. var nfilter = Normalize(_filter, 255);
  35.  
  36. for (int i = 0; i < img.Width; i++)
  37. for (int j = 0; j < img.Height; j++)
  38. {
  39. var value = (byte)nfilter[i, j];
  40. var pixel = Color.FromArgb(value, value, value);
  41. img.SetPixel(i, j, pixel);
  42. }
  43.  
  44. img.Save(_path);
  45. }
  46.  
  47. public static float[,] Normalize(float[,] _matrix, float _max)
  48. {
  49. var max = float.MinValue;
  50. var min = float.MaxValue;
  51.  
  52. for (int i = 0; i < _matrix.GetLength(0); i++)
  53. for (int j = 0; j < _matrix.GetLength(1); j++)
  54. {
  55. if (_matrix[i, j] > max)
  56. max = _matrix[i, j];
  57. if (_matrix[i, j] < min)
  58. min = _matrix[i, j];
  59. }
  60.  
  61. var result = new float[_matrix.GetLength(0), _matrix.GetLength(1)];
  62. for (int i = 0; i < _matrix.GetLength(0); i++)
  63. for (int j = 0; j < _matrix.GetLength(1); j++)
  64. result[i, j] = (byte)((_matrix[i, j] - min) / (max - min) * _max);
  65.  
  66. return result;
  67. }
  68.  
  69. public static float[,] Convolution(float[,] _matrix, float[,] _ker)
  70. {
  71. var hdelta = (_ker.GetLength(0) - 1) / 2;
  72. var wdelta = (_ker.GetLength(1) - 1) / 2;
  73.  
  74. var tmpmatrix = new float
  75. [_matrix.GetLength(0) + _ker.GetLength(0) - 1,
  76. _matrix.GetLength(1) + _ker.GetLength(1) - 1];
  77.  
  78. for (int i = 0; i < _matrix.GetLength(0); i++)
  79. {
  80. for (int j = 0; j < _matrix.GetLength(1); j++)
  81. {
  82. tmpmatrix[hdelta + i, wdelta + j] = _matrix[i, j];
  83. }
  84. }
  85.  
  86. for (int i = 0; i < hdelta; i++)
  87. {
  88. for (int j = 0; j < wdelta; j++)
  89. {
  90. tmpmatrix[i, j] = _matrix[0, 0];
  91. tmpmatrix[i, _matrix.GetLength(1) + j + wdelta] = _matrix[0, _matrix.GetLength(1) - 1];
  92. }
  93. }
  94.  
  95. for (int i = _matrix.GetLength(0) + hdelta; i < _matrix.GetLength(0) + hdelta * 2; i++)
  96. {
  97. for (int j = 0; j < wdelta; j++)
  98. {
  99. tmpmatrix[i, j] = _matrix[0, 0];
  100. tmpmatrix[i, _matrix.GetLength(1) + j + wdelta] = _matrix[0, _matrix.GetLength(1) - 1];
  101. }
  102. }
  103.  
  104. for (int i = 0; i < _matrix.GetLength(0); i++)
  105. {
  106. for (int j = 0; j < wdelta; j++)
  107. {
  108. tmpmatrix[i + hdelta, j] = _matrix[i, 0];
  109. tmpmatrix[i + hdelta, _matrix.GetLength(1) + j + wdelta] = _matrix[i, _matrix.GetLength(1) - 1];
  110. }
  111. }
  112.  
  113. for (int i = 0; i < wdelta; i++)
  114. {
  115. for (int j = 0; j < _matrix.GetLength(1); j++)
  116. {
  117. tmpmatrix[i, j + wdelta] = _matrix[i, 0];
  118. tmpmatrix[_matrix.GetLength(0) + i + hdelta, j + wdelta] = _matrix[_matrix.GetLength(0) - 1, j];
  119. }
  120. }
  121.  
  122. var r = new float[_matrix.GetLength(0), _matrix.GetLength(1)];
  123.  
  124. for (int i = 0; i < _matrix.GetLength(0); i++)
  125. {
  126. for (int j = 0; j < _matrix.GetLength(1); j++)
  127. {
  128. var sum = 0.0f;
  129. for (int k = 0; k < _ker.GetLength(0); k++)
  130. for (int l = 0; l < _ker.GetLength(1); l++)
  131. sum += tmpmatrix[i + k, j + l] * _ker[k, l];
  132. r[i, j] = sum;
  133. }
  134. }
  135.  
  136. return r;
  137. }
  138.  
  139. public static float[,] LoadMatrixFromFile(string _path)
  140. {
  141. var img = (Bitmap)Bitmap.FromFile(_path);
  142.  
  143. var result = new float[img.Width, img.Height];
  144.  
  145. for (int i = 0; i < img.Width; i++)
  146. for (int j = 0; j < img.Height; j++)
  147. {
  148. var value = img.GetPixel(i, j);
  149. result[i, j] = (value.R + value.G + value.B)/3.0f;
  150. }
  151.  
  152. return result;
  153. }
  154.  
  155. public static void SaveMatrixToFile(float[,] _matrix, string _path)
  156. {
  157. var img = new Bitmap(_matrix.GetLength(1), _matrix.GetLength(0));
  158.  
  159. var nmatrix = Normalize(_matrix, 255);
  160.  
  161. for (int i = 0; i < img.Width; i++)
  162. for (int j = 0; j < img.Height; j++)
  163. {
  164. var value = (byte)nmatrix[i, j];
  165. var pixel = Color.FromArgb(value, value, value);
  166. img.SetPixel(i, j, pixel);
  167. }
  168.  
  169. img.Save(_path);
  170. }
  171.  
  172. public static float[,] MatrixSubtraction(float[,] _fst, float[,] _snd)
  173. {
  174. var result = new float[_fst.GetLength(0), _fst.GetLength(1)];
  175.  
  176. for (int i = 0; i < _fst.GetLength(0); i++)
  177. for (int j = 0; j < _fst.GetLength(1); j++)
  178. result[i, j] = _fst[i,j] - _snd[i,j];
  179. return result;
  180. }
  181. }
  182. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement