Я следую этим инструкциям.Но мои результаты не выходят правильно.Я использую это ядро:
-1 -1 -1
-1 8 -1
-1 -1 -1
Так что это означает, что сумма для данной свертки будет между -8 и 8, при условии, что я уже нормализовал свой ввод (0-255 -> 0-1),Тогда я делаю свертку.Затем я обнаружил, что мой показатель в процентах находится между минимальным и максимальным значениями.Например, в этом ядре мой минимум равен -8, а максимум равен 8. Так что, если значение равно 0, это 50%, что составляет 255 * .5 = 127,5.Но это явно не правильно, и это дает в основном серое изображение.Части, которые не серые, по-прежнему монохромные, хотя я запускаю ядро для каждого канала отдельно.
static int EvaluateKernelAtPoint(Bitmap bitmap, Matrix<double> kernel, int x, int y, Func<int, int, int> onGetIntensity)
{
double sum = 0;
for (int a = 0; a < kernel.ColumnCount; a++)
{
for (int b = 0; b < kernel.RowCount; b++)
{
var xn = x + a - 1;
var yn = y + b - 1;
var intensity = (double)onGetIntensity(xn, yn); // returns R,G, or B color channel at that pixel
intensity /= 255; // intensity is 0-1
sum += intensity * kernel.At(a, b);
}
}
var result = (sum - (-8d)) / (8d - (-8d)); // find the % between the min and max of -8 and 8
result *= 255; // bring it back to 0-255
}