如何在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
相关产品推荐
相关产品推荐

