python数据增强——对数据预处理(随即裁剪、翻转)

import os
from PIL import Image
import torch.utils.data as data
import torchvision.transforms as transforms
import cv2
import numpy as np
import random

random.seed(2021)


class CamObjDataset(data.Dataset):
    def __init__(self, image_root, gt_root, edge_root, trainsize):
        self.trainsize = trainsize  # 用于训练时图像的大小
        # 图像 标签 边缘图像列表创建和排序
        self.images = [image_root + f for f in os.listdir(image_root) if f.endswith('.jpg')]
        self.gts = [gt_root + f for f in os.listdir(gt_root) if f.endswith('.png')]
        self.edges = [edge_root + f for f in os.listdir(edge_root) if f.endswith('.png')]
        # 对这些列表进行排序,以确保图像、标签和边缘图像的顺序一致
        self.images = sorted(self.images)
        self.gts = sorted(self.gts)
        self.edges = sorted(self.edges)
        # 过滤不匹配文件:移除尺寸不一致的图像、标签和边缘图像
        self.filter_files()
        self.size = len(self.images)
        self.kernel = np.ones((5, 5), np.uint8)
        # 用于图像和标签的转换操作,调整大小、转换为张量、标准化
        self.img_transform = transforms.Compose([
            transforms.Resize((self.trainsize, self.trainsize)),
            transforms.ToTensor(),
            transforms.Normalize([0.485, 0.456, 0.406],
                                 [0.229, 0.224, 0.225])])
        self.ge_transform = transforms.Compose([
            transforms.Resize((self.trainsize, self.trainsize)),
            transforms.ToTensor()])

    # 随机决定是否对图像进行水平翻转
    def getFlip(self):
        p = random.randint(0, 1)
        self.flip = transforms.RandomHorizontalFlip(p)

    # 按照索引获取数据集中的单个样本
    def __getitem__(self, index):
        self.getFlip()
        # 加载图像、标签和边缘图像
        image = self.rgb_loader(self.images[index])
        gt = self.binary_loader(self.gts[index])
        edge = cv2.imread(self.edges[index], cv2.IMREAD_GRAYSCALE)
        image = self.flip(image)
        image = self.img_transform(image)
        gt = self.flip(gt)
        gt = self.ge_transform(gt)
        edge = cv2.dilate(edge, self.kernel, iterations=1)
        edge = Image.fromarray(edge)
        edge = self.flip(edge)
        edge = self.ge_transform(edge)
        return image, gt, edge

    #  确保图像、标签和边缘图像尺寸一致
    def filter_files(self):
        assert len(self.images) == len(self.gts)
        images = []
        gts = []
        edges = []
        for img_path, gt_path, edge_path in zip(self.images, self.gts, self.edges):
            img = Image.open(img_path)
            gt = Image.open(gt_path)
            edge = Image.open(edge_path)
            if img.size == gt.size and img.size == edge.size:
                images.append(img_path)
                gts.append(gt_path)
                edges.append(edge_path)
        self.images = images
        self.gts = gts
        self.edges = edges

    # 用于加载RGB图像和二值图像
    def rgb_loader(self, path):
        with open(path, 'rb') as f:
            img = Image.open(f)
            return img.convert('RGB')

    def binary_loader(self, path):
        with open(path, 'rb') as f:
            img = Image.open(f)
            return img.convert('L')

    #  如果图像或标签小于trainsize,则调整其大小
    def resize(self, img, gt):
        assert img.size == gt.size
        w, h = img.size
        if h < self.trainsize or w < self.trainsize:
            h = max(h, self.trainsize)
            w = max(w, self.trainsize)
            return img.resize((w, h), Image.BILINEAR), gt.resize((w, h), Image.NEAREST)
        else:
            return img, gt

    def __len__(self):
        return self.size

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python在医学图像数据预处理方面也有广泛的应用。通过使用Python的图像处理库,可以对医学图像进行裁剪、缩放、旋转、灰度化等操作,以满足不同算法的输入要求。例如,可以使用PIL库的ImageOps模块进行图像翻转。通过水平翻转、垂直翻转等操作,可以生成新的训练样本,从而提高数据集的大小。下面是一个示例代码: ```python from PIL import ImageOps # 打开图像 img = Image.open("input.jpg") # 水平翻转 img_h_flip = ImageOps.mirror(img) # 垂直翻转 img_v_flip = ImageOps.flip(img) # 显示翻转后的图像 img_h_flip.show() img_v_flip.show() ``` 除了图像翻转,还可以使用其他图像处理技术,如平滑、边缘检测、直方图均衡化等来增强医学图像的质量和信息。这些预处理技术可以帮助去除噪声、增强对比度、提取特征等,从而提高机器学习模型在医学图像分析中的准确性和效果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Python实践:图像预处理与数据增强](https://blog.csdn.net/ai52learn/article/details/131255906)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值