C++ Library for image recognition: images contains words to string问题的公认答案建议您:
- 将输入图像放大/缩小到 300 DPI。
我将如何做到这一点...我的印象是 DPI 用于显示器,而不是图像格式。
C++ Library for image recognition: images contains words to string问题的公认答案建议您:
我将如何做到这一点...我的印象是 DPI 用于显示器,而不是图像格式。
每当您将像素中的图像与具有图片大小的物理设备相关联时,DPI 都是有意义的。在 OCR 的情况下,它通常意味着扫描的分辨率,即每英寸扫描将获得多少像素。12 磅字体意味着以每行 12/72 英寸打印,大写字符可能占其中的 80%;因此,当以 300 DPI 扫描时,它的高度约为 40 像素。
许多图像格式都记录了 DPI。如果图像被扫描,这应该是扫描仪的准确设置。如果它来自数码相机,它总是显示 72 DPI,这是 EXIF 规范强制要求的默认值;这是因为相机无法知道图像的原始大小。当您使用成像程序创建图像时,您可能有机会将 DPI 设置为任意值。这是为了方便您指定最终图像的使用方式,并且与图像中包含的细节无关。
这是之前的一个问题,询问了调整图像大小的细节: 如何对图像进行高质量缩放?
我认为这里更准确的术语是resampling。您需要足够高的像素分辨率来支持准确的 OCR。字体大小(例如,以磅为单位)通常以长度为单位,而不是像素。由于 72 点 = 1 英寸,我们需要每点 300/72 像素才能获得 300 dpi(“每英寸像素”)的分辨率。这意味着典型的 12 磅字体的高度(或更准确地说,单行距文本中的基线到基线的距离)为 50 像素。
理想情况下,您的源文档应该以适合给定字体大小的分辨率进行扫描,以使图像中的字体大约为 50 像素高。如果分辨率太高/太低,您可以使用图形程序(例如GIMP)轻松地重新采样图像。您也可以通过图形库以编程方式执行此操作,例如ImageMagick,它具有许多编程语言的接口。
OCR 软件通常设计为使用“正常”字体大小。从图像的角度来看,这意味着它将寻找可能在 30 到 100 像素高度范围内的字母。分辨率更高的图像会产生看起来太大的字母,OCR 软件无法有效处理。同样,较低分辨率的图像不会为软件提供足够的像素来识别字母。
“我该怎么做……我的印象是 dpi 是用于显示器的,而不是图像格式。”
DPI 代表每英寸点数。跟显示器有什么关系?好吧,我们有一个由三个 RGB 子像素组成的像素。DPI 越高,您塞入该空间的细节就越多。
DPI 对显示和打印来说是一种有用的度量,但没有什么用处……事实上,对于图像格式本身没有任何用处。
在某些格式中标记 DPI 的原因是指示设备以该分辨率显示,但据我了解,几乎所有人都忽略了该指令,并尽最大努力优化特定输出的图像。
您可以将图像格式的 72 dpi 更改为 1 dpi 或 6000 dpi,这在显示器上不会产生任何影响。“放大/缩小到 300 dpi”没有意义。重采样也不会改变 DPI。在 Photoshop 中尝试,在更改 DPI 时取消选中“重新采样”,你会发现没有任何区别。它不会变大或变小。
DPI 对于图像格式完全没有意义,IMO。
如果您的目标是 OCR,则 DPI 作为原始扫描文档中每英寸图像中的点数是有意义的。如果你的 dpi 太低,信息就永远消失了,即使是双三次插值也不能很好地恢复它。如果你的 dpi 太高,很容易丢掉比特。
完成工作;我是 netpbm/pbmplus 工具集的忠实粉丝;开始的工具是pnmscale
,但如果您有位图,您需要考虑相关工具,例如pbmreduce
.