Epson Perfection V700スキャナーを使用しており、ツールを使用してスキャンするときに次のオプションを選択しています。
- ICM 色補正 (ソース: EPSON-Standard、ターゲット: sRGB)
- アンシャープマスク(中)
これにより、次の画像が生成されます。
今私の問題はこれです - 私は実際にTWAIN .Netを使用してこのスキャナーとやり取りする必要があります。そうすると、返される画像は次のようになります。
余談: 前述の 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 - そのためのドキュメントを調べて、いくつかの機能パラメーターを調整しようとしましたが、画像を悪化させただけです) シャープネスが似ています上記の元の画像に、または私が試すべき別のテクニックはありますか(正しいシャープネスを実現するために、ハードウェア自体の詳細を知る必要があるのでしょうか)?