在Python中检测线的倾斜度[关闭]

Posted

技术标签:

【中文标题】在Python中检测线的倾斜度[关闭]【英文标题】:Detect inclination of lines in Python [closed] 【发布时间】:2021-01-04 19:49:53 【问题描述】:

我正在创建一个系统,该系统将能够注册手写文本的人,稍后我将不得不分析此图像并检测文字是升序、降序还是直线。使用笔迹学,我将能够创建此人的个人资料,但我不知道如何分析该图像。

使用 Python 和 Django 的系统,我只需要读取图像即可进行此分析。有人对如何做有建议吗?

【问题讨论】:

请从intro tour 重复on topic 和how to ask。 “告诉我如何解决这个编码问题”不是堆栈溢出问题。我们希望您做出诚实的尝试,然后然后就您的算法或技术提出一个具体的问题。 也许应用一些形态学来获得一组漂亮的斑点并将一条直线拟合到它们的水平坐标上,然后计算直线和 0 度参考之间的逆时针角度。 从形态学后的轮廓中获取旋转矩形边界框(minAreaRect)的角度,将文字字符连接成一个连续区域 非常有趣的问题,但不幸的是,SO 不是问这个问题的正确地方。我过去做过类似的事情。我的建议是缩小输入图像,然后尝试拟合一条直线。您只需要该线的斜率来确定基线是上升还是下降等。一个更有趣的问题是当您想要计算给定手写文本的倾斜度(笔迹学术语)时。如果您碰巧活跃在允许此类讨论的其他论坛中,我将很乐意继续对话。 类似于@Raiyan 建议的内容。您也可以尝试使用minAreaRect 找到写作中点集的最小面积矩形,或者尝试使用fitEllipse 在点集周围拟合椭圆。两者都会给你一个RotatedRect,你可以从中获得角度。 【参考方案1】:

一个可能的解决方案是使用给你角度的minAreaRect()。一旦你有了它,只需设置你的阈值来判断写作是否为['Ascending', 'Descending', 'Level']

write = cv2.imread('your_image.png', cv2.IMREAD_COLOR)
write_gray = cv2.cvtColor(write, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(write_gray, 150, 255, cv2.THRESH_BINARY_INV)
# dilate the write
elem = cv2.getStructuringElement(cv2.MORPH_RECT, (4, 4), (2, 2))
dilat = cv2.dilate(thresh, elem, iterations=1)
contours, hierarchy = cv2.findContours(dilat, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

for cnt in contours:
    if cv2.contourArea(cnt) > 1600: # only keep the writing text
        box = cv2.minAreaRect(cnt)
        (pos, size, angle) = box
        box = cv2.boxPoints(box)
        box = np.int0(box)
        cv2.drawContours(write, [box], 0, (0,255,0), 2)
        angle = angle if size[0] > size[1] else angle + 90
        pos = (cnt[cnt[:, :, 0].argmin()][0][0], cnt[cnt[:, :, 1].argmin()][0][1])
        #print(angle)
        if -2 <= angle <= 2:
            cv2.putText(write, 'Level', pos, cv2.FONT_HERSHEY_SIMPLEX, 0.7, (190, 123, 68), 2)
        elif angle < -2:
            cv2.putText(write, 'Ascending', pos, cv2.FONT_HERSHEY_SIMPLEX, 0.7, (190, 123, 68), 2)
        elif 2 < angle:
            cv2.putText(write, 'Descending', pos, cv2.FONT_HERSHEY_SIMPLEX, 0.7, (190, 123, 68), 2)

cv2.imshow('resultat', write)

你会得到这样的东西:

【讨论】:

不错的解决方案! ?? 远远超过这个 OP 应得的但很好。

以上是关于在Python中检测线的倾斜度[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

拓端tecdat|图像倾斜校正算法的MATLAB代写实现:图像倾斜角检测及校正

图像倾斜校正算法的MATLAB实现:图像倾斜角检测及校正

使用opencv将旋转和倾斜的图像插入另一个图像中检测到的矩形?

opencv图片倾斜度检测

为增强现实类型的应用检测 Android 手机倾斜、旋转等的精确变化

求MATLAB图像处理的程序:倾斜图像的检测与校正。最后的结果是要那个倾斜角度和校正后的图像