public Bitmap ColorToGrayScale(Bitmap src) { ImageUtils image = new ImageUtils(); var buffer = image.BitmapToBytes(src); var rgb = 0.0; for (int i = 0; i < buffer.Length; i += 4) { rgb = buffer[i] * .3f; rgb += buffer[i + 1] * .6f; rgb += buffer[i + 2] * .1f; buffer[i] = (byte)rgb; buffer[i + 1] = buffer[i]; buffer[i + 2] = buffer[i]; buffer[i + 3] = 255; } return(image.BytesToBitmap(buffer)); }
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)); }
public static Bitmap ApplySodel(Bitmap srcImage) { var xkernel = xSobel; var ykernel = ySobel; ImageUtils image = new ImageUtils(); var buffer = image.BitmapToBytes(srcImage); var width = image.Width; var height = image.Height; var bytes = image.Bytes; var result = new byte[bytes]; directions = new double[bytes / 4]; resultBuf = new byte[bytes / 4]; xGradients = new double[bytes / 4]; yGradients = new double[bytes / 4]; var rgb = 0.0; for (int i = 0; i < buffer.Length; i += 4) { rgb = buffer[i] * .3f; rgb += buffer[i + 1] * .6f; rgb += buffer[i + 2] * .1f; buffer[i] = (byte)rgb; buffer[i + 1] = buffer[i]; buffer[i + 2] = buffer[i]; buffer[i + 3] = 255; } var x = 0.0; var y = 0.0; var results = 0.0; var filterOffset = 1; var calcOffset = 0; var byteOffset = 0; for (var offsetY = filterOffset; offsetY < height - filterOffset; ++offsetY) { for (var offsetX = filterOffset; offsetX < width - filterOffset; ++offsetX) { x = y = 0; results = 0.0; byteOffset = offsetY * 4 * width + offsetX * 4; for (var filterY = -filterOffset; filterY <= filterOffset; filterY++) { for (var filterX = -filterOffset; filterX <= filterOffset; filterX++) { calcOffset = byteOffset + filterX * 4 + filterY * 4 * width; x += (double)(buffer[calcOffset]) * xkernel[filterY + filterOffset, filterX + filterOffset]; y += (double)(buffer[calcOffset]) * ykernel[filterY + filterOffset, filterX + filterOffset]; } } xGradients[byteOffset / 4] = x; yGradients[byteOffset / 4] = y; results += Math.Sqrt((x * x) + (y * y)); if (results > 255) { results = 255; } else if (results < 0) { results = 0; } if (x != 0) { var dirNotNorm = 57.29 * 1.0 / Math.Tan(y / x); if (Math.Tan(y / x) == 0) { directions[byteOffset / 4] = 0; } else { directions[byteOffset / 4] = NormalizeDirection(dirNotNorm); } } else { directions[byteOffset / 4] = 0; } resultBuf[byteOffset / 4] = (byte)results; result[byteOffset] = (byte)(results); result[byteOffset + 1] = (byte)(results); result[byteOffset + 2] = (byte)(results); result[byteOffset + 3] = 255; } } return(image.BytesToBitmap(result)); }