我使用的是Epson Perfection V700扫描仪,并选择下列选项中使用他们的工具进行扫描时:如何用twain/emgu/open cv实现良好的清晰度?
- ICM色彩校正(来源:EPSON-标准和目标:sRGB的)
- USM锐化(中)
产生这个图像:
现在我的问题是这样的 - 我确实需要使用TWAIN .Net此扫描仪进行互动,当我这样做,我回来的图像是这样的:
题外话:我未被选择上述两个选项和扫描再次与爱普生,并得到了一个非常相似的图像,我得到了通过TWAIN。
所以我想这可能是后处理步骤,我可以在图像上自己做(也许他们在某种程度上完成硬件,但我不知道)。
我使用的是EmguCV,所以首先我创建了一个应用ICM的扩展方法(我努力为这个找到任何文档,所以这是一个猜测,也许我错了,但我得到了从信息浏览:The bitmap transform class,它似乎有所作为的图像):
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;
}
然后我看着那个unsharpen的事情,碰到这个问题就来了:How to sharpen an image in OpenCV?它说:
您使用高斯平滑滤波器a第二从原始图像
(我还检查了这个问题,找出相当于emgucv电话是什么Why might EmguCV Gaussian blur not return identical results as OpenCV Gaussian blur?)以及与此额外的扩展方法上来减去平滑版本:
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要达到一个目标 - 我必须通过该文件一看,并试图调整一些性能参数,但我只是把图像变得更糟),它与上面的原始图像的清晰度相似,或者是我应该尝试的另一种技术(可能是我需要知道一些关于硬件本身的细节以便实现正确的锐化)?