如何仅提取图像中手写文字对应的轮廓?
如何从图像中提取仅属于手写文字的轮廓?
嘿,我看你现在的代码能提取图像里所有的轮廓,但你只想保留手写文字的部分对吧?这其实不难,我们可以通过预处理增强文字特征加上轮廓过滤来实现,下面我给你调整代码并解释关键点:
核心思路
手写文字的轮廓通常有这些特点:面积不会太小(排除噪点)、也不会太大(排除图像边框、大色块),而且边缘相对连续。我们基于这些特征来过滤掉无关轮廓。
修改后的完整代码
import cv2 import matplotlib.pyplot as plt # 替换成你的图像路径 img = cv2.imread("your_image_path.jpg") print("img shape=", img.shape) # 1. 预处理:降噪 + 二值化,增强文字与背景的对比度 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 高斯模糊降噪,减少无关边缘 blurred = cv2.GaussianBlur(gray, (5, 5), 0) # 二值化:把文字变成白色,背景黑色(THRESH_BINARY_INV是反转,根据你的图像调整) _, thresh = cv2.threshold(blurred, 127, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) # 2. 提取边缘 edged = cv2.Canny(thresh, 30, 200) cv2.imshow("Canny Edges", edged) cv2.waitKey(1) # 3. 查找所有轮廓 contours, hierarchy = cv2.findContours(edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) print("原始轮廓数量 = " + str(len(contours))) # 4. 过滤出仅手写文字的轮廓 filtered_contours = [] # 这里的面积阈值需要根据你的图像调整,比如我设的是50到5000,你可以测试后修改 min_area = 50 max_area = 5000 for c in contours: area = cv2.contourArea(c) if min_area < area < max_area: filtered_contours.append(c) print("过滤后手写文字轮廓数量 = " + str(len(filtered_contours))) # 5. 绘制过滤后的轮廓 cv2.drawContours(img, filtered_contours, -1, (0, 255, 0), 3) cv2.imshow('仅手写文字轮廓', img) cv2.waitKey(0) cv2.destroyAllWindows() # 最后别忘了释放窗口
关键细节说明
- 高斯模糊:
cv2.GaussianBlur(blurred, (5,5), 0)可以去除图像里的小噪点,避免这些噪点被识别成轮廓。 - 二值化:用
THRESH_OTSU可以自动计算合适的阈值,不用手动调;THRESH_BINARY_INV是反转颜色,确保文字是前景(白色),如果你的图像文字是黑色、背景白色,可以去掉这个反转参数。 - 轮廓面积过滤:
min_area和max_area是关键,你可以根据自己的手写文字大小调整——比如如果你的文字很大,就调大max_area;如果有很多小噪点,就调大min_area。
如果你的图像还有其他干扰(比如表格线),还可以加一步形态学操作,比如用cv2.morphologyEx开运算去掉细线条,进一步净化图像~
内容的提问来源于stack exchange,提问作者henry
相关产品推荐
相关产品推荐

