记得挺早之前做过一个深度学习相关的小项目,里面要用到大量的图片,但是图片的名字不规整,而且一张一张处理起来太浪费时间,于是做了好久才写出来,但是看着很别扭感觉,今天重新整理一下批量命名和处理图片。
1、批量命名图片,参考博文:https://blog.csdn.net/lewky_liu/article/details/80490585
写一个脚本文件:process.bat,放在你想要的重命名的图片的相同目录下,文件内容如下:
@echo off
set a=-1
setlocal EnableDelayedExpansion
for %%n in (*.jpg) do (
set /A a+=1
ren "%%n" "Train_!a!.jpg"
)
上述代码可以将同目录下所有图片规范命名,命名格式为“Train_0.jpg" “Train_n.jpg"。
看一下效果,
处理前:
处理后(点击.bat文件,记得先把360关掉,有毒):
处理过后的图片可以用在第二步的批量处理图片
2、批量处理图片+规范保存图片名(原创,转载请注明出处:https://blog.csdn.net/hzpzlz5211314/article/details/83141187)
话不多说,直接上代码:
#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
using namespace cv;
using namespace std;
int main()
{
string fileName, destFiles;
string pattern_jpg = "F:\\image\\*.jpg"; //原始图片所在路径,可自行修改
vector<String> image_files;
glob(pattern_jpg, image_files);
/*
void cv::glob ( String pattern, std::vector< String > & result, bool recursive = false)
作用:将pattern路径下所有文件名存入result中
*/
if (image_files.size() == 0) //判断是否读取到图片
{
cout << "No image files[jpg]" << endl;
return 0;
}
for (unsigned int i = 0; i < image_files.size(); ++i) //image_file.size()代表文件中总共的图片个数
{
//int 转换为 string
stringstream ss1;
string str1;
ss1 << i;
ss1 >> str1;
//为了方便,在“源.cpp”同级目录下建立srcImage和grayImage,分别用于保存原图和灰度图
fileName = "srcImage/Train_" + str1 + ".jpg"; //根据图片的名称读取批量命名好的图片,也可以用绝对路径
destFiles = "grayImage/Test_" + str1 + ".jpg"; //处理后的文件路径及图片名,图片名为"Test_0.jpg"
//cout << fileName << endl;
/*
在这里对图片进行操作
*/
//下述操作为灰度图转换:
Mat srcImage = imread(fileName, 1);
Mat grayImage;
//imshow(grayFile, grayImage); //只会显示文件夹中最后一张图片,因为被覆盖了
cvtColor(srcImage, grayImage, CV_BGR2GRAY); //opencv库函数,转换为灰度图(原图不能为灰度图,否则会报错)
imwrite(destFiles, grayImage); //将图片写入到grayImage目录下
}
cout << "批量转换成功" << endl;
system("pause");
return 0;
}
看一下效果,要将第一步批量重命名后的图片拷贝至srcImage文件夹下:
处理前:
批量处理后(灰度图):
你也可以在其中对图像做不同的处理,不仅仅是灰度转换!这样就可以完成深度学习的前期处理
完美!