gpt4 book ai didi

c# - 如何用twain/emgu/open cv达到好的清晰度?

转载 作者:太空狗 更新时间:2023-10-29 21:54:43 25 4
gpt4 key购买 nike

我正在使用 Epson Perfection V700扫描仪并在使用他们的工具扫描时选择以下选项:

  • ICM 颜色校正(来源:EPSON-Standard 和目标:sRGB)
  • USM 锐化(中)

生成此图像的方法:

Image from Epson Tool

现在我的问题是 - 我实际上需要使用 TWAIN .Net 与此扫描仪进行交互当我这样做时,我得到的图像是这样的:

TWAIN Scanned Image

旁白:我取消了上述两个选项,然后用 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?其中说:

You use a gaussian smoothing filter and subtract the smoothed version from the original image

(我还检查了这个问题以找出等效的 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");
}
}
}

这是结果:

After my sharpening

不太好! :-(

我一直在无休止地摆弄参数,但我就是无法弄清楚如何(甚至是否)可以实现与 Epson 工具相同的结果。

所以,我的问题是:

有谁知道是否可以使用 opencv/emgucv(或什至 TWAIN - 我查看了相关文档并尝试调整一些功能参数,但我只是让图像变得更糟) 的清晰度与上面的原始图像相似,或者是否有我应该尝试的另一种技术(可能是我需要了解有关硬件本身的一些细节才能实现正确的锐化)?

最佳答案

我认为您应该知道如何在您的项目中使用 WIA(Windows 图像采集),您可能不需要使用 opencv 访问硬件。 WIA 用于与网络摄像头和扫描仪集成。或者,您可以像您提到的那样使用 TWAIN查看这些示例,它们可能对您的项目有帮助:

using WIA

using TWAIN

关于锐化,您可以在软件级别使用 opencv 功能,作为解决问题的另一种选择

关于c# - 如何用twain/emgu/open cv达到好的清晰度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14321165/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com