我正在从事一个ASP.NetCore 5
项目,该项目要求用户使用普通的文件 Select 器上载文档,因此我必须先判断用户正在上载的文档是否模糊,然后再对其重新采样并将其保存到数据库.
我做了一些研究,发现imagemagick.net将帮助我完成所有这些,但似乎无法找到解决方法
我正在从事一个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.
我希望这能有所帮助,它通过了几次测试,我只是做到了.