【问题标题】:Sharpen filter - no effect锐化滤镜 - 没有效果
【发布时间】:2017-01-03 09:23:21
【问题描述】:

以下例程仅用于锐化 8 位索引灰度。

这段代码似乎对输入图像没有任何影响。也就是说,进去的是什么,出来的都是一样的。

如果我增加strength 的值,图像似乎会变暗,但从未过滤过。

可能出了什么问题?

我正在使用以下内核,

double[,] _numericalKernel = new double[,] 
                             { { -1, -1, -1, }, 
                               { -1,  9, -1, }, 
                               { -1, -1, -1, }, };

以下是我的锐化源代码,

    public static Bitmap NonfftSharpen(Bitmap image, double[,] mask, double strength)
    {
        Bitmap bitmap = (Bitmap)image.Clone();

        if (bitmap != null)
        {
            int width = bitmap.Width;
            int height = bitmap.Height;

            if (mask.GetLength(0) != mask.GetLength(1))
            {
                throw new Exception("_numericalKernel dimensions must be same");
            }
            // Create sharpening filter.
            int filterSize = mask.GetLength(0);

            double[,] filter = (double[,])mask.Clone();

            int channels = sizeof(byte);
            double bias = 1.0 - strength;
            double factor = strength / 16.0;
            int halfOfFilerSize = filterSize / 2;

            byte[,] result = new byte[bitmap.Width, bitmap.Height];

            // Lock image bits for read/write.

            BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, width, height),
                                                        ImageLockMode.ReadWrite,
                                                        PixelFormat.Format8bppIndexed);

            // Declare an array to hold the bytes of the bitmap.
            int memorySize = bitmapData.Stride * height;
            byte[] memory = new byte[memorySize];

            // Copy the RGB values into the local array.
            Marshal.Copy(bitmapData.Scan0, memory, 0, memorySize);

            int rgb;
            // Fill the color array with the new sharpened color values.

            for (int y = halfOfFilerSize; y < height - halfOfFilerSize; y++)
            {
                for (int x = halfOfFilerSize; x < width - halfOfFilerSize; x++)
                {
                    for (int filterY = 0; filterY < filterSize; filterY++)
                    {
                        double grayShade = 0.0;

                        for (int filterX = 0; filterX < filterSize; filterX++)
                        {
                            int imageX = (x - halfOfFilerSize + filterX + width) % width;
                            int imageY = (y - halfOfFilerSize + filterY + height) % height;

                            rgb = imageY * bitmapData.Stride + channels * imageX;

                            grayShade += memory[rgb + 0] * filter[filterX, filterY];
                        }

                        rgb = y * bitmapData.Stride + channels * x;

                        int b = Math.Min(Math.Max((int)(factor * grayShade + (bias * memory[rgb + 0])), 0), 255);

                        result[x, y] = (byte)b;
                    }
                }
            }

            // Update the image with the sharpened pixels.
            for (int x = halfOfFilerSize; x < width - halfOfFilerSize; x++)
            {
                for (int y = halfOfFilerSize; y < height - halfOfFilerSize; y++)
                {
                    rgb = y * bitmapData.Stride + channels * x;

                    memory[rgb + 0] = result[x, y];
                }
            }

            // Copy the RGB values back to the bitmap.
            Marshal.Copy(memory, 0, bitmapData.Scan0, memorySize);

            // Release image bits.
            bitmap.UnlockBits(bitmapData);

            return bitmap;

        }
        else
        {
            throw new Exception("input image can't be null");
        }
    }

【问题讨论】:

  • 嗯,现在哪个:过滤器是什么都不做还是参数变暗结果?
  • @TaW,过滤器什么都不做。 strength 只会改变输出图像的暗度,实际上从未过滤过。
  • 嗯,这不是什么,只是不是你想要的。掩码输入值是什么?

标签: c# image-processing filter bitmap convolution


【解决方案1】:

我对您的功能进行了一些更改以使其正常工作。 注意强度参数对我的功能没有影响。您可以使用偏差和因子值来获得亮度等不同的结果。

    public static Bitmap NonfftSharpen(Bitmap image, double[,] mask, double strength)
    {
        Bitmap bitmap = (Bitmap)image.Clone();

        if (bitmap != null)
        {
            int width = bitmap.Width;
            int height = bitmap.Height;

            if (mask.GetLength(0) != mask.GetLength(1))
            {
                throw new Exception("_numericalKernel dimensions must be same");
            }
            // Create sharpening filter.
            int filterSize = mask.GetLength(0);

            double[,] filter = (double[,])mask.Clone();

            int channels = sizeof(byte);
            double bias = 0.0; // 1.0 - strength;
            double factor = 1.0; // strength / 16.0;

            byte[,] result = new byte[bitmap.Width, bitmap.Height];

            // Lock image bits for read/write.

            BitmapData bitmapData = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, width, height),
                                                        ImageLockMode.ReadWrite,
                                                        System.Drawing.Imaging.PixelFormat.Format8bppIndexed);

            // Declare an array to hold the bytes of the bitmap.
            int memorySize = bitmapData.Stride * height;
            byte[] memory = new byte[memorySize];

            // Copy the RGB values into the local array.
            Marshal.Copy(bitmapData.Scan0, memory, 0, memorySize);

            int pixel;
            // Fill the color array with the new sharpened color values.

            for (int y = 0; y < height; y++)
            {
                for (int x = 0; x < width; x++)
                {
                    double grayShade = 0.0;

                    for (int filterY = 0; filterY < filterSize; filterY++)
                    {


                        for (int filterX = 0; filterX < filterSize; filterX++)
                        {

                            int imageX = (x - filterSize / 2 + filterX + width) % width;
                            int imageY = (y - filterSize / 2 + filterY + height) % height;

                            pixel = imageY * bitmapData.Stride + channels * imageX;
                            grayShade += memory[pixel] * filter[filterX, filterY];

                        }

                        int newPixel = Math.Min(Math.Max((int)(factor * grayShade + bias), 0), 255);

                        result[x, y] = (byte)newPixel;
                    }
                }
            }

            // Update the image with the sharpened pixels.
            for (int x = 0; x < width; x++)
            {
                for (int y = 0; y < height; y++)
                {
                    pixel = y * bitmapData.Stride + channels * x;

                    memory[pixel] = result[x, y];
                }
            }

            // Copy the values back to the bitmap.
            Marshal.Copy(memory, 0, bitmapData.Scan0, memorySize);

            // Release image bits.
            bitmap.UnlockBits(bitmapData);

            return bitmap;

        }
        else
        {
            throw new Exception("input image can't be null");
        }
    }

我希望这能让你继续前进 :) 问候

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多