matlab-python代码对大的图片裁剪,随机裁剪,按概率裁剪

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
# import torchvision.transforms as transforms

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 = cv2.imread(path + "/" + file, 0)
            I = Image.open(path + "/" + file)
            # cv2.imshow('image', I)
            [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))
                # y = random.randint(0, height - crop_size)
                # x = random.randint(0, width - crop_size)
                cropImg = I.crop((x, y, x + crop_size, y + crop_size))  # (left, upper, right, lower)
                cropImg.save(output_path_crop + file[0:-6] + '_' + str(j) + '.bmp')
                sub_img = cropImg.resize((kernal_size, kernal_size))
                # sub_img.save(output_path_down + file[0:-6] + '_' + str(j) + '.bmp')
                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)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值