从目录中的jpg文件中提取日期的函数
Function to extract date from jpg files in a directory
我有大量 (aprx 10 000) jpg 文件,每个文件上都写有日期。我希望从每个 jpg 中提取日期并将其添加到具有相应文件名的数据框中。
我已经阅读了这个论坛及其他内容,我试图在 R 中拼凑一个函数来执行任务,但我无法让它工作。我使用循环来:
1) 在所选目录中生成图像文件列表
2) 使用一列文件路径和一列为结果创建一个数据框
日期(从 jpg 中提取)
3) 遍历目录中的文件:
调整大小,
裁剪到显示日期的图像部分,
OCR图像,
将日期写入数据框 - 在步骤 2 中创建
当我 运行 这个函数时,这似乎崩溃了,我不太确定为什么。我是 R 用户,但我以前没有写过函数(你可能会说)
我正在使用 R 3.6.0 和 RStudio
library(tesseract)
library(magick)
library(tidyverse)
library(gsubfn)
get_jpeg_date <- function(folder) {
file_list <- list.files(path=folder, pattern="*.jpg", recursive = T)
image_dates <- as.data.frame(file_list)
image_dates $ ImageDate <- rep_len(x = NA, length.out = length(file_list))
eng <- tesseract("eng")
for (i in length(file_list) ) {
ImageDate <- image_read(paste(folder,"\",file_list, sep = ""))%>%
image_resize("2000") %>%
image_crop("300x100+1800") %>%
tesseract::ocr(engine = eng) %>%
strapplyc("\d+/\d+/\d+", simplify = TRUE)%>%
image_dates[,i]
}
}
x <- get_jpeg_date(folder = folder)
folder <- "C:/file_path"
x <- get_jpeg_date(folder = folder)
循环中的代码适用于单个文件,但是当我 运行 函数在 3 个 jpg 图像的小测试样本上时没有输出。
考虑 re-factoring 您的函数在单个 jpg 文件上 运行,然后使用 sapply
或 map
为其分配列。在 R 中,函数的最后一行是 return 对象。由于 for
循环不是最后一个过程,函数将 return OCR 和 regex-ed 字符串向量。
get_jpeg_date <- function(pic) {
eng <- tesseract("eng")
image_read(pic) %>%
image_resize("2000") %>%
image_crop("300x100+1800") %>%
tesseract::ocr(engine = eng) %>%
strapplyc("\d+/\d+/\d+", simplify = TRUE)
}
file_list <- list.files(path=folder, pattern="*.jpg", full.names = TRUE, recursive = TRUE)
# DATA FRAME BUILD
image_dates_df <- data.frame(img_path = file_list)
# COLUMN ASSIGNMENT
image_dates_df$img_date <- sapply(image_dates_df$img_path, get_jpeg_date)
# ALTERNATIVELY WITH dplyr::mutate() and purrr:map()
image_dates_df <- data.frame(img_path = file_list) %>%
mutate(img_date = map(img_path, get_jpeg_date))
我有大量 (aprx 10 000) jpg 文件,每个文件上都写有日期。我希望从每个 jpg 中提取日期并将其添加到具有相应文件名的数据框中。
我已经阅读了这个论坛及其他内容,我试图在 R 中拼凑一个函数来执行任务,但我无法让它工作。我使用循环来:
1) 在所选目录中生成图像文件列表
2) 使用一列文件路径和一列为结果创建一个数据框 日期(从 jpg 中提取)
3) 遍历目录中的文件: 调整大小, 裁剪到显示日期的图像部分, OCR图像, 将日期写入数据框 - 在步骤 2 中创建
当我 运行 这个函数时,这似乎崩溃了,我不太确定为什么。我是 R 用户,但我以前没有写过函数(你可能会说)
我正在使用 R 3.6.0 和 RStudio
library(tesseract)
library(magick)
library(tidyverse)
library(gsubfn)
get_jpeg_date <- function(folder) {
file_list <- list.files(path=folder, pattern="*.jpg", recursive = T)
image_dates <- as.data.frame(file_list)
image_dates $ ImageDate <- rep_len(x = NA, length.out = length(file_list))
eng <- tesseract("eng")
for (i in length(file_list) ) {
ImageDate <- image_read(paste(folder,"\",file_list, sep = ""))%>%
image_resize("2000") %>%
image_crop("300x100+1800") %>%
tesseract::ocr(engine = eng) %>%
strapplyc("\d+/\d+/\d+", simplify = TRUE)%>%
image_dates[,i]
}
}
x <- get_jpeg_date(folder = folder)
folder <- "C:/file_path"
x <- get_jpeg_date(folder = folder)
循环中的代码适用于单个文件,但是当我 运行 函数在 3 个 jpg 图像的小测试样本上时没有输出。
考虑 re-factoring 您的函数在单个 jpg 文件上 运行,然后使用 sapply
或 map
为其分配列。在 R 中,函数的最后一行是 return 对象。由于 for
循环不是最后一个过程,函数将 return OCR 和 regex-ed 字符串向量。
get_jpeg_date <- function(pic) {
eng <- tesseract("eng")
image_read(pic) %>%
image_resize("2000") %>%
image_crop("300x100+1800") %>%
tesseract::ocr(engine = eng) %>%
strapplyc("\d+/\d+/\d+", simplify = TRUE)
}
file_list <- list.files(path=folder, pattern="*.jpg", full.names = TRUE, recursive = TRUE)
# DATA FRAME BUILD
image_dates_df <- data.frame(img_path = file_list)
# COLUMN ASSIGNMENT
image_dates_df$img_date <- sapply(image_dates_df$img_path, get_jpeg_date)
# ALTERNATIVELY WITH dplyr::mutate() and purrr:map()
image_dates_df <- data.frame(img_path = file_list) %>%
mutate(img_date = map(img_path, get_jpeg_date))