如何使用 twain/emgu/open cv 获得良好的清晰度?
Posted
技术标签:
【中文标题】如何使用 twain/emgu/open cv 获得良好的清晰度?【英文标题】:How to achieve good sharpness with twain/emgu/open cv? 【发布时间】:2012-12-28 13:45:49 【问题描述】:我正在使用Epson Perfection V700 扫描仪,并在使用他们的工具进行扫描时选择以下选项:
ICM 颜色校正(来源:EPSON-Standard,目标:sRGB) 锐化蒙版(中等)生成此图像:
现在我的问题是 - 我实际上需要使用 TWAIN .Net 与此扫描仪进行交互,当我这样做时,我得到的图像是这样的:
除此之外:我取消了上述两个选项,然后用 Epson 再次扫描,得到的图像与我通过 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;
然后我看了那个未锐化的东西,遇到了这个问题:How to sharpen an image in OpenCV? 它说:
您使用高斯平滑滤波器并从原始图像中减去平滑版本
(我还检查了这个问题以找出等效的 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)来实现结果 - 我查看了相关文档并尝试调整一些功能参数,但我只是让图像变得更糟) 的清晰度与上面的原始图像相似,还是我应该尝试另一种技术(可能是我需要了解有关硬件本身的一些细节才能实现正确的锐化)?
【问题讨论】:
【参考方案1】:我认为您应该知道如何在您的项目中使用 WIA(Windows 图像采集),您可能不需要使用 opencv 访问硬件。 WIA 用于与网络摄像头和扫描仪集成。或者,您可以使用您提到的 TWAIN 看看这些对您的项目有帮助的示例:
using WIA
和
using TWAIN
关于锐化,您可以在软件级别使用 opencv 功能,作为解决问题的另一种选择
【讨论】:
以上是关于如何使用 twain/emgu/open cv 获得良好的清晰度?的主要内容,如果未能解决你的问题,请参考以下文章