You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅提取图像中手写文字对应的轮廓?

如何从图像中提取仅属于手写文字的轮廓?

嘿,我看你现在的代码能提取图像里所有的轮廓,但你只想保留手写文字的部分对吧?这其实不难,我们可以通过预处理增强文字特征加上轮廓过滤来实现,下面我给你调整代码并解释关键点:

核心思路

手写文字的轮廓通常有这些特点:面积不会太小(排除噪点)、也不会太大(排除图像边框、大色块),而且边缘相对连续。我们基于这些特征来过滤掉无关轮廓。

修改后的完整代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 23:58:13