6

Epson Perfection V700スキャナーを使用しており、ツールを使用してスキャンするときに次のオプションを選択しています。

  • ICM 色補正 (ソース: EPSON-Standard、ターゲット: sRGB)
  • アンシャープマスク(中)

これにより、次の画像が生成されます。

エプソンツールからの画像

今私の問題はこれです - 私は実際にTWAIN .Netを使用してこのスキャナーとやり取りする必要があります。そうすると、返される画像は次のようになります。

TWAINスキャン画像

余談: 前述の 2 つのオプションの選択を解除し、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 Image Acquisition) を使用する方法を知っておく必要があると思います。opencv を使用してハードウェアにアクセスする必要がない場合があります。WIA は、Web カメラやスキャナーとの統合に使用されます。または、言及したように TWAIN を使用して、プロジェクトに役立つこれらの例をご覧ください。

WIAの使用

TWAINの使用

シャープ化に関しては、問題を解決する別の選択肢として、ソフトウェア レベルで opencv 機能を使用できます。

于 2013-04-04T15:28:19.167 に答える