Как добиться хорошей резкости с помощью twain/emgu/open cv?

Я использую сканер 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 - я просмотрел документацию по этому вопросу и попытался настроить некоторые параметры возможностей, но я только ухудшил изображение), т.е. резкость аналогична исходному изображению выше, или есть другой метод, который я должен попробовать (может быть, мне нужно знать некоторые подробности о самом оборудовании, чтобы добиться правильной резкости)?


person kmp    schedule 14.01.2013    source источник


Ответы (1)


Я думаю, вы должны знать, как с помощью WIA (Windows Image Acquisition) в вашем проекте вам может не понадобиться получать доступ к оборудованию с помощью opencv. WIA используется для интеграции с веб-камерами и сканерами. Или вы можете использовать TWAIN, как вы упомянули, посмотрите на эти примеры, которые могут быть полезны для вашего проекта:

с использованием WIA

и

с использованием TWAIN

Что касается повышения резкости, вы можете использовать функциональность opencv на уровне программного обеспечения в качестве еще одного варианта решения вашей проблемы.

person Y.AL    schedule 04.04.2013