做計算機視覺,或多或少需要用到圖片批量讀取的功能,我在這裏分享兩種比較經常用到的方法。還有後面會總結路徑拼接的方法。
- dir方法讀取
這個方法比較不好的地方就是,他會讀取到.,…這兩個代表根目錄的符號,導致目錄裏的圖片數量比正確的數量多兩個。
所以一般在matlab裏,我們需要從第三個開始遍歷
test_output_folder = 'test_cell_detection_0613_output_cell2_yolov2_crop_900_900_delete';
test_files = dir(test_image_folder);
for k = 3 : length(test_files)
#圖片文件名
baseFileName = test_files(k).name;
#連接上文件夾變成路徑
fullFileName = fullfile(test_image_folder, baseFileName);
I = imread(fullFileName);
#你的處理代碼
end
- 用imageDatastore方法
如果一個圖像文件集合中的每個圖像可以單獨放入內存,但整個集合不一定能放入內存,則可以使用 ImageDatastore 對象來管理。您可以使用 imageDatastore 函數創建 ImageDatastore 對象,指定其屬性,然後使用對象函數導入和處理數據。
testImage = fullfile(input_image_folder_name,'*.png');
number_of_input_images=length(dir(testImage))
%create test image datastore:
imds = imageDatastore(testImage);
for k=1:length(imds_i.Files)
I = readimage(imds_i,k);
#你的處理代碼
end
imageDatastore的4個屬性 imds =
ImageDatastore with properties:
Files: {
’ …\matlab\toolbox\matlab\demos\street1.jpg’;
’ …\matlab\toolbox\matlab\demos\street2.jpg’;
’ …\matlab\toolbox\matlab\imagesci\peppers.png’
… and 1 more
}
ReadSize: 1
Labels: {}
ReadFcn: @readDatastoreImage
路徑方法總結
1.該函數用於將一個文件的完整路徑中各部分提取出來。
[folder,output_base_name,] = fileparts(fullFileName);
[path,name,ext] = fileparts(file);
2.該函數是將文件路徑拼合起來
2.1 通過fullfile函數
fullFileName = fullfile(test_image_folder, baseFileName);
2.2 通過字符串連接的方式
imwrite(I,[test_output_folder,'/',output_base_name,'_output','.png']);
2.3 用sprintf的方式
str = sprintf(formatSpec,A1,…,An)使用formatSpec數組A1,…,An中的數據格式。在str中返回生成的文本。sprintf函數按A1,…,An按列順序設置值的格式。
groundtruthFileName1 = sprintf('%s/%s.png',metalfile,name);
mkdir(groundtruthFileName1);
imwrite(b,groundtruthFileName1);