2013-01-14 42 views
6

Tôi đang sử dụng một máy quét Epson Perfection V700 và chọn các tùy chọn sau khi quét sử dụng công cụ của họ:Làm thế nào để đạt được độ sắc nét tốt với twain/emgu/open cv?

  • chỉnh ICM Color (nguồn: EPSON-Tiêu chuẩn và mục tiêu: sRGB)
  • Unsharp Mask (trung bình)

Đó tạo ra hình ảnh này:

Image from Epson Tool

Bây giờ vấn đề của tôi là thế này - Tôi thực sự cần phải tương tác với máy quét này sử dụng TWAIN .Net và khi tôi làm như vậy, hình ảnh tôi nhận được lại là thế này:

TWAIN Scanned Image

Ngoài: Tôi đã bỏ chọn hai tùy chọn nói trên và quét một lần nữa với Epson và có một hình ảnh rất giống với những gì tôi nhận được thông qua TWAIN.

Vì vậy, tôi cho rằng có lẽ đây là các bước xử lý bài mà tôi có thể tự làm trên hình ảnh (có thể chúng được thực hiện trong phần cứng bằng cách nào đó, tôi không biết).

Tôi đang sử dụng EmguCV vì vậy trước hết tôi đã tạo một phương pháp mở rộng áp dụng ICM (tôi đã cố gắng tìm bất kỳ tài liệu nào cho điều này, vì vậy nó hơi đoán và có thể tôi đã sai ngay lập tức thông tin từ đây: The bitmap transform class và có vẻ như để tạo sự khác biệt với hình ảnh):

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

Sau đó, tôi nhìn thấy điều unsharpen và đã xem qua câu hỏi này: How to sharpen an image in OpenCV? mà nói:

Bạn sử dụng một bộ lọc làm mịn gaussian a nd trừ phiên bản vuốt từ ảnh gốc

(Tôi cũng đã kiểm tra câu hỏi này để tìm hiểu những gì các cuộc gọi emgucv tương đương là Why might EmguCV Gaussian blur not return identical results as OpenCV Gaussian blur?) và đã đưa ra phương pháp này mở rộng thêm:

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

Bây giờ tôi gọi nó như vậy:

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

và đây là kết quả:

After my sharpening

Không tốt lắm! :-(

Tôi đã không sử dụng các tham số không ngừng nhưng tôi không thể biết được làm thế nào (hoặc thậm chí nếu) tôi có thể đạt được kết quả tương tự như công cụ Epson.

Vì vậy, câu hỏi của tôi là:

Có ai biết nếu nó có thể đạt được một kết quả sử dụng opencv/emgucv (hoặc thậm chí TWAIN - Tôi đã có một cái nhìn thông qua tài liệu hướng dẫn cho điều đó và cố gắng điều chỉnh một số nhưng có một kỹ thuật khác tôi nên thử (có thể là tôi cần biết một số chi tiết về bản thân phần cứng để đạt được độ sắc nét chính xác))?

Trả lời

2

Tôi nghĩ bạn nên biết cách sử dụng WIA (Windows Image Acquisition) trong dự án của mình, bạn có thể không cần truy cập phần cứng bằng opencv. WIA được sử dụng để tích hợp với webcam và máy quét. Hoặc, bạn có thể sử dụng TWAIN như bạn đề cập có một cái nhìn tại những ví dụ họ có thể bằng hữu ích cho dự án của bạn:

using WIA

using TWAIN

Liên quan đến việc mài, bạn có thể sử dụng chức năng opencv ở cấp phần mềm, như một lựa chọn khác để giải quyết vấn đề của bạn

Các vấn đề liên quan