Tôi đang sử dụng một máy quét Epson Perfection V700 và chọn các tùy chọn sau khi quét sử dụng công cụ của họ:Làm thế nào để đạt được độ sắc nét tốt với twain/emgu/open cv?
- chỉnh ICM Color (nguồn: EPSON-Tiêu chuẩn và mục tiêu: sRGB)
- Unsharp Mask (trung bình)
Đó tạo ra hình ảnh này:
Bây giờ vấn đề của tôi là thế này - Tôi thực sự cần phải tương tác với máy quét này sử dụng TWAIN .Net và khi tôi làm như vậy, hình ảnh tôi nhận được lại là thế này:
Ngoài: Tôi đã bỏ chọn hai tùy chọn nói trên và quét một lần nữa với Epson và có một hình ảnh rất giống với những gì tôi nhận được thông qua TWAIN.
Vì vậy, tôi cho rằng có lẽ đây là các bước xử lý bài mà tôi có thể tự làm trên hình ảnh (có thể chúng được thực hiện trong phần cứng bằng cách nào đó, tôi không biết).
Tôi đang sử dụng EmguCV vì vậy trước hết tôi đã tạo một phương pháp mở rộng áp dụng ICM (tôi đã cố gắng tìm bất kỳ tài liệu nào cho điều này, vì vậy nó hơi đoán và có thể tôi đã sai ngay lập tức thông tin từ đây: The bitmap transform class và có vẻ như để tạo sự khác biệt với hình ảnh):
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;
}
Sau đó, tôi nhìn thấy điều unsharpen và đã xem qua câu hỏi này: How to sharpen an image in OpenCV? mà nói:
Bạn sử dụng một bộ lọc làm mịn gaussian a nd trừ phiên bản vuốt từ ảnh gốc
(Tôi cũng đã kiểm tra câu hỏi này để tìm hiểu những gì các cuộc gọi emgucv tương đương là Why might EmguCV Gaussian blur not return identical results as OpenCV Gaussian blur?) và đã đưa ra phương pháp này mở rộng thêm:
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;
}
Bây giờ tôi gọi nó như vậy:
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");
}
}
}
và đây là kết quả:
Không tốt lắm! :-(
Tôi đã không sử dụng các tham số không ngừng nhưng tôi không thể biết được làm thế nào (hoặc thậm chí nếu) tôi có thể đạt được kết quả tương tự như công cụ Epson.
Vì vậy, câu hỏi của tôi là:
Có ai biết nếu nó có thể đạt được một kết quả sử dụng opencv/emgucv (hoặc thậm chí TWAIN - Tôi đã có một cái nhìn thông qua tài liệu hướng dẫn cho điều đó và cố gắng điều chỉnh một số nhưng có một kỹ thuật khác tôi nên thử (có thể là tôi cần biết một số chi tiết về bản thân phần cứng để đạt được độ sắc nét chính xác))?