我正在努力将大量图像文件(png)转换为文本文件。我有基本的代码来逐个执行此操作,这非常耗时。我的过程涉及将图像文件转换为黑白格式,然后使用tesseract将其转换为文本文件。这个过程很有效,但如果逐个文件完成,我需要几天才能完成我的任务。 这是我的代码:
for f in $1
do
echo "Processing $f file..."
convert $f -resample 200 -colorspace Gray ${f%.*}BW.png
echo "OCR'ing $f"
tesseract ${f.*}BW.png ${f%.*} -l tla -psm 6
echo "Removing black and white for $f"
rn ${f%.*}BW.png
done
echo "Done!"
有没有办法同时对每个文件执行此过程,也就是说,我如何能够同时运行此过程而不是逐个运行?我的目标是显着减少将这些图像转换为文本文件所需的时间。
提前致谢。
答案 0 :(得分:1)
您可以将for循环的内容设为函数,然后多次调用该函数,但将所有内容全部发送到后台,以便执行另一个函数。
function my_process{
echo "Processing $1 file..."
convert $1 -resample 200 -colorspace Gray ${1%.*}BW.png
echo "OCR'ing $1"
tesseract ${1.*}BW.png ${1%.*} -l tla -psm 6
echo "Removing black and white for $1"
rn ${1%.*}BW.png
}
for file in ${files[@]}
do
# & at the end send it to the background.
my_process "$file" &
done
答案 1 :(得分:1)
我要感谢贡献者@Songy和@shellter。 为了回答我的问题...我最终使用GNU Parallel来使这些进程以5为间隔运行。这是我使用的代码:
parallel -j 5 convert {} "-resample 200 -colorspace Gray" {.}BW.png ::: *.png ; parallel -j 5 tesseract {} {} -l tla -psm 6 ::: *BW.png ; rm *BW.png
我现在正在拆分我的数据集,以便与我(非常大的)图像池的不同子组同时运行此命令。
干杯