static float[, ][,] matrix_der2(GrayscaleFloatImage image, float sigma) { float[, ][,] out_matr = new float[image.Width, image.Height][, ]; float[,] Gxx = g_kernel(sigma, "xx"); float[,] Gxy = g_kernel(sigma, "xy"); float[,] Gyy = g_kernel(sigma, "yy"); int rad = (int)Math.Round(3 * sigma); GrayscaleFloatImage temp_image = img_expansion(image.ToColorFloatImage(), "odd", rad).ToGrayscaleFloatImage(); for (int y = rad; y < image.Height + rad; ++y) { for (int x = rad; x < image.Width + rad; ++x) { float[,] q = new float[2, 2]; for (int m = -rad; m <= rad; ++m) { for (int n = -rad; n <= rad; ++n) { q[0, 0] += temp_image[x + n, y + m] * Gxx[rad + n, rad + m]; q[0, 1] += temp_image[x + n, y + m] * Gxy[rad + n, rad + m]; q[1, 1] += temp_image[x + n, y + m] * Gyy[rad + n, rad + m]; } } q[1, 0] = q[0, 1]; out_matr[x - rad, y - rad] = q; } } return(out_matr); }
static GrayscaleFloatImage temp_func(GrayscaleFloatImage image, float sigma) { GrayscaleFloatImage out_matr = new GrayscaleFloatImage(image.Width, image.Height); float[,] Gxx = g_kernel(sigma, "yy"); //float[,] Gxy = g_kernel(sigma, "xy"); //float[,] Gyy = g_kernel(sigma, "yy"); int rad = (int)Math.Round(3 * sigma); GrayscaleFloatImage temp_image = img_expansion(image.ToColorFloatImage(), "odd", rad).ToGrayscaleFloatImage(); float common_sum = 0; for (int y = rad; y < image.Height + rad; ++y) { for (int x = rad; x < image.Width + rad; ++x) { float[,] q = new float[2, 2]; for (int m = -rad; m <= rad; ++m) { for (int n = -rad; n <= rad; ++n) { out_matr[x - rad, y - rad] += temp_image[x + n, y + m] * Gxx[rad + n, rad + m]; // q[0, 1] += temp_image[x + n, y + m] * Gxy[rad + n, rad + m]; // q[1, 1] += temp_image[x + n, y + m] * Gyy[rad + n, rad + m]; } } common_sum += out_matr[x - rad, y - rad]; } } Console.WriteLine(common_sum); float max_one = 0; float min_one = 0; for (int y = 0; y < image.Height; ++y) { for (int x = 0; x < image.Width; ++x) { //out_matr[x, y] += 128; if (out_matr[x, y] > max_one) { max_one = out_matr[x, y]; } if (out_matr[x, y] < min_one) { min_one = out_matr[x, y]; } } } min_one = -min_one; //if (min_one > max_one) // max_one = min_one; for (int y = 0; y < image.Height; ++y) { for (int x = 0; x < image.Width; ++x) { out_matr[x, y] *= 255 / max_one / 2; out_matr[x, y] += 128; } } return(out_matr); }