批量读取图片保存为csv文件

  • 工具

采取QT5.6.1+opencv2.4.9 
本文以实现将手写数字图片转化为csv文件列子

  • 实现思路: 
    -1.将手写数字以分类在不同文件夹中(0-9)如下图所示:这里写图片描述
    -2.将所有图片的路径加载到txt文件中dir /b/s *.png > image.txt;生成的txt文件如下图:这里写图片描述
    -3.创立QFile csvFile(FILE_PATH),FILE_PATH为最终生产的csv文件的路径位置; 
    打开:csvFile.open(QIODevice::ReadWrite) 
    这里需要用ifstream进行文件流读取
  ifstream getNamelist(picTXTtoute);//picTXTtoute:为image.txt的位置(string)
  while(getline(getNamelist,ImgName))//读入txt的一行到ImgName,从而获取了第一幅图片的路径,反复读取,则实现了对图片的批量处理。
  • 1
  • 2
  • 3

-4我们以每类图片所在文件夹的名字作为其标签(label),为了使生产的csv文件为(标签+像素值 像素值 像素值….)的结构我们现在需要获取每个ImgName的第56位字符,即(0-9),我们可以用以下句法实现

  QString Dirroute =QString::fromStdString(ImgName);//为了得到标签(所以对与文件夹和图片的命名要有规律)
  QString Midroute = Dirroute.mid(56,1);//标签位置
  Midroute.append(",");//为转换为csv文件加“,”只要不是图片的最后一个像素那都是(像素值,)结构,最后一个像素那就是(像素值\n)结构;
  • 1
  • 2
  • 3

注意在将(像素值,)(像素值\n)写入csvFile中的时候,我们需要Midroute转换为哦ascii码,在QT中用下面的语句实现

csvFile.write(Midroute.toLatin1());//这个是QFile::write()类型必须的,QString转换为ascii的句法。
  • 1

至此我们已经将第一幅图片的标签写入了csv文件中,如下图绿色框选的位置 
这里写图片描述
-5我们在进行图片像素的写入之前,我们需要知道几个小知识点,第一:我们的图片是三通道的,即一个像素点需要用三个像素值表示,在我们得到图片的rows和cols的之后,我们要将其存储的1*N的矩阵中,这个N不是rows*cols 而是rows*cols*3; 
第二:本文用at去访问像素点,所以我们要提前知道Mat的数据类型,这里我们的图片Mat类型是uchar,uchar c = image.at(i,j);第二:用at访问的时候,image.at(i,j)实际访问的是(j,i)像素点的值;第三:为了在读取后的像素值后面加上“,”或者“\n”我们需要用到下面的知识点:

QString i = "iTest";           // current file's number  
QString total = "totalTest";       // number of files to process  
QString fileName = "fileNameTest";    // current file's name  

QString status = QString("Processing file %1 of %2: %3")  
                .arg(i).arg(total).arg(fileName);  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

记住最后QString要抓还为ascii才能写入csv; 
-6最后,要用csvFile.close();结束csv文件操作

下面上代码: 
.cpp

void ImagePreprocessing::writeImageToCSV(string picTXTtoute)
{
    QString str;
    QFile csvFile(FILE_PATH);//创建QFile对象 csvFile,File_PATH为csvFile文件保存的路径及类型
    Mat inputImage;//接受从txt文件读入路径的图片
    string ImgName; //接受从txt文件中读入图片的路径
    int rows,cols;
    ifstream getNamelist(picTXTtoute);//读取保存了图片路径和格式的txt文档
    if(csvFile.open(QIODevice::ReadWrite))//打开文件,进行操作
    {
        while(getline(getNamelist,ImgName))//读入一行,\n为结束符
        {
            QString Dirroute =QString::fromStdString(ImgName);//为了得到标签(所以对与文件夹和图片的命名要有规律)
            QString Midroute = Dirroute.mid(56,1);//标签位置
            Midroute.append(",");//为转换为csv文件加“,”

            csvFile.write(Midroute.toLatin1());//这个是QFile::write()类型必须的,QString转换为ascii的句法。写在没个图片的前面,作为标签号
            //            qDebug() << Midroute;
            //        cout<< ImgName <<endl; //路径输出
            inputImage = imread(ImgName);
            if(!inputImage.data)//异常退出
                return;
            rows = inputImage.rows;
            cols = inputImage.cols;
            int flagNum = rows * cols * 3;
            int countNum = 0;
            //            cout << flagNum << endl;
            for(int i = 0; i <rows; i++)//把衣服图片转换为N*1的矩阵。
            {
                for(int j = 0; j< cols * 3; j++)
                {
                    countNum++;
                    uchar c = inputImage.at<uchar>(i,j);//用at操作,事前就要知道Mat中数据存储类型,uchar,flaot,或者其他。
                    if(countNum == flagNum)
                    {
                        str = QString("%1\n").arg(c);//最后一个像素,在后面添加\n作为行结束符号
                        //                        qDebug() << str;
                    }
                    else
                        str = QString("%1,").arg(c);//非最后一个像素值,则用逗号,隔开数据。
                    csvFile.write(str.toLatin1());//csvFile。write()遇到\n则会换行进行写,遇到的是“,”则继续在逗号后面写入数据
                    //                                   qDebug() << str;
                }
            }
        }
    }
    csvFile.close();//写完以后记住要关闭csv文件,正常结束
    return;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33789319/article/details/78965196
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来给您提供一下代码,需要先安装一下`numpy`和`opencv-python`库: ```python import os import cv2 import numpy as np import csv # 定义灰度共生矩阵计算函数 def glcm_feature(img_gray, d_x, d_y): max_gray = img_gray.max() + 1 glcm = np.zeros((max_gray, max_gray), dtype=np.uint32) for i in range(img_gray.shape[0]-d_x): for j in range(img_gray.shape[1]-d_y): glcm[img_gray[i][j]][img_gray[i+d_x][j+d_y]] += 1 # 归一化 glcm /= np.sum(glcm) # 计算特征 contrast = 0 homogeneity = 0 energy = 0 correlation = 0 for i in range(max_gray): for j in range(max_gray): contrast += ((i-j)**2) * glcm[i][j] homogeneity += glcm[i][j] / (1 + (i-j)**2) energy += glcm[i][j]**2 correlation += (i*j*(glcm[i][j]-np.sum(glcm[i,:])*np.sum(glcm[:,j]))) / (np.sqrt(np.var(glcm[i,:]))*np.sqrt(np.var(glcm[:,j]))) return contrast, homogeneity, energy, correlation # 定义目标文件路径 folder_path = r'C:\Users\example\images' # 获取目标文件夹下所有图片文件名 img_names = [f for f in os.listdir(folder_path) if f.endswith('.jpg') or f.endswith('.png')] # 定义特征列表 features = [] # 遍历所有图片,计算特征并保存到列表 for img_name in img_names: # 读取图片并转换为灰度图像 img = cv2.imread(os.path.join(folder_path, img_name)) img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 计算特征 contrast, homogeneity, energy, correlation = glcm_feature(img_gray, 1, 0) # 将特征保存到列表 features.append([img_name, contrast, homogeneity, energy, correlation]) # 将特征列表保存csv文件 with open('features.csv', 'w', newline='') as csvfile: writer = csv.writer(csvfile) writer.writerow(['image name', 'contrast', 'homogeneity', 'energy', 'correlation']) writer.writerows(features) ``` 这段代码会遍历指定文件夹下的所有`.jpg`和`.png`图片,计算每张图片的特征,并将结果保存到`features.csv`文件。其`glcm_feature()`函数是用于计算灰度共生矩阵特征的函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值