我正在从事一个ASP.NetCore 5项目,该项目要求用户使用普通的文件 Select 器上载文档,因此我必须先判断用户正在上载的文档是否模糊,然后再对其重新采样并将其保存到数据库.

我做了一些研究,发现imagemagick.net将帮助我完成所有这些,但似乎无法找到解决方法

推荐答案

我只是在谷歌上搜索了一下,然后在Stackoverflow/Blog上找到了一些答案:

public static class ImageExtensions
{
  // as seen here: https://pyimagesearch.com/2015/09/07/blur-detection-with-opencv/
  public static bool IsBlurry(this Image image, double threshold = 100.0)
  {
    var mat = GetMatFromSDImage(image);
    var varianceOfLaplacian = VarianceOfLaplacian(mat);
    return varianceOfLaplacian < threshold;
  }


  // as seen here: https://stackoverflow.com/questions/58005091/how-to-get-the-variance-of-laplacian-in-c-sharp
  private static double VarianceOfLaplacian(Mat mat)
  {
    using var laplacian = new Mat();
    CvInvoke.Laplacian(mat, laplacian, DepthType.Cv64F);
    var mean = new MCvScalar();
    var stddev = new MCvScalar();
    CvInvoke.MeanStdDev(laplacian, ref mean, ref stddev);
    return stddev.V0 * stddev.V0;
  }

  // as found here https://stackoverflow.com/questions/40384487/system-drawing-image-to-emgu-cv-mat
  private static Mat GetMatFromSDImage(Image image)
  {
    int stride = 0;
    Bitmap bmp = new Bitmap(image);

    System.Drawing.Rectangle rect = new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height);
    System.Drawing.Imaging.BitmapData bmpData = bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, bmp.PixelFormat);

    System.Drawing.Imaging.PixelFormat pf = bmp.PixelFormat;
    if (pf == System.Drawing.Imaging.PixelFormat.Format32bppArgb)
    {
      stride = bmp.Width * 4;
    }
    else
    {
      stride = bmp.Width * 3;
    }

    Image<Bgra, byte> cvImage = new Image<Bgra, byte>(bmp.Width, bmp.Height, stride, (IntPtr)bmpData.Scan0);

    bmp.UnlockBits(bmpData);

    return cvImage.Mat;
  }
}

我注意到了代码片段的来源,因为我在这里没有实现任何东西;)它确实需要Emgu.CV包不是imagemagick.

我希望这能有所帮助,它通过了几次测试,我只是做到了.

Csharp相关问答推荐

C#将参数传递给具有变化引用的变量

总是丢弃返回的任务和使方法puc无效之间有区别吗?

注册通用工厂的C# Dep注入

实体核心框架--HasColumnType和HasPrecision有什么不同?

dotnet集合中内部数组的局部变量副本的用途是什么?'

与C#中的Zip列表并行

XUNIT是否使用测试数据的源生成器?

C#和ASP.NET核心标识:提高GetUserAsync调用的性能

如何向事件添加成员

HelperText属性不支持复杂内容(混合C#和标记)

RX操作员使用先前值进行扫描,信号来自值本身

Postgres ENUM类型在第一次运行时对Dapper不可见

当try 测试具有协变返回类型的抽象属性时,类似功能引发System.ArgumentException

用于请求用户返回列表的C#Google API

从HTML元素获取 colored颜色

如何读取TagHelper属性的文本值?

使用DI实例化带有动态参数的服务?

缩写的MonthNames有问题

将带有嵌套If-Else的Foreach循环转换为Linq表达式

如何提高C#中比较大 struct 的性能?