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

为何Tesseract返回的bounding box与图像文本位置无法对齐

R语言tesseract包文本识别边界框绘制问题解答

1. 边界框与文本不对齐的原因

tesseract返回的bbox坐标采用图像坐标系:原点(0,0)在图像左上角,y轴向下递增;而R基础绘图的plot()函数绘制图像时采用的是画布坐标系:原点在左下角,y轴向上递增,两者y轴方向完全相反,直接传入tesseract返回的y值绘制必然会出现位置偏移。

你需要对y坐标做翻转适配,用图像总高度减去tesseract返回的y值即可:

# 获取图像像素高度
img_height <- image_info(image)$height
text <- text %>% 
  mutate(
    # 翻转y坐标适配基础绘图坐标系
    y1_plot = img_height - y1,
    y2_plot = img_height - y2
  )
# 绘制时使用转换后的坐标
plot(image)
rect(
  xleft = text$x1[1], 
  ybottom = text$y2_plot[1], 
  xright = text$x2[1], 
  ytop = text$y1_plot[1]
)

2. 批量绘制所有文本边界框的简便方法

直接使用magick包内置的image_draw()绘图接口即可,不需要手动转换坐标系,直接使用tesseract返回的原始坐标就能批量绘制:

library(tesseract)
library(magick)
library(tidyverse)

# 读取数据和图像,替换为你本地的图像路径
text <- tesseract::ocr_data("你的图像路径.png")
image <- image_read("你的图像路径.png")

# 拆分坐标列
text <- text %>% 
  separate(bbox, c("x1", "y1", "x2", "y2"), ",") %>% 
  mutate(across(c(x1,y1,x2,y2), as.numeric))

# 初始化绘图画布
image_draw(image)
# 遍历所有识别结果批量绘制边界框
pwalk(list(text$x1, text$y1, text$x2, text$y2, text$word), function(x1,y1,x2,y2,word) {
  # 绘制红色边界框,线宽2
  rect(x1, y1, x2, y2, border = "red", lwd = 2)
  # 可选:在框上方标注识别出的文本
  # text(x1, y1, labels = word, adj = c(0,1), col = "red", cex = 0.8)
})
# 结束绘图,输出带框的图像
dev.off()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 12:24:03