- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
目前,我正在做一个 OCR 项目,我需要从标签上读取文本(参见下面的示例图片)。我遇到了图像倾斜问题,我需要帮助修复图像倾斜,使文本水平而不是倾斜。目前,我正在使用的过程尝试对给定范围内的不同角度进行评分(下面包含代码),但这种方法不一致,有时会过度校正图像倾斜或平坦化无法识别倾斜并纠正它。请注意,在歪斜校正之前,我将所有图像旋转 270 度以使文本直立,然后通过下面的代码传递图像。传递给函数的图像已经是二进制图像。
代码:
def findScore(img, angle):
"""
Generates a score for the binary image recieved dependent on the determined angle.\n
Vars:\n
- array <- numpy array of the label\n
- angle <- predicted angle at which the image is rotated by\n
Returns:\n
- histogram of the image
- score of potential angle
"""
data = inter.rotate(img, angle, reshape = False, order = 0)
hist = np.sum(data, axis = 1)
score = np.sum((hist[1:] - hist[:-1]) ** 2)
return hist, score
def skewCorrect(img):
"""
Takes in a nparray and determines the skew angle of the text, then corrects the skew and returns the corrected image.\n
Vars:\n
- img <- numpy array of the label\n
Returns:\n
- Corrected image as a numpy array\n
"""
#Crops down the skewImg to determine the skew angle
img = cv2.resize(img, (0, 0), fx = 0.75, fy = 0.75)
delta = 1
limit = 45
angles = np.arange(-limit, limit+delta, delta)
scores = []
for angle in angles:
hist, score = findScore(img, angle)
scores.append(score)
bestScore = max(scores)
bestAngle = angles[scores.index(bestScore)]
rotated = inter.rotate(img, bestAngle, reshape = False, order = 0)
print("[INFO] angle: {:.3f}".format(bestAngle))
#cv2.imshow("Original", img)
#cv2.imshow("Rotated", rotated)
#cv2.waitKey(0)
#Return img
return rotated
校正前后标签的示例图像
修正前->
修正后
如果有人能帮我解决这个问题,那会很有帮助。
最佳答案
这是 Projection Profile Method algorithm for skew angle estimation 的一个实现.各种角度点被投影到累加器阵列中,其中倾斜角可以定义为搜索间隔内的投影角度,使对齐最大化。这个想法是以不同角度旋转图像并为每次迭代生成像素直方图。为了确定偏斜角,我们比较峰值之间的最大差异并使用该偏斜角,旋转图像以校正偏斜。
原始 ->
更正
Skew angle: -2
import cv2
import numpy as np
from scipy.ndimage import interpolation as inter
def correct_skew(image, delta=1, limit=5):
def determine_score(arr, angle):
data = inter.rotate(arr, angle, reshape=False, order=0)
histogram = np.sum(data, axis=1, dtype=float)
score = np.sum((histogram[1:] - histogram[:-1]) ** 2, dtype=float)
return histogram, score
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
scores = []
angles = np.arange(-limit, limit + delta, delta)
for angle in angles:
histogram, score = determine_score(thresh, angle)
scores.append(score)
best_angle = angles[scores.index(max(scores))]
(h, w) = image.shape[:2]
center = (w // 2, h // 2)
M = cv2.getRotationMatrix2D(center, best_angle, 1.0)
corrected = cv2.warpAffine(image, M, (w, h), flags=cv2.INTER_CUBIC, \
borderMode=cv2.BORDER_REPLICATE)
return best_angle, corrected
if __name__ == '__main__':
image = cv2.imread('1.png')
angle, corrected = correct_skew(image)
print('Skew angle:', angle)
cv2.imshow('corrected', corrected)
cv2.waitKey()
注意:您可能需要根据图像调整delta
或limit
值。 delta
值控制迭代步长,它将迭代到控制最大角度的 limit
。此方法通过迭代检查每个角度 + delta
非常简单,目前仅适用于校正 +/- 5 度范围内的倾斜。如果您需要在更大的角度进行校正,请调整limit
值。对于另一种处理偏斜的方法,take a look at this alternative method .
关于用于 OCR 的 Python OpenCV 偏差校正,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57964634/
我正在用 Objective C 重写蒙特卡罗模拟,以便在 VBA/Excel 的 dll 中使用。计算中的“引擎”是创建 0 到 10001 之间的随机数,并将其与 5000-7000 附近的变量进
我目前正在尝试使用 Flask 创建一个简单的 Web 应用程序,用于交互式神经网络训练。我正在努力解决的是在训练前馈神经网络后检索隐藏层的权重 - 我的目标是为 Tensorflow's Playg
我知道如何找到手机当前所在位置的真实航向/磁航向,但是否有可能找到远程位置的磁偏差/磁偏角? 我想做的是能够在 map 上的一个地方放置一个图钉,然后找到真实的方位角和从该点开始有磁差的方位角。 谢谢
函数方法glTexImage2D将“level”作为参数,表示细节级别偏差。但是,可以使用 glTexParameteri 和 GL_TEXTURE_LOD_BIAS 目标来设置纹理的 LOD 偏差。
有没有一种简单的方法来显示我在训练后输入到使用 Neurolab 开发的 ANN 中的每个属性的偏差或权重? 最佳答案 是的,您可以看到所有图层的权重和偏差。通过使用 net.layers[i].np
我正在用我目前在 Metal 中使用的应用程序的 Android 版本重写一个 OpenGL 过滤器。它使用以下纹理查找函数:vec4 texture2D(sampler2D 采样器,vec2 坐标,
我有一个简单的算法,可以让对象在 Java 中以给定的最大速度跟随鼠标指针。该算法的关键在于: // Set up displacement trackers for later. // (These
我在我的 Android 应用程序中使用“HelveticaNeue.ttf”作为自定义字体;对于所有以前的 android 版本都很好,但是对于 lollipop,它比通常的字体拉伸(stretch
我正在寻找一种方法来生成一组具有指定均值和标准差的整数。偏差。 使用随机库,可以生成一组以高斯方式分布的随机 double ,这看起来像这样: #include std::tr1::normal_d
我正在尝试训练 LambdaMART 模型来对对象列表执行成对排序。我的训练数据集由 50,000 个 112 维特征向量组成。每个特征都由一个非负整数编码。 目标值是正整数(不连续)。给定两个新实例
我在名为“df”的数据框中有时间序列数据,并且计算 z 分数的代码如下: mean = df.mean() standard_dev = df.std() z_score = (df - mean)
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 3 年前。 Improve th
我正在尝试在 TensorFlow 中执行以下线性回归,但我的输出都是 Inf 和 NaN。 我的输入数据集必须是 Y=0.5*X + 2 + 噪声;其中 X 是大小 (1000) 的正态分布,噪声是
我是一名优秀的程序员,十分优秀!