matlab版本
可以从csv文件读取图片类别,先裁成1000*1000,再下采样成299*299
clear;
path = 'E:\BaiduNetdiskDownload\rockData';%'C:\Users\Administrator\Desktop\6models\0bilater_result';
output_path = 'E:\BaiduNetdiskDownload\rockData\rock-pre\';
path_temp = fullfile(path, '*'); %各种路径
%M = csvread('E:\BaiduNetdiskDownload\B题样例数据\rock_label_1.csv',0,0);
T = readtable('E:\BaiduNetdiskDownload\rockData\rock_label.csv');
C = table2cell(T);
n_pc_dir = dir(path_temp);
kernal_size = 298; %裁剪成299的图片
im_num = length(n_pc_dir);
for s=3:im_num
data = imread(fullfile(path, n_pc_dir(s).name));
center = (size(data)/2);
center = center(1:2);
xmin = floor(center(1)-kernal_size*2-kernal_size/2);
ymin = floor(center(2)-kernal_size*2-kernal_size/2);
for i=0:2 %按中心裁剪,裁9张
xmin = xmin + kernal_size;
ymin = floor(center(2)-kernal_size*2-kernal_size/2);
for j=0:2
ymin = ymin + kernal_size;
crop_image = imcrop(data, [ymin,xmin, kernal_size, kernal_size]); % 使用 imcrop() 函数来裁剪图片,第二个参数的格式为 [XMIN YMIN WIDTH HEIGHT]
% imwrite(crop_image, [fullfile(output_path, n_pc_dir(s).name(1:end-6)) '-' num2str(i*3+j+1) '.bmp']); % 保存文件
name{9*(s-3)+i*3+j+1,1} = [n_pc_dir(s).name(1:end-6) '-' num2str(i*3+j+1)];
idx = find([T{:,1}] == str2num(n_pc_dir(s).name(1:end-6)));
name{9*(s-3)+i*3+j+1,2} = C(idx,2);
end
end
%filename_noise = n_pc_dir(s).name(1:end-4);
end
nameT = cell2table(name);
writetable(nameT,'E:\BaiduNetdiskDownload\rockData\rock_label_pre.csv'); %可以将每个图片的类别放到csv中
python版本
可以按照概率裁剪图片,裁到中间的概率高
import os
import cv2
import random
from PIL import Image
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import torch
def image_downsample(path, output_path_down, output_path_crop, cutNum, crop_size, csv_file_path, kernal_size):
files = os.listdir(path)
name = []
name2 = []
file_data = pd.read_csv(csv_file_path, encoding="gbk")
df1 = file_data[0:len(file_data)]['样本编号'][0:len(file_data)]
arr = np.array(df1)
df2 = file_data[0:len(file_data)]['样本类别'][0:len(file_data)]
arr2 = np.array(df2)
for s in range(len(files)):
file = files[s]
if not os.path.isdir(file):
I = Image.open(path + "/" + file)
[width, height] = I.size
for j in range(cutNum):
y = int((height - crop_size) * (random.gauss(0, 1)+1))
x = int((width - crop_size) * (random.gauss(0, 1)+1))
cropImg = I.crop((x, y, x + crop_size, y + crop_size))
cropImg.save(output_path_crop + file[0:-6] + '_' + str(j) + '.bmp')
sub_img = cropImg.resize((kernal_size, kernal_size))
idx = np.where(arr == int(file[0:-6]))
name.append(file[0:-6] + '_' + str(j))
name2.append(arr2[idx])
test = pd.DataFrame(index=name, data=name2)
test.to_csv(csv_file_path[0:-4] + 'test.csv', encoding='gbk')
if __name__ == '__main__':
path = "E:/BaiduNetdiskDownload/rockData/Rock-1"
output_path_down = "E:/BaiduNetdiskDownload/rockData/Rock_pre_down/"
output_path_crop = "E:/BaiduNetdiskDownload/rockData/Rock_pre_crop_100/"
csv_file_path = "E:/BaiduNetdiskDownload/rockData/rock_label.csv"
crop_size = 224;
cutNum = 100;
kernal_size = 224;
image_downsample(path, output_path_down, output_path_crop, cutNum, crop_size, csv_file_path, kernal_size)