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

求助:如何用OpenCV提取图像中黑色文本并去除其余内容?

嘿,我完全懂这种挫败感——用常规阈值处理CRV图像的黑色文本总是翻车,逐像素遍历又慢得离谱。给你几个我实战过的靠谱方案,应该能解决你的问题:

方案1:换个颜色空间做精准阈值分割

RGB空间对亮度变化太敏感,咱们转成HSV或者Lab空间试试,这俩空间能把颜色和亮度分离,更容易锁定黑色文本:
比如用HSV空间,黑色的特征是低饱和度+低亮度,代码示例(OpenCV):

import cv2
import numpy as np

# 读取图像
img = cv2.imread("your_crv_image.jpg")
# 转HSV颜色空间
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# 定义黑色的HSV范围(可根据实际图像微调)
lower_black = np.array([0, 0, 0])
upper_black = np.array([180, 255, 30])

# 提取黑色区域
mask = cv2.inRange(hsv, lower_black, upper_black)
# 把非黑色区域转纯白,黑色保留
result = cv2.bitwise_and(img, img, mask=mask)
result[mask == 0] = [255, 255, 255]

cv2.imwrite("extracted_text.jpg", result)
方案2:形态学操作补全阈值缺陷

如果阈值后文本有断连、背景有小噪点,用形态学操作优化:

# 接上面的mask
kernel = np.ones((2,2), np.uint8)
# 先腐蚀去掉小噪点,再膨胀修复文本断连
clean_mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
# 生成最终结果
result = cv2.bitwise_and(img, img, mask=clean_mask)
result[clean_mask == 0] = [255, 255, 255]
方案3:用OCR工具先定位再分割

如果图像背景特别复杂,先让OCR模型定位文本区域,再针对性处理:
以EasyOCR为例(不用训练,直接用预训练模型):

import easyocr
import cv2

reader = easyocr.Reader(['en']) # 根据文本语言调整
result = reader.readtext("your_crv_image.jpg")

img = cv2.imread("your_crv_image.jpg")
# 创建纯白背景图
output = np.ones_like(img) * 255

# 遍历每个检测到的文本框,把对应区域的黑色文本复制到纯白背景
for (bbox, text, prob) in result:
    (top_left, top_right, bottom_right, bottom_left) = bbox
    top_left = tuple(map(int, top_left))
    bottom_right = tuple(map(int, bottom_right))
    # 提取文本区域
    text_region = img[top_left[1]:bottom_right[1], top_left[0]:bottom_right[0]]
    # 把区域内的非黑色转纯白(用之前的HSV方法)
    hsv = cv2.cvtColor(text_region, cv2.COLOR_BGR2HSV)
    mask = cv2.inRange(hsv, lower_black, upper_black)
    text_region[mask == 0] = [255,255,255]
    # 复制到输出图
    output[top_left[1]:bottom_right[1], top_left[0]:bottom_right[0]] = text_region

cv2.imwrite("extracted_text.jpg", output)
方案4:优化像素遍历(用NumPy向量化代替循环)

你之前的逐像素循环太慢,是因为Python循环效率低,用NumPy的向量化操作能提速几十倍:

import cv2
import numpy as np

img = cv2.imread("your_crv_image.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 定义近黑色阈值(可微调)
black_thresh = 30
# 批量处理:小于阈值的留黑,其余转白
final_img = np.where(gray < black_thresh, 0, 255).astype(np.uint8)
cv2.imwrite("extracted_text.jpg", final_img)

这些方案里,我最常用的是方案1+方案2的组合,大部分CRV图像的黑色文本都能完美提取;如果背景特别乱,就用方案3。

内容的提问来源于stack exchange,提问作者gravatasufoca

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:49:20