6

我正在使用Epson Perfection V700扫描仪,并在使用他们的工具进行扫描时选择以下选项:

  • ICM 颜色校正(来源:EPSON-Standard 目标:sRGB)
  • 锐化蒙版(中)

这产生了这个图像:

图片来自 Epson Tool

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

TWAIN 扫描图像

另外:我取消了上述两个选项并使用 Epson 再次扫描,得到的图像与我通过TWAIN获得的图像非常相似。

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

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

public static Image<Bgr, TDepth> ApplyIcm<TDepth>(
    this Image<Bgr, TDepth> source,
    string sourceIcm,
    string targetIcm)
    where TDepth : new()
{
    var target = source.CopyBlank();

    using (source)
    {
        using (var b = source.Bitmap)
        {
            using (var memory = new MemoryStream())
            {
                b.Save(memory, ImageFormat.Bmp);
                memory.Position = 0;

                var bitmapImage = new BitmapImage();
                bitmapImage.BeginInit();
                bitmapImage.StreamSource = memory;
                bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
                bitmapImage.EndInit();

                var ccb = new ColorConvertedBitmap();
                ccb.BeginInit();
                ccb.Source = bitmapImage;

                ccb.SourceColorContext =
                    new ColorContext(new Uri(sourceIcm));

                ccb.DestinationColorContext =
                    new ColorContext(new Uri(targetIcm));

                ccb.EndInit();

                var encoder = new BmpBitmapEncoder();
                encoder.Frames.Add(BitmapFrame.Create(ccb));
                using (var ms = new MemoryStream())
                {                            
                    encoder.Save(ms);
                    target.Bitmap = new Bitmap(ms);
                }
            }
        }
    }

    return target;
}

然后我看了那个不锐化的东西,遇到了这个问题: 如何在 OpenCV 中锐化图像?其中说:

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

(我还检查了这个问题以找出等效的 emgucv 调用是为什么 EmguCV 高斯模糊不会返回与 OpenCV 高斯模糊相同的结果?)并提出了这个额外的扩展方法:

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;
}

现在我这样称呼它:

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");
        }
    }
}

这是结果:

在我磨砺之后

不是很好!:-(

我无休止地摆弄参数,但我无法弄清楚如何(或者即使)我可以达到与 Epson 工具相同的结果。

所以,我的问题是:

有谁知道是否有可能使用opencv/emgucv(甚至TWAIN——我查看了相关文档并尝试调整一些功能参数,但我只是让图像变得更糟)实现了清晰度相似的结果到上面的原始图像还是我应该尝试另一种技术(可能是我需要了解有关硬件本身的一些细节才能实现正确的锐化)?

4

1 回答 1

2

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

使用 WIA

使用 TWAIN

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

于 2013-04-04T15:28:19.167 回答