OpenCV 图像处理问题

目前有一个在做的项目,想要将印刷文稿上的手写下划线和波浪线,转移标注到源pdf文件上,但是一直没有什么很好的处理方法。
直接用ocr检测不到文字中间的下划线和波浪线,之前的想法是想基于Hough检测直线的方法来识别下划线,但是手写的直线和波浪线检测效果也不是很好,并不能检测为是一条完整的直线,而且文字部分也会被检测到。如果利用像素点颜色的的区别的话,下划线颜色偏深也很难提取出来。
想请教一下大家有没有好的思路想法,有部分代码的话就更好啦,非常感谢大家回答,或者有好的建议意见也可以私信我,

【以下回答由 GPT 生成】

解决方案

处理印刷文稿中的手写下划线和波浪线可以采用以下的步骤:

  1. 使用OpenCV读取文稿图片,并将其转换为灰度图像。这可以通过cv2.imread()cv2.cvtColor()函数实现。
  2. 对灰度图像进行二值化处理,将手写标注和背景分开。可以使用cv2.threshold()函数进行简单的阈值分割,或者使用适应性阈值化方法(如自适应高斯阈值化)cv2.adaptiveThreshold()
  3. 对二值图像进行形态学处理,以消除噪声并使手写标注连接成为一个连续的结构。可以使用cv2.dilate()来进行膨胀操作,或者使用cv2.morphologyEx()来进行更复杂的形态学操作。
  4. 使用边缘检测算法找到全部的边缘。可以使用cv2.Canny()函数来检测边缘。
  5. 针对每一个边缘,判断其形状是否符合下划线或波浪线的特征。可以使用霍夫变换cv2.HoughLinesP()来寻找直线段,然后进行进一步的判断。
  6. 筛选出符合要求的边缘,并将它们绘制到源PDF文件上。可以使用cv2.line()函数来绘制直线,或者使用其他图像处理库将边缘信息转换为矢量图形。

以下是一个简单的代码示例,演示如何通过OpenCV处理印刷文稿中的手写下划线和波浪线:

import cv2
import numpy as np

# 读取文稿图片并转换为灰度图像
image = cv2.imread('document.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 对灰度图像进行二值化处理
_, binary = cv2.threshold(gray, 128, 255, cv2.THRESH_BINARY_INV)

# 进行形态学处理,消除噪声并使手写标注连续
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
dilated = cv2.dilate(binary, kernel, iterations=1)
closing = cv2.morphologyEx(dilated, cv2.MORPH_CLOSE, kernel)

# 检测边缘
edges = cv2.Canny(closing, 50, 150, apertureSize=3)

# 霍夫变换,检测直线段
lines = cv2.HoughLinesP(edges, 1, np.pi/180, threshold=100, minLineLength=100, maxLineGap=10)

# 筛选符合要求的直线段,并绘制到源PDF文件上
for line in lines:
    x1, y1, x2, y2 = line[0]
    cv2.line(image, (x1, y1), (x2, y2), (0, 255, 0), 2)

# 显示结果
cv2.imshow('result', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

注意,这只是一个简单的示例代码,具体的参数和处理过程可能需要根据实际情况进行调整和优化。对于更复杂的情况,可能需要使用更高级的图像处理技术来处理手写下划线和波浪线。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^


https://pyimagesearch.com/2020/08/24/ocr-handwriting-recognition-with-opencv-keras-and-tensorflow/

OCR就别想了,准确度很低,可以尝试使用图像处理技术来检测和提取下划线和波浪线。例如,可以使用边缘检测算法(如Canny边缘检测)来检测线条的边缘,然后使用霍夫变换或直线拟合算法来识别和提取线条。针对手写的波浪线,可以尝试使用形态学操作(如腐蚀和膨胀)来平滑线条并提取波浪形状

高级问题

【OpenCV|图像处理】图像与OpenCV基础知识
可以参考下