模糊而不是锐化

用户名

我正在使用以下内核,

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

以下代码似乎使输入图像模糊,而不是锐化。

这里的问题可能是什么?

这是整个VS2013解决方案

原始图片,

在此处输入图片说明

产生的模糊图像,

在此处输入图片说明

我编写了以下代码以锐化图像,

    public static Bitmap FftSharpen(Bitmap image, double [,] mask)
    {
        if (image.PixelFormat == PixelFormat.Format8bppIndexed)
        {
            Bitmap imageClone = (Bitmap)image.Clone();
            double[,] maskClone = (double[,])mask.Clone();

            Complex[,] cPaddedImage = ImageDataConverter.ToComplex(imageClone);
            Complex[,] cPaddedMask = ImageDataConverter.ToComplex(maskClone);
            Complex[,] cConvolved = Convolution.Convolve(cPaddedImage, cPaddedMask);

            return ImageDataConverter.ToBitmap(cConvolved);
        }
        else
        {
            throw new Exception("not a grascale");
        }
    }

聚苯乙烯

以下是我的卷积代码,

public static class Convolution
{
    public static Complex[,] Convolve(Complex[,] image, Complex[,] mask)
    {
        Complex[,] convolve = null;

        int imageWidth = image.GetLength(0);
        int imageHeight = image.GetLength(1);

        int maskWidth = mask.GetLength(0);
        int maskeHeight = mask.GetLength(1);

        if (imageWidth == maskWidth && imageHeight == maskeHeight)
        {
            FourierTransform ftForImage = new FourierTransform(image); ftForImage.ForwardFFT();
            FourierTransform ftForMask = new FourierTransform(mask); ftForMask.ForwardFFT();

            Complex[,] fftImage = ftForImage.FourierImageComplex;
            Complex[,] fftKernel = ftForMask.FourierImageComplex;

            Complex[,] fftConvolved = new Complex[imageWidth, imageHeight];


            for (int j = 0; j < imageHeight; j++)
            {
                for (int i = 0; i < imageWidth; i++)
                {
                    fftConvolved[i, j] = fftImage[i, j] * fftKernel[i, j];
                }
            }

            FourierTransform ftForConv = new FourierTransform();

            ftForConv.InverseFFT(fftConvolved);

            convolve = ftForConv.GrayscaleImageComplex;

            Rescale(convolve);

            convolve = FourierShifter.FFTShift(convolve);
        }
        else
        {
            throw new Exception("padding needed");
        }

        return convolve;
    }

    //Rescale values between 0 and 255.
    private static void Rescale(Complex[,] convolve)
    {
        int imageWidth = convolve.GetLength(0);
        int imageHeight = convolve.GetLength(1);

        double maxAmp = 0.0;
        for (int j = 0; j < imageHeight; j++)
        {
            for (int i = 0; i < imageWidth; i++)
            {
                maxAmp = Math.Max(maxAmp, convolve[i, j].Magnitude);
            }
        }
        double scale = 255.0 / maxAmp;

        for (int j = 0; j < imageHeight; j++)
        {
            for (int i = 0; i < imageWidth; i++)
            {
                convolve[i, j] = new Complex(convolve[i, j].Real * scale, convolve[i, j].Imaginary * scale);
                maxAmp = Math.Max(maxAmp, convolve[i, j].Magnitude);
            }
        }
    }
}
侦探眼

您的其他问题类似,从无符号获得内核Bitmap,从而得到有效的内核

255 255 255
255  9  255
255 255 255

而不是预期的

-1 -1 -1
-1  9 -1
-1 -1 -1

一种解决方法将再次是将位图转换为带符号的值另外,由于此问题中提供的代码也支持直接提供给的数字内核FftSharpen,因此您可以_numericalKernel使用:

public class MatrixPadder
{
  public static double[,] Pad(double[,] image, int newWidth, int newHeight)
  {
    int width = image.GetLength(0);
    int height = image.GetLength(1);
    /*
     It is always guaranteed that,

          width < newWidth

              and

          height < newHeight                  
     */
    if ((width < newWidth && height < newHeight)
          || (width < newWidth && height == newHeight)
          || (width == newWidth && height < newHeight))
    {
      double[,] paddedImage = new double[newWidth, newHeight];

      int startPointX = (int)Math.Ceiling((double)(newWidth - width) / (double)2) - 1;
      int startPointY = (int)Math.Ceiling((double)(newHeight - height) / (double)2) - 1;

      for (int y = startPointY; y < (startPointY + height); y++)
      {
        for (int x = startPointX; x < (startPointX + width); x++)
        {
          int xxx = x - startPointX;
          int yyy = y - startPointY;

          paddedImage[x, y] = image[xxx, yyy];
        }
      }

      return paddedImage;
    }
    else if (width == newWidth && height == newHeight)
    {
      return image;
    }
    else
    {
      throw new Exception("Pad() -- threw an exception");
    }
  }
}

您可以filterButton_Click使用以下方式致电

if (_convolutionType == ConvolutionType.FFT)
{
  double[,] paddedmask = MatrixPadder.Pad(_numericalKernel,
                                          _paddedImage.Width,
                                          _paddedImage.Height);
  sharpened = SharpenFilter.FftSharpen(_paddedImage, paddedmask);
}

然后按照我的其他答案所示调整Rescale功能然后应该会为您提供所需的锐化图像:

锐化

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

模糊而不是锐化

来自分类Dev

仅模糊不模糊图像而不是文本或其他

来自分类Dev

配置Angular以重新评估模糊而不是按键

来自分类Dev

锐化滤镜-无效果

来自分类Dev

卷积矩阵锐化滤镜

来自分类Dev

锐化(5%,10%,15%)

来自分类Dev

卷积矩阵锐化滤镜

来自分类Dev

锐化滤镜-无效果

来自分类Dev

仅模糊输入中的文本,而不是整个<input>元素

来自分类Dev

CSS 背景图像呈现模糊而不是完全

来自分类Dev

Monodevelop GTK锐化版3.0

来自分类Dev

使用OpenCV OCR锐化图像

来自分类Dev

使用OpenCV OCR锐化图像

来自分类Dev

Android对话框-自定义背景,而不是变暗或模糊

来自分类Dev

Material-UI选择器是否触发模糊而不是更改?

来自分类Dev

显示Rails错误页面而不是模糊的Heroku错误页面的方法

来自分类Dev

Windows终端,不可能是半透明的(不是模糊的)背景吗?

来自分类Dev

如何在CSS中锐化图像?

来自分类Dev

如何在OpenCV中锐化图像

来自分类Dev

在PHP中使用线性滤镜锐化图像

来自分类Dev

用Python编码的图像锐化算法

来自分类Dev

如何在opencv python中锐化边缘

来自分类Dev

如何使用CSS锐化更多div边框?

来自分类Dev

锐化后的锐利者Redgate过多记录

来自分类Dev

使用Action Script 3.0锐化图像吗?

来自分类Dev

锐化后AOP方法与异步的拦截方面

来自分类Dev

irfan锐化功能的替代方法是什么?

来自分类Dev

输入间隙模糊/模糊

来自分类Dev

我可以告诉Scala如何更喜欢特定的隐式而不是给出“模糊的隐式”错误吗?