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

如何在OpenCV中替换裁剪矩形框并生成同尺寸文本框?

OpenCV文本框替换与生成问题解决方案

背景说明

已通过OpenCV成功从原始图像中裁剪出包含文本的边界框:

  • 输入图像:包含待识别文本的原始图片
  • 裁剪后的文本框:从原始图中提取出的带文本的矩形区域

实现裁剪的代码如下:

import re
import shutil

from IPython.display import Image

import requests
import pytesseract, cv2

"""参考文本检测与提取方案"""
# 图像预处理开始
# 转换为灰度图
img = cv2.imread('img.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 执行OTSU阈值处理
ret, thresh1 = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU | cv2.THRESH_BINARY_INV)

# 指定结构元素形状与核大小
# 核大小会改变检测到的矩形区域范围,(10,10)会检测单个单词而非整句
rect_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (18, 18))

# 对阈值图像进行膨胀操作
dilation = cv2.dilate(thresh1, rect_kernel, iterations = 1)

# 查找轮廓
contours, hierarchy = cv2.findContours(dilation, cv2.RETR_EXTERNAL,
                                                 cv2.CHAIN_APPROX_NONE)

# 创建图像副本
im2 = img.copy()

for cnt in contours:
    x, y, w, h = cv2.boundingRect(cnt)
    # 在副本上绘制矩形
    rect = cv2.rectangle(im2, (x, y), (x + w, y + h), (0, 255, 0), 2)
    # 裁剪文本区域用于OCR输入
    cropped = im2[y:y + h, x:x + w]
    
cv2.imwrite('image-notxt.png', cropped)
Image(filename='image-notxt.png',  width=200)

问题1:替换裁剪框为清晰文本框

需求:将原始裁剪出的带文本矩形框,替换为白色背景+指定清晰文本的框(目标效果为无原始残留、文本清晰的白色矩形)。

现有代码问题分析

你之前的代码仅处理了单个裁剪区域,未将修改后的区域放回原始图像,且文本位置、大小未适配裁剪框尺寸。

修正实现代码

import re
import pytesseract, cv2
import numpy as np
from IPython.display import Image

img = cv2.imread('img.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh1 = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU | cv2.THRESH_BINARY_INV)
rect_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (18, 18))
dilation = cv2.dilate(thresh1, rect_kernel, iterations = 1)
contours, hierarchy = cv2.findContours(dilation, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

# 保留原始图像副本用于最终输出
output_img = img.copy()

for cnt in contours:
    x, y, w, h = cv2.boundingRect(cnt)
    # 1. 用白色填充原始图像中的裁剪区域
    cv2.rectangle(output_img, (x, y), (x+w, y+h), (255, 255, 255), -1)
    
    # 2. 计算适配裁剪框的文本参数
    target_text = "foobar"
    # 动态调整字体大小,确保文本在框内
    font_scale = min(w/(len(target_text)*10), h/20)
    font_thickness = 1
    # 获取文本尺寸
    (text_width, text_height), _ = cv2.getTextSize(target_text, cv2.FONT_HERSHEY_TRIPLEX, font_scale, font_thickness)
    
    # 3. 计算文本居中位置
    text_x = x + (w - text_width) // 2
    text_y = y + (h + text_height) // 2
    
    # 4. 在填充后的区域绘制文本
    cv2.putText(output_img, target_text, (text_x, text_y), 
                cv2.FONT_HERSHEY_TRIPLEX, font_scale, (0, 0, 0), font_thickness)

# 保存最终结果
cv2.imwrite('replaced_text_box.png', output_img)
Image(filename='replaced_text_box.png', width=200)

关键步骤说明

  • 直接在原始图像副本上用白色填充整个裁剪区域(-1参数表示填充矩形内部)
  • 动态计算字体大小,确保文本适配裁剪框的宽高
  • 计算文本居中坐标,避免文本偏移或超出边界
  • 将修改后的区域直接整合回原始图像,实现完整替换

问题2:创建与裁剪框尺寸相同的文本矩形框

需求:给定字符串,生成与原裁剪框尺寸完全一致的白色背景+文本的独立矩形图像(目标效果为尺寸匹配、文本居中的白色矩形)。

实现代码

import cv2
import numpy as np

# 假设已获取原裁剪框的尺寸(w, h),可从之前的轮廓检测中直接获取
def create_matched_text_box(w, h, text="foobar"):
    # 创建与裁剪框尺寸相同的白色背景图像
    text_box = np.full((h, w, 3), 255, dtype=np.uint8)
    
    # 计算适配的文本参数
    font_scale = min(w/(len(text)*10), h/20)
    font_thickness = 1
    (text_width, text_height), _ = cv2.getTextSize(text, cv2.FONT_HERSHEY_TRIPLEX, font_scale, font_thickness)
    
    # 文本居中
    text_x = (w - text_width) // 2
    text_y = (h + text_height) // 2
    
    # 绘制文本
    cv2.putText(text_box, text, (text_x, text_y), 
                cv2.FONT_HERSHEY_TRIPLEX, font_scale, (0, 0, 0), font_thickness)
    
    return text_box

# 调用示例:假设原裁剪框尺寸为(200, 50)
matched_box = create_matched_text_box(200, 50, "foobar")
cv2.imwrite('matched_text_box.png', matched_box)

关键说明

  • 用np.full创建与原裁剪框尺寸一致的白色背景图像
  • 同样通过动态计算字体大小和居中位置,确保文本在框内合理显示
  • 可直接复用之前轮廓检测得到的w和h参数,实现尺寸完全匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 17:54:31