如何在R中用Tesseract识别照片白标签黑字5位数字并批量重命名?
解决方案:自动识别白底黑字标签5位数字并重命名图片
现存问题
- 图像预处理效果不佳,OCR识别准确率低
- 无法从标签的其他文本中分离出唯一的大字体5位数字(标签包含其他数字,目标数字可能重复)
- 无法自动检测图像方向,需手动调整旋转角度
- 未实现识别完成后自动重命名图片的功能
优化后完整代码
library(tesseract) library(magick) library(stringr) library(dplyr) # 初始化OCR引擎,仅保留数字字符 ocr_engine <- tesseract(options = list( tessedit_char_whitelist = "0123456789", load_system_dawg = FALSE, load_freq_dawg = FALSE )) # 图像预处理函数:校正方向、增强对比度、去噪裁剪 preprocess_image <- function(img_path) { image_read(img_path) %>% # 自动校正图像旋转方向 image_orient("auto") %>% # 转换为灰度图 image_convert(type = "Grayscale") %>% # 阈值处理,强化白底黑字对比 image_threshold(type = "white", threshold = "20%") %>% # 去噪处理 image_reducenoise(5) %>% # 裁剪边缘无关区域 image_trim(fuzz = 20) %>% # 放大图像提升OCR识别精度 image_resize("2000x") } # 提取大字体5位数字函数:基于字符尺寸筛选目标数字 extract_large_5digit <- function(img) { # 获取OCR识别的详细数据(含字符边界框尺寸) ocr_data <- ocr_data(img, engine = ocr_engine) # 计算字符平均高度,筛选出高度超过平均值1.5倍的大字体字符 avg_height <- mean(ocr_data$height, na.rm = TRUE) large_chars <- ocr_data %>% filter(height > avg_height * 1.5) %>% arrange(left) # 拼接大字体字符,提取连续5位数字 large_text <- str_c(large_chars$text, collapse = "") target_num <- str_extract(large_text, "\\d{5}") return(target_num) } # 批量处理重命名函数:遍历文件夹图片完成识别与重命名 batch_rename_images <- function(folder_path) { # 获取文件夹内所有图片文件(支持jpg/jpeg/png格式) img_files <- list.files(folder_path, pattern = "\\.(jpg|jpeg|png)$", full.names = TRUE) for (file in img_files) { tryCatch({ processed_img <- preprocess_image(file) target_num <- extract_large_5digit(processed_img) if (!is.na(target_num)) { # 构造新文件名,重复数字添加计数器后缀避免覆盖 new_path <- file.path(folder_path, paste0(target_num, "_", basename(file))) counter <- 1 while (file.exists(new_path)) { new_path <- file.path(folder_path, paste0(target_num, "_", counter, "_", basename(file))) counter <- counter + 1 } # 执行重命名 file.rename(file, new_path) cat("已重命名:", basename(file), "→", basename(new_path), "\n") } else { cat("未识别到目标数字:", basename(file), "\n") } }, error = function(e) { cat("处理出错:", basename(file), "→", e$message, "\n") }) } } # 使用示例:替换为你的图片文件夹路径 batch_rename_images("path/to/your/image/folder")
关键改进说明
- 自动方向校正:通过
image_orient("auto")调用ImageMagick自动旋转功能,无需手动调整角度 - 优化预处理流程:改用
image_threshold替代image_level,精准强化白底黑字对比;调整去噪、裁剪参数减少干扰 - 基于字体大小筛选目标数字:利用
ocr_data获取字符边界框高度,筛选出大字体字符后提取5位连续数字,避免误识别其他小字体数字 - 批量处理与重命名:遍历指定文件夹内所有图片,自动完成识别与重命名;针对重复数字添加计数器后缀,避免文件覆盖
内容的提问来源于stack exchange,提问作者gvash
相关产品推荐
相关产品推荐

