【问题标题】:Skewed image - Not able to detect horizontal lines using CV2倾斜的图像 - 无法使用 CV2 检测水平线
【发布时间】: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作为校正?显然,我在猜测,但我相信一些测试会有所帮助。
  • 上述代码返回的倾斜角度不正确..例如我上面显示的图像实际上是这个算法的输出,最初它有点倾斜,现在它更倾斜

标签: opencv cv2


【解决方案1】:

基于 ImageMagick 的 Python Wand 具有纠偏功能。

输入:


from wand.image import Image
from wand.display import display

with Image(filename='table.png') as img:
    img.deskew(0.4*img.quantum_range)
    img.save(filename='table_deskew.png')
    display(img)


结果:

【讨论】:

  • 谢谢..它似乎适用于这张图片......但它是否也适用于其他图片或阈值 0.4*img.quantum_range 仅针对此图片定制?
  • 0.4*img.quantum_range 的阈值是几乎所有图像的典型值,尤其是白色背景上的黑色文本。但是,如果文本行数太少,则可能效果不佳。文本行越多越好。
  • 你知道阈值代表什么的实际“单位”吗,Fred? 40% 什么?
  • 马克,不,我没有。它是氡变换中的某个内部阈值。您必须查看代码才能了解它是如何使用的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-05
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
相关资源
最近更新 更多