public Bitmap ApplyGabor(Bitmap sourceImage) { ImageUtils image = new ImageUtils(); var width = image.Width; var height = image.Height; var bytes = image.Bytes; var result = new byte[bytes]; var mid = (_size) / 2; var values = new double[width, height]; var kernel0 = CreateGaborFilter(0); var kernel45 = CreateGaborFilter(45); var kernel135 = CreateGaborFilter(135); var kernel90 = CreateGaborFilter(90); for (var y = 0; y < height; ++y) { for (var x = 0; x < width; ++x) { var gaborValue = 0.0; for (var fy = 0; fy < _size; ++fy) { for (var fx = 0; fx < _size; ++fx) { var value = 0.0; if (x + fx - mid >= 0 && x + fx - mid < width && y + fy - mid >= 0 && y + fy - mid < height) { value = HSV.HsvFromColor(sourceImage.GetPixel(x + fx - mid, y + fy - mid)).V; } else { value = HSV.HsvFromColor(sourceImage.GetPixel(x, y)).V; } gaborValue += kernel0[fy, fx] * value; gaborValue += kernel45[fy, fx] * value; gaborValue += kernel90[fy, fx] * value; gaborValue += kernel135[fy, fx] * value; } } values[x, y] = gaborValue; } } var max = values[0, 0]; var min = values[0, 0]; for (var y = 0; y < height; ++y) { for (var x = 0; x < width; ++x) { if (values[x, y] > max) { max = values[x, y]; } if (values[x, y] < min) { min = values[x, y]; } } } for (var y = 0; y < height; ++y) { for (var x = 0; x < width; ++x) { if (min < 0) { if (max >= 0) { values[x, y] -= min; values[x, y] /= -min + max; values[x, y] *= 100; } else { values[x, y] -= min; values[x, y] /= -min - max; values[x, y] *= 100; } } else { values[x, y] += min; values[x, y] /= min + max; values[x, y] *= 100; } } } for (var i = 0; i < bytes; i += 4) { HSV hsv = new HSV { H = 0, S = 0, V = values[(i / 4) % width, (i / 4) / width] }; hsv.ToColor(); result[i + 0] = hsv.ToColor().R; result[i + 1] = hsv.ToColor().G; result[i + 2] = hsv.ToColor().B; result[i + 3] = 255; } return(image.BytesToBitmap(result)); }