C# 如何使用twain/emgu/open cv获得良好的清晰度?

C# 如何使用twain/emgu/open cv获得良好的清晰度?,c#,.net,opencv,emgucv,twain,C#,.net,Opencv,Emgucv,Twain,我正在使用扫描仪,并在使用其工具进行扫描时选择以下选项: ICM颜色校正(来源:爱普生标准,目标:sRGB) 反锐化遮罩(中等) 生成此图像的: 现在我的问题是-我实际上需要使用与扫描仪交互,当我这样做时,我得到的图像是: 旁白:我取消了前面提到的两个选项,用爱普生再次扫描,得到了一张与我所看到的非常相似的图像 所以我想,也许这些是我可以自己在图像上完成的后处理步骤(也许它们是在硬件中完成的,我不知道) 首先,我创建了一个应用ICM的扩展方法(我很难找到相关的文档,所以这有点猜测,也许我

我正在使用扫描仪,并在使用其工具进行扫描时选择以下选项:

  • ICM颜色校正(来源:爱普生标准,目标:sRGB)
  • 反锐化遮罩(中等)
生成此图像的:

现在我的问题是-我实际上需要使用与扫描仪交互,当我这样做时,我得到的图像是:

旁白:我取消了前面提到的两个选项,用爱普生再次扫描,得到了一张与我所看到的非常相似的图像

所以我想,也许这些是我可以自己在图像上完成的后处理步骤(也许它们是在硬件中完成的,我不知道)

首先,我创建了一个应用ICM的扩展方法(我很难找到相关的文档,所以这有点猜测,也许我马上就错了,但我从这里得到了信息:它似乎对图像产生了影响):

publicstaticimageapplyicm(
这个影像来源,,
字符串源ICM,
字符串目标(M)
其中TDepth:new()
{
var target=source.CopyBlank();
使用(来源)
{
使用(var b=source.Bitmap)
{
使用(var memory=new MemoryStream())
{
b、 保存(内存,ImageFormat.Bmp);
记忆位置=0;
var bitmapImage=新的bitmapImage();
bitmapImage.BeginInit();
bitmapImage.StreamSource=内存;
bitmapImage.CacheOption=BitmapCacheOption.OnLoad;
bitmapImage.EndInit();
var ccb=新的ColorConvertedBitmap();
ccb.BeginInit();
ccb.Source=位图图像;
ccb.SourceColorContext=
新的ColorContext(新的Uri(sourceIcm));
ccb.DestinationColorContext=
新的ColorContext(新的Uri(targetIcm));
ccb.EndInit();
var encoder=新的BmpBitmapEncoder();
编码器.Frames.Add(BitmapFrame.Create(ccb));
使用(var ms=new MemoryStream())
{                            
编码器保存(ms);
target.Bitmap=新位图(毫秒);
}
}
}
}
回报目标;
}
然后我看了看那个不清晰的东西,发现了这个问题:它说:

使用高斯平滑滤波器并从原始图像中减去平滑版本

(我还检查了这个问题,以了解等效的emgucv调用是什么)并提出了这个额外的扩展方法:

public static Image<Bgr, TDepth> UnsharpMask<TDepth>(
    this Image<Bgr, TDepth> source,
    Size kernelSize,
    int kernelHoritonalStandardDeviation,
    int kernelVerticalStandardDeviation,
    double alpha,
    double beta,
    double gamma)
    where TDepth : new()
{

    Image<Bgr, TDepth> ret = source.CopyBlank();

    CvInvoke.cvSmooth(source,
                      ret,
                      SMOOTH_TYPE.CV_GAUSSIAN,
                      kernelSize.Width,
                      kernelSize.Height,
                      kernelHoritonalStandardDeviation,
                      kernelVerticalStandardDeviation);

    CvInvoke.cvAddWeighted(source, alpha, ret, beta, gamma, ret);

    return ret;
}
公共静态图像反锐化掩码(
这个影像来源,,
大小内核大小,
int-kernelhoritonal标准偏差,
int核垂直标准偏差,
双阿尔法,
双贝塔,
双伽马射线)
其中TDepth:new()
{
Image ret=source.CopyBlank();
CvInvoke.cvSmooth(源代码,
ret,
平滑型CV高斯型,
内核大小。宽度,
内核大小,高度,
内核水平偏差,
核垂直标准差);
CvInvoke.cvAddWeighted(源、α、ret、β、γ、ret);
返回ret;
}
现在我这样称呼它:

string sourceIcm = @"C:\Windows\System32\spool\drivers\color\ewrgb18.icm";
string targetIcm = @"C:\Windows\System32\spool\drivers\color\ewsrgb.icm";

using(var im = new Image<Bgr, byte>("out.bmp"))
{
    using (var icmmed = im.ApplyIcm(sourceIcm, targetIcm))
    {
        using (var ret = icmmed.UnsharpMask(new Size(0, 0), 5, 5, 2.4, -1.5, 0))
        {
            ret.Save("ret.bmp");
        }
    }
}
string sourceIcm=@“C:\Windows\System32\spool\drivers\color\ewrb18.icm”;
字符串targetCM=@“C:\Windows\System32\spool\drivers\color\ewsrgb.icm”;
使用(var im=new Image(“out.bmp”))
{
使用(var icmmed=im.ApplyIcm(sourceIcm,targetIcm))
{
使用(var ret=icmmed.UnsharpMask(新大小(0,0,5,2.4,-1.5,0))
{
ret.Save(“ret.bmp”);
}
}
}
这就是结果:

不太好!:-(

我对参数进行了无休止的修改,但我无法确定如何(甚至是否)实现与Epson工具相同的结果

所以,我的问题是:


是否有人知道使用opencv/emgucv(甚至TWAIN-我查阅了文档,并尝试调整了一些功能参数,但我只是让图像变得更差)是否可以获得与上面原始图像在清晰度上相似的结果,或者是否有其他技术我应该尝试(可能是因为我需要了解硬件本身的一些细节才能实现正确的锐化)?

我认为您应该知道如何使用WIA(Windows图像采集)在您的项目中,您可能不需要使用opencv访问硬件。WIA用于与网络摄像头和扫描仪集成。或者,您可以使用您提到的TWAIN 看看这些例子,它们可能会对您的项目有所帮助:

关于锐化,您可以在软件级别使用opencv功能,作为解决问题的另一种选择

string sourceIcm = @"C:\Windows\System32\spool\drivers\color\ewrgb18.icm";
string targetIcm = @"C:\Windows\System32\spool\drivers\color\ewsrgb.icm";

using(var im = new Image<Bgr, byte>("out.bmp"))
{
    using (var icmmed = im.ApplyIcm(sourceIcm, targetIcm))
    {
        using (var ret = icmmed.UnsharpMask(new Size(0, 0), 5, 5, 2.4, -1.5, 0))
        {
            ret.Save("ret.bmp");
        }
    }
}