我扫描的文档没有完全笔直扫描,因此文本的方向不是完全水平,即每行可能有 10° 的斜度。
我的理解是 ImageMagick 中的纠偏选项应该可以解决这个问题,例如
convert skewed_1500.jpeg -deskew 40% skewed_1500_not.jpg
但它对输出文件没有任何明显的影响。
我已附上倾斜和校正倾斜的图像以进行比较。
我会尝试更大的值,例如 80%,否则 Imagemagick 论坛成员有一个可能更好的 bash 脚本:http://www.fmwconcepts.com/imagemagick/textdeskew/index.php
您还可以先让 ImageMagick 将 JPG 转换为 PDF (
convert input.jpg input.pdf
),然后让 OCRmyPDF 校正 PDF,然后校正页面:
ocrmypdf --deskew --tesseract-timeout=0 input.pdf output.pdf
使用您的示例页面,我想说生成的文本是直接的:
如here所述,
--tesseract-timeout=0
禁用光学字符识别。
当然,您也可以对 PDF 进行倾斜校正并使其可一次性搜索:
ocrmypdf --deskew -l fra input.pdf output.pdf
运行此程序之前,请确保安装了 Tesseract 的法语语言包。 这里是说明。
pdfcrop
(通常是 TeX Live 的一部分):
# Remove margins at left, top, right, and bottom
pdfcrop --margins '-60 0 -50 -430' output.pdf cropped_output.pdf
裁剪并校正歪斜的 PDF:
这不使用 Imagemagick,但它对扫描的文档/图像进行歪斜校正的作用相同。
以下是可以帮助您校正图像的代码:
import numpy as np
from skimage import io
from skimage.transform import rotate
from skimage.color import rgb2gray
from deskew import determine_skew
from matplotlib import pyplot as plt
def deskew(_img):
image = io.imread(_img)
grayscale = rgb2gray(image)
angle = determine_skew(grayscale)
rotated = rotate(image, angle, resize=True) * 255
return rotated.astype(np.uint8)
def display_before_after(_original):
plt.subplot(1, 2, 1)
plt.imshow(io.imread(_original))
plt.subplot(1, 2, 2)
plt.imshow(deskew(_original))
display_before_after('img_35h.jpg')
magick <image_source> -set option:angle "%[minimum-bounding-box:unrotate]" -background white -rotate "%[angle]" <image_target>
在裁剪边距后使用。 这将通过找到黑色像素的凸包(通常页面上的文本位于矩形中)并将其旋转到直角来找到合适的角度。 在处理扫描文本时,我更喜欢处理二值化图像,并避免 jpeg(当您编写或转换时,如果不小心压缩管理,文本周围会出现灰色像素)。