如何使用 OpenCV 和 Python 从图像中分离出手写文本?
How do I isolate handwritten text from an image using OpenCV and Python?
如何使用 OpenCV 和 Phyton 为图像仅分离或裁剪手写文本:
我试过使用:
cv2.findContours
但由于噪音(背景和纸张脏)我无法只拿到纸张。
我该怎么做?
要平滑嘈杂的图像,典型的方法是应用某种类型的模糊滤镜。例如 cv2.GaussianBlur()
、cv2.medianBlur()
或 cv2.bilaterialFilter()
可用于去除 salt/pepper 噪音。模糊后,我们可以阈值得到二值图像,然后进行形态学操作。从这里,我们可以找到轮廓并使用纵横比或轮廓区域进行过滤。要裁剪 ROI,我们可以使用 Numpy 切片
检测到文本
提取的投资回报率
代码
import cv2
image = cv2.imread('1.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.medianBlur(gray, 5)
thresh = cv2.adaptiveThreshold(blur,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV,11,8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
dilate = cv2.dilate(thresh, kernel, iterations=6)
cnts = cv2.findContours(dilate, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
cnts = sorted(cnts, key=cv2.contourArea, reverse=True)
for c in cnts:
x,y,w,h = cv2.boundingRect(c)
ROI = image[y:y+h, x:x+w]
cv2.imwrite('ROI.png', ROI)
break
cv2.imshow('thresh', thresh)
cv2.imshow('dilate', dilate)
cv2.imshow('ROI', ROI)
cv2.waitKey()
如何使用 OpenCV 和 Phyton 为图像仅分离或裁剪手写文本:
我试过使用:
cv2.findContours
但由于噪音(背景和纸张脏)我无法只拿到纸张。
我该怎么做?
要平滑嘈杂的图像,典型的方法是应用某种类型的模糊滤镜。例如 cv2.GaussianBlur()
、cv2.medianBlur()
或 cv2.bilaterialFilter()
可用于去除 salt/pepper 噪音。模糊后,我们可以阈值得到二值图像,然后进行形态学操作。从这里,我们可以找到轮廓并使用纵横比或轮廓区域进行过滤。要裁剪 ROI,我们可以使用 Numpy 切片
检测到文本
提取的投资回报率
代码
import cv2
image = cv2.imread('1.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.medianBlur(gray, 5)
thresh = cv2.adaptiveThreshold(blur,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV,11,8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
dilate = cv2.dilate(thresh, kernel, iterations=6)
cnts = cv2.findContours(dilate, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
cnts = sorted(cnts, key=cv2.contourArea, reverse=True)
for c in cnts:
x,y,w,h = cv2.boundingRect(c)
ROI = image[y:y+h, x:x+w]
cv2.imwrite('ROI.png', ROI)
break
cv2.imshow('thresh', thresh)
cv2.imshow('dilate', dilate)
cv2.imshow('ROI', ROI)
cv2.waitKey()