我一直在寻找一种方法来拉直扫描的图像,更准确地说是一种形式,我需要一个自动拉直它的功能,我尝试过
import numpy as np
import numpy as np
import argparse
import cv2
img = cv2.imread('D:/Consecu.jpg',0)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.bitwise_not(gray)
thresh = cv2.threshold(gray, 0, 255,
cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
coords = np.column_stack(np.where(thresh > 0))
angle = cv2.minAreaRect(coords)[-1]
if angle < -45:
angle = -(90 + angle)
else:
angle = -angle
(h, w) = image.shape[:2]
center = (w // 2, h // 2)
M = cv2.getRotationMatrix2D(center, angle, 1.0)
rotated = cv2.warpAffine(image, M, (w, h),
flags=cv2.INTER_CUBIC,
borderMode=cv2.BORDER_REPLICATE)
cv2.putText(rotated, "Angle: {:.2f} degrees".format(angle),
(10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
print("[INFO] angle: {:.3f}".format(angle))
cv2.imshow("Input", image)
cv2.imshow("Rotated", rotated)
cv2.waitKey(0)
但是图像没有旋转,它没有找到倾斜度(0,0),它如何旋转框架或检测线,从而水平组织它们
我需要一个自动拉直并保持原样的功能
问题是您正在应用的算法,取自https://www.pyimagesearch.com/2017/02/20/text-skew-correction-opencv-python/是专门为文本设计的,如相同的页:
在那篇文章中使用的图像中,事实证明所有“墨水”像素都在一个矩形内,而该矩形正是代码所要寻找的:
基本上,该代码所做的是检测哪个矩形只会留下非墨水像素。它会找到的矩形将是我在此处用红色标记的矩形:
一旦找到矩形,就很容易找到它的角度并用它来拉直文本。
不幸的是,这个技巧对你不起作用,因为“墨水”像素分散在整个页面上,特别是在图像的角落附近有很多黑色像素。因此,在您的情况下,包含墨水的最小矩形是等于整个页面的矩形。这就是零角度出现的原因。
另一方面,你的case有一个很有意思的特点,就是因为是打印出来的表格,所以里面包含了大量的横线(表格的网格)。
使用霍夫变换,我们可以找到所有这些线。这种变换为每条线提供了它与水平线形成的角度。实际上,我会在您的图像中找到很多线条,其中大部分是水平的,但也有一些垂直的。例如,如果您将自己限制为超过 1000 像素的线条,您可能会发现:
(线条没有完全画出来,只画了一条,以免完全覆盖原来的线)。
Vemos que en algunas zonas (las barras negras anchas) detecta un amasijo de líneas con ángulos variables. Eso podríamos haberlo mejorado si antes de pasarle la imagen hacemos una detección de bordes (ej: canny). Pero no importa mucho en este caso porque el resto de las líneas finas las ha encontrado perfectamente.
Lo que podemos hacer es revisar todas las líneas que ha encontrado y quedarnos con los ángulos que más frecuentemente aparecen, que corresponderá a los de las líneas horizontales de la rejilla. Para este cometido nos viene muy bien la clase
Counter
del módulo estándar pythoncollections
.El siguiente código hace todo lo antes descrito (he optado por volcar el resultado a otro fichero, en lugar de mostrarlo por pantalla, pues lo estoy ejecutando en un servidor sin terminal gráfica):
Esto es lo que sale en el fichero
"corregida.jpg"
(he reducido a la mitad su resolución para pegarla aquí, pues Stack Overflow se quejaba del tamaño):Actualización
Como el usuario reportó algunos casos de imágenes en las que no se giraba correctamente, estuve revisando el algoritmo. He hecho las siguientes mejoras:
通过这些改进,我将它应用于一些图像,在不同方向旋转或不旋转,并且在所有这些图像中它都是正确的。
这是新代码(我已将其重构为一个函数):