// 引数で渡されたビットマップ画像にガウシアンフィルタを適用します public static Bitmap Apply(Bitmap source, int size = 3) { // ビットマップ画像から全てのピクセルを抜き出す PixelManipulator s = PixelManipulator.LoadBitmap(source); PixelManipulator d = s.Clone(); // 範囲チェック if (size < 3) { size = 3; } if (size > 15) { size = 15; } size--; size /= 2; // カーネルを作成する float[] kernel = _CreateGaussianKernel(size); // 全てのピクセルを巡回する s.EachPixel((x, y) => { byte r = _GaussianBlur(kernel, s.RangeR(x, y, size)); byte g = _GaussianBlur(kernel, s.RangeG(x, y, size)); byte b = _GaussianBlur(kernel, s.RangeB(x, y, size)); d.SetPixel(x, y, r, g, b); }); // 新しいビットマップ画像を作成して、ピクセルをセットする return(d.CreateBitmap()); }
// 引数で渡されたビットマップ画像にメディアンフィルタを適用します public static Bitmap Apply(Bitmap source, int size = 3) { // ビットマップ画像から全てのピクセルを抜き出す PixelManipulator s = PixelManipulator.LoadBitmap(source); PixelManipulator d = s.Clone(); // 範囲チェック if (size < 3) { size = 3; } if (size > 9) { size = 9; } size--; size /= 2; // 全てのピクセルを巡回する s.EachPixel((x, y) => { byte r = _Median(s.RangeR(x, y, size)); byte g = _Median(s.RangeG(x, y, size)); byte b = _Median(s.RangeB(x, y, size)); d.SetPixel(x, y, r, g, b); }); // 新しいビットマップ画像を作成して、ピクセルをセットする return(d.CreateBitmap()); }
public RGBChannels ApplyPixelOperation(RGBChannels image, PixelOperation type, int threshold = 120, string channel = "G") { if (pixelManipulator == null) { pixelManipulator = PixelManipulator.Instance(); } RGBChannels output = image; switch (type) { case PixelOperation.HalveValues: output = pixelManipulator.HalveValues(image); break; case PixelOperation.InvertValues: output = pixelManipulator.InvertValues(image); break; case PixelOperation.ThresholdValues: output = pixelManipulator.ThresholdValues(image, threshold); break; case PixelOperation.SetChannelsToZero: output = pixelManipulator.SetChannelsToZeroExcept(image, channel); break; } return(output); }
public static PixelManipulator Instance() { if (_instance == null) { lock (instancelock) { if (_instance == null) { _instance = new PixelManipulator(); } } } return(_instance); }
// PixelManipulator をコピーする public PixelManipulator Clone(bool copyBytes = false) { PixelManipulator result = new PixelManipulator(); result.width = width; result.height = height; result.stride = stride; result.pixelSize = pixelSize; result.bytes = new byte[bytes.Length]; if (copyBytes) { Array.Copy(bytes, result.bytes, bytes.Length); } return(result); }
// Bitmap オブジェクトから PixelManipulator を作成する public static PixelManipulator LoadBitmap(Bitmap bitmap) { if (bitmap == null) { return(null); } PixelManipulator result = new PixelManipulator(); result.width = bitmap.Width; result.height = bitmap.Height; result.stride = _GetScanLineSize(bitmap, result.pixelFormat); result.pixelSize = Image.GetPixelFormatSize(result.pixelFormat) / 8; result.bytes = _GetPixels(bitmap, result.pixelFormat); return(result); }