【发布时间】:2019-09-03 08:48:52
【问题描述】:
我有数百张图像(扫描文档),其中大部分是歪斜的。我想用 Python 去歪斜它们。
这是我使用的代码:
import numpy as np
import cv2
from skimage.transform import radon
filename = 'path_to_filename'
# Load file, converting to grayscale
img = cv2.imread(filename)
I = cv2.cvtColor(img, COLOR_BGR2GRAY)
h, w = I.shape
# If the resolution is high, resize the image to reduce processing time.
if (w > 640):
I = cv2.resize(I, (640, int((h / w) * 640)))
I = I - np.mean(I) # Demean; make the brightness extend above and below zero
# Do the radon transform
sinogram = radon(I)
# Find the RMS value of each row and find "busiest" rotation,
# where the transform is lined up perfectly with the alternating dark
# text and white lines
r = np.array([np.sqrt(np.mean(np.abs(line) ** 2)) for line in sinogram.transpose()])
rotation = np.argmax(r)
print('Rotation: {:.2f} degrees'.format(90 - rotation))
# Rotate and save with the original resolution
M = cv2.getRotationMatrix2D((w/2,h/2),90 - rotation,1)
dst = cv2.warpAffine(img,M,(w,h))
cv2.imwrite('rotated.jpg', dst)
此代码适用于大多数文档,除了某些角度:(180 和 0)和(90 和 270)通常被检测为相同的角度(即,它在 (180 和 0) 和(90 和 270))。所以我得到了很多颠倒的文件。
我得到的结果图像与输入图像相同。
是否有任何建议可以使用 Opencv 和 Python 检测图像是否颠倒?
PS:我尝试使用 EXIF 数据检查方向,但没有导致任何问题解决方案。
编辑:
可以使用 Tesseract(Python 的 pytesseract)检测方向,但只有在图像包含大量字符时才有可能。
对于任何可能需要这个的人:
import cv2
import pytesseract
print(pytesseract.image_to_osd(cv2.imread(file_name)))
如果文档包含足够多的字符,则 Tesseract 可以检测方向。但是,当图像的线条较少时,Tesseract 建议的方位角通常是错误的。所以这不可能是 100% 的解决方案。
【问题讨论】:
-
不是一个解决方案,但您可以使用的另一种启发式方法(假设您正在阅读拉丁脚本)是比较左右或上半部分和下半部分的黑色量。如果页面右侧(换行符)和/或底部的黑色明显更多,我猜它可能是颠倒的。
-
论文中总是有标题吗?你能说是否有模式可以遵循吗?我会像最后一个选项一样离开 OCR ......它会更容易检测白点,创建一个矩形并测量它的大小。就像标题和其余部分之间的白点一样。
-
@singrium 嗯不确定,如果它们的大小是恒定的,你可以使用一些卷积过滤器,看看它们是直立还是倒置效果更好(你得到更多“匹配”)......否则我'我不确定(我不太了解 CV tbh),我的意思是你肯定可以创建一个神经网络或对其进行分类的东西,但这还需要更多的工作。
-
嗯,对于那些带有蓝线的文档,您可以读取图像的蓝色通道并创建蓝色的阈值。如果它检测到蓝色的存在,并且在文档的中间下方,则可以说文档是倒置的。
-
您可以将页面预处理为具有高对比度的完全灰度,然后按照 jdehesa 的建议应用黑白测试。不过,您总是需要在 OCR 或任何检测之前进行规范化。
标签: python opencv image-rotation skew