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

