如何在嵌套循环中构建文件名

How to build filenames in a nested loop

我正在尝试访问 4k 图像并裁剪一些基于 ROI 的区域(在我的例子中是 4 个 ROI)并将它们存储在某个目录中。到目前为止一切正常,除了文件名的循环处理。

下面附上我的代码。我正在访问 N 4k 图像,将它们裁剪并调整为我想要的分辨率。最后,当我尝试保存数据时,图像被覆盖了。

N=2;
for img = 1:N
    x = gTruth.LabelData.crack{img,1}

    for i=1:4
        Cells = x(i,1:4)

        baseFileName = theFiles(img).name;
        fullFileName = fullfile(myFolder, baseFileName);
        fprintf(1, 'Now reading %s\n', fullFileName);
        imageArray = imread(fullFileName);
        CroP = imcrop(imageArray,Cells);
        imshow(CroP);
        B = imresize(CroP,[256 256]);
        imshow(B);
        imwrite(B,strcat('C:\Users\USER\Desktop\Directory\imagefile_00',num2str(i),'.png'));
    end
end

我的问题是,在循环 i 运行后,它保存了 4 个图像,而对于 img,它再次保存了四个值。现在,当代码运行时,它只保存最后 4 张图像,而不是 8 张。我应该得到 i*N 个图像总数,但我只得到 4 个,其余的被覆盖。

如何调整我的程序以保存所有文件?

imwrite(B,strcat('C:\Users\USER\Desktop\Directory\imagefile_00',num2str(i),'.png'));

就是问题所在。您使用 num2str(i) 更改数字,并使用 i=[1,2,3,4]。因此,您不能创建数字 1 到 4 之外的文件。如果您也想要基于 img 的东西,您可以使用例如

imwrite(B,strcat('C:\Users\USER\Desktop\Directory\imagefile_',num2str(img),num2str(i),'.png'));

这将为第一张图像和第一个区域创建一个名为 imagefile_11 的文件,为第一张图像、第二个区域创建一个名为 imagefile_12 的文件,为第 32 个图像、第四个区域等创建一个名为 imagefile_324 的文件.当然根据你的需要改。

实际示例:

>> i=3;img=1;
>> strcat('C:\Users\USER\Desktop\Directory\imagefile_',num2str(img),num2str(i),'.png')

ans =

C:\Users\USER\Desktop\Directory\imagefile_13.png

>> i=1;img=2;
>> strcat('C:\Users\USER\Desktop\Directory\imagefile_',num2str(img),num2str(i),'.png')

ans =

C:\Users\USER\Desktop\Directory\imagefile_21.png

免费咨询:

  • i and j are the imaginary unit。在我看来,最好不要将它们用作循环索引。

  • 您的桌面很可能不是保存内容的最佳位置。例如,在您的 Documents 文件夹中创建一个具有适当名称的文件夹,例如C:\Users\USER\Documents\ROIfrom4k\

  • xCells 的声明将受益于行上的结束分号,以防止它们输出到控制台,减慢程序和阻塞命令 window。 MATLAB 放在那里的橙色摆动不是为了庆祝,它们提供了一个有用的警告。 (不要与红色摆动混淆,那些会出现严重错误,因此 MATLAB 根本无法 运行。)