【发布时间】:2020-08-10 00:32:26
【问题描述】:
在这张图片中,我试图检测水平线。当图像不倾斜时,代码运行良好。但是,它不适用于这种倾斜的图像。我已经尝试过这种方法通过直方图检测直角,但很多时候实际上使它更偏斜 - python-opencv-skew-correction-for-ocr
下面是检测水平线的代码:
gray=cv2.cvtColor(img_final_bin,cv2.COLOR_BGR2GRAY)
horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (100,1))
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
detected_lines = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, horizontal_kernel, iterations=2)
cnts, hierarchy = cv2.findContours(detected_lines, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
boundingBoxes = [list(cv2.boundingRect(c)) for c in cnts]
以下是歪斜校正的代码,它给我的结果是错误的:
def correct_skew(image, delta=0.001, limit=3):
def determine_score(arr, angle):
data = inter.rotate(arr, angle, reshape=False, order=0)
histogram = np.sum(data, axis=1)
score = np.sum((histogram[1:] - histogram[:-1]) ** 2)
return histogram, score
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
print("thresh", thresh.shape)
thresh1 = thresh[0:500, 0:500]
print("thresh1", thresh1.shape)
scores = []
angles = np.arange(-limit, limit + delta, delta)
for i, angle in enumerate(angles):
histogram, score = determine_score(thresh1, angle)
scores.append(score)
# if i%100 == 0:
# print(score, angle, len(angles), i)
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)
rotated = cv2.warpAffine(image, M, (w, h), flags=cv2.INTER_CUBIC, \
borderMode=cv2.BORDER_REPLICATE)
return best_angle, rotated
【问题讨论】:
-
-
感谢您对此进行调查.. 我已经尝试过很多变体.. 几次它给出了很好的结果,但大多数时候它失败了....我正在寻找一些更好的偏斜校正算法,或者如果这是正确的,那么这是什么错误......如果有人在此类问题上有经验,那么他们可以尝试我附上的图片
-
也许如果倾斜角度为17,您需要旋转-17作为校正?显然,我在猜测,但我相信一些测试会有所帮助。
-
上述代码返回的倾斜角度不正确..例如我上面显示的图像实际上是这个算法的输出,最初它有点倾斜,现在它更倾斜