12 public static partial class ConvolutionOperations
22 float Sum = Kernel.Sum();
24 if (Sum != 1 && Sum != 0)
26 Kernel = Kernel.Copy();
27 Kernel.ScalarDivision(Sum);
30 int KernelY, KernelHeight = Kernel.
Height;
31 int KernelX, KernelWidth = Kernel.
Width;
32 int KernelOffset = Kernel.
Start;
33 int KernelSkip = Kernel.
Skip;
34 float[] KernelData = Kernel.
Data;
35 int ResultWidth = M.Width - KernelWidth + 1;
36 int ResultHeight = M.Height - KernelHeight + 1;
40 for (KernelY = 0; KernelY < KernelHeight; KernelY++, KernelOffset += KernelSkip)
42 for (KernelX = 0; KernelX < KernelWidth; KernelX++)
44 Scalar = KernelData[KernelOffset++];
47 Result.WeightedAddition(M.
Region(KernelX, KernelY, ResultWidth, ResultHeight), Scalar);
62 float Sum = Kernel.Sum();
64 if (Sum != 1 && Sum != 0)
67 return M.Convolute(KernelF);
70 int KernelY, KernelHeight = Kernel.
Height;
71 int KernelX, KernelWidth = Kernel.
Width;
72 int KernelOffset = Kernel.
Start;
73 int KernelSkip = Kernel.
Skip;
74 int[] KernelData = Kernel.
Data;
75 int ResultWidth = M.Width - KernelWidth + 1;
76 int ResultHeight = M.Height - KernelHeight + 1;
80 for (KernelY = 0; KernelY < KernelHeight; KernelY++, KernelOffset += KernelSkip)
82 for (KernelX = 0; KernelX < KernelWidth; KernelX++)
84 Scalar = KernelData[KernelOffset++];
87 Result.WeightedAddition(M.
Region(KernelX, KernelY, ResultWidth, ResultHeight), Scalar);
102 long Sum = Kernel.Sum();
103 if (Sum >
int.MaxValue)
104 throw new ArgumentException(
"Sum of kernel too big.", nameof(Kernel));
106 int KernelY, KernelHeight = Kernel.
Height;
107 int KernelX, KernelWidth = Kernel.
Width;
108 int KernelOffset = Kernel.
Start;
109 int KernelSkip = Kernel.
Skip;
110 int[] KernelData = Kernel.
Data;
111 int ResultWidth = M.Width - KernelWidth + 1;
112 int ResultHeight = M.Height - KernelHeight + 1;
113 Matrix<int> Result =
new(ResultWidth, ResultHeight);
116 for (KernelY = 0; KernelY < KernelHeight; KernelY++, KernelOffset += KernelSkip)
118 for (KernelX = 0; KernelX < KernelWidth; KernelX++)
120 Scalar = KernelData[KernelOffset++];
123 Result.WeightedAddition(M.
Region(KernelX, KernelY, ResultWidth, ResultHeight), Scalar);
127 if (Sum != 0 && Sum != 1)
128 Result.ScalarDivision((
int)Sum);
141 float Sum = Kernel.Sum();
143 if (Sum != 1 && Sum != 0)
145 Kernel = Kernel.Copy();
146 Kernel.ScalarDivision(Sum);
149 int KernelY, KernelHeight = Kernel.
Height;
150 int KernelX, KernelWidth = Kernel.
Width;
151 int KernelOffset = Kernel.
Start;
152 int KernelSkip = Kernel.
Skip;
153 float[] KernelData = Kernel.
Data;
154 int ResultWidth = M.Width - KernelWidth + 1;
155 int ResultHeight = M.Height - KernelHeight + 1;
159 for (KernelY = 0; KernelY < KernelHeight; KernelY++, KernelOffset += KernelSkip)
161 for (KernelX = 0; KernelX < KernelWidth; KernelX++)
163 Scalar = KernelData[KernelOffset++];
166 Result.WeightedAddition(M.
Region(KernelX, KernelY, ResultWidth, ResultHeight), Scalar);
170 float[] Data = Result.
Data;
171 int i, c = Data.Length;
172 int[] DataFixed =
new int[c];
174 for (i = 0; i < c; i++)
175 DataFixed[i] = (
int)(Data[i] + 0.5f);
177 return new Matrix<int>(ResultWidth, ResultHeight, DataFixed);
189 return M.Convolute(K2);
191 return M.Convolute(K3);
193 throw new ArgumentException(
"Unsupported type: " + Kernel.GetType().FullName, nameof(Kernel));
205 return M.Convolute(K2);
207 return M.Convolute(K3);
209 throw new ArgumentException(
"Unsupported type: " + Kernel.GetType().FullName, nameof(Kernel));
225 throw new ArgumentException(
"Unsupported type: " + M.GetType().FullName, nameof(M));
Implements a Matrix, basic component for computations in Image Processing and Computer Vision.
int Height
Height of matrix (number of rows)
T[] Data
Underlying data on which the matrix is defined.
int Width
Width of matrix (number of columns)
Matrix< T > Region(int Left, int Top, int Width, int Height)
Returns a region of the matrix, as a new matrix.
int Skip
Number of elements to skip from the right edge in the underlying data to the left edge of the new row...
int Start
Start offset of matrix in underlying data.