2013-01-14 8 views
6

Używam Epson Perfection V700 skaner i wybierając następujące opcje podczas skanowania przy użyciu ich narzędzia:Jak osiągnąć dobrą ostrość z twain/emgu/open cv?

  • korekcji ICM Kolor (źródło: EPSON-Standard i cel: sRGB)
  • Unsharp Mask (medium)

która produkuje ten obraz:

Image from Epson Tool

Teraz mój problem polega na tym - ja rzeczywiście muszą współdziałać ze skanera za pomocą TWAIN .Net i kiedy to zrobić, obraz wrócę to:

TWAIN Scanned Image

marginesie: mam odznaczone wyżej wymienionych dwóch opcji i zeskanowane znowu z Epson i dostałem bardzo podobny obraz do tego, co dostaję przez TWAIN.

Więc myślę, że być może są to etapy przetwarzania końcowego, które mogę zrobić samemu na obrazie (być może są one wykonane w sprzęcie, jakoś jednak, nie wiem).

Używam EmguCV, więc najpierw stworzyłem metodę rozszerzenia, która stosuje ICM (starałem się znaleźć jakąkolwiek dokumentację dla tego, więc to jest trochę odgadnięcia i może jestem w błędzie od razu, ale dostałem informacje stąd: The bitmap transform class i wydaje się mieć znaczenie dla obrazu):

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

Potem spojrzałem w tamtym Wyostrz rzeczy i natknąłem się na to pytanie: How to sharpen an image in OpenCV? który mówi:

można użyć filtr wygładzający gaussowski nd odjąć wersji wygładzonej od oryginalnego obrazu

(ja również sprawdzić to pytanie, aby dowiedzieć się, co równoważne wezwanie emgucv jest Why might EmguCV Gaussian blur not return identical results as OpenCV Gaussian blur?) i wymyślił tę dodatkową metodę rozszerzenia:

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

Teraz nazwać tak:

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

i jest to wynik:

After my sharpening

Niezbyt dobrze! :-(

Mam bezmyślnie ustawiane parametry, ale nie mogę pojąć, jak (a nawet jeśli) mogę osiągnąć ten sam wynik, co narzędzie Epson.

Więc moje pytanie brzmi:

Czy ktoś wie, czy jest możliwe, aby osiągnąć rezultat za pomocą OpenCV/emgucv (lub nawet TWAIN - Miałem przejrzenia dokumentacji, że i próbował dostosowując niektóre z parametry możliwości, ale po prostu pogorszyłem obraz), który jest podobny w ostrości do oryginalnego obrazu powyżej, czy jest inna technika, którą powinienem spróbować (czy to konieczne, że potrzebowałbym znać kilka szczegółów na temat samego sprzętu, aby uzyskać poprawne wyostrzenie)?

Odpowiedz

2

Myślę, że powinieneś wiedzieć, jak używać WIA (Windows Image Acquisition) w twoim projekcie, możesz nie potrzebować dostępu do sprzętu używając opencv. WIA służy do integracji z kamerami i skanerami. Albo można użyć TWAIN jak wspomniano spojrzeć na tych przykładach mogli przez pomocne dla projektu:

using WIA

i

using TWAIN

dotyczącego ostrzenie, można użyć Funkcjonalność opencv na poziomie oprogramowania, jako kolejny wybór w celu rozwiązania problemu

Powiązane problemy