2013-01-14 86 views
6

我使用的是Epson Perfection V700扫描仪,并选择下列选项中使用他们的工具进行扫描时:如何用twain/emgu/open cv实现良好的清晰度?

  • ICM色彩校正(来源:EPSON-标准和目标:sRGB的)
  • USM锐化(中)

产生这个图像:

Image from Epson Tool

现在我的问题是这样的 - 我确实需要使用TWAIN .Net此扫描仪进行互动,当我这样做,我回来的图像是这样的:

TWAIN Scanned Image

题外话:我未被选择上述两个选项和扫描再次与爱普生,并得到了一个非常相似的图像,我得到了通过TWAIN

所以我想这可能是后处理步骤,我可以在图像上自己做(也许他们在某种程度上完成硬件,但我不知道)。

我使用的是EmguCV,所以首先我创建了一个应用ICM的扩展方法(我努力为这个找到任何文档,所以这是一个猜测,也许我错了,但我得到了从信息浏览:The bitmap transform class,它似乎有所作为的图像):

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

然后我看着那个unsharpen的事情,碰到这个问题就来了:How to sharpen an image in OpenCV?它说:

您使用高斯平滑滤波器a第二从原始图像

(我还检查了这个问题,找出相当于emgucv电话是什么Why might EmguCV Gaussian blur not return identical results as OpenCV Gaussian blur?)以及与此额外的扩展方法上来减去平滑版本:

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

,这是结果:

After my sharpening

不是很好! :-(

我已经无休止地调整了参数,但我无法弄清楚如何(或者甚至)可以实现与Epson工具相同的结果。

所以,我的问题是:

有谁知道是否有可能使用的OpenCV/emgucv(甚至TWAIN要达到一个目标 - 我必须通过该文件一看,并试图调整一些性能参数,但我只是把图像变得更糟),它与上面的原始图像的清晰度相似,或者是我应该尝试的另一种技术(可能是我需要知道一些关于硬件本身的细节以便实现正确的锐化)?

回答

2

我想你应该知道如何在你的项目中使用WIA(Windows Image Acquisition),你可能不需要使用opencv访问硬件。 WIA用于与网络摄像头和扫描仪集成。或者,你可以使用TWAIN正如你所提到 看看这些例子,他们可以通过对你很有帮助项目:

using WIA

using TWAIN

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