关于图像分割的预处理 transform

这篇具有很好参考价值的文章主要介绍了关于图像分割的预处理 transform。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1. 介绍

2. 关于分割中的 resize 问题

3. 分割的 transform

3.1 随机缩放 RandomResize

3.2 随机水平翻转 RandomHorizontalFlip

3.3 随机竖直翻转 RandomVerticalFlip

3.4 随机裁剪 RandomCrop

3.5 ToTensor

3.6 normalization

3.7 Compose

3.8 中心裁剪

3.9 Resize 缩放

4. 预处理结果可视化


1. 介绍

图像分割的预处理不像分类那样好操作,因为分类的label就是一个类别,图像增强的操作都是对原始图像操作的。

图像分割的label和img是严格对应的,或者说两者的空间分辨率(h*w)一样且像素点的对应位置都不能改变。否则,监督学习就失去了作用。而深度学习中,数据增强是不必可少的,对于数据更少的医学图像来说,数据增强更加必不可少。

所以,本章主要聊聊 图像分割中的数据增强

下面是DRIVE数据集的预处理可视化:

关于图像分割的预处理 transform

2. 关于分割中的 resize 问题

图像分割的resize问题,本人一直没有弄明白....

分割最后的目的应该是将前景从图像中口出来,那么两者的尺寸肯定需要保证一样的。然而,例如unet一类的网络输入都是固定大小480*480,那么最后分割的分辨率也就是480*480,显然已经和最原始的图像不一样了

现在不管是分类,还是分割网络的输入都不需要和原论文一致了,网络里面都做了优化,例如最大池化层等等....

不管网络如何优化,大部分预处理中都增加了resize的操作。那么能保证输入图像和输出的分辨率一样,但是最原始的图像还是不能一致。例如,原始512*512,resize 480*480 输入给网络产生 480*480 的分割图像,480和512已经不一样了

虽然最后分割出来的图像也可以通过resize还原成最原始的尺寸。但是插值又成了问题,更好的线性插值会导致分割图像的灰度值改变。例如分割的图是二值图像,背景为0前景为255,通过插值会导致出现0-255的任何一个数字,变成了灰度图像。当然最近邻插值可以避免这一问题,但最近邻插值显然在图像处理中不是一个好的选择。

之前想过,用双线性插值resize分割图像,然后利用阈值处理产生二值图。但是,这样的方法不仅仅麻烦,还有很多的问题,且违背了end to end的思想

下面纯个人瞎想...仅供参考...

所以说,解决的办法就是训练的图像随机的resize,例如需要给网络的输入是480*480,那么随机将训练图像变成缩放成例如300-500之之间任意的大小,再裁剪成480*480输入给分割网络

这样的好处就是,网络就不会对单纯的图像缩放敏感

那么,再随机分割的时候,就不需要resize,直接输入原图就行了

3. 分割的 transform

如下,分割任务中图像预处理的测试代码

其中就只要保证img和label是同时变换即可

关于图像分割的预处理 transform

3.1 随机缩放 RandomResize

如下,在给定的min和max直接随机生成一个整数,然后resize即可。

分割的label图像要采用最近邻算法,否则resize之后的label就不是二值图像

class RandomResize(object):
    def __init__(self, min_size, max_size=None):
        self.min_size = min_size
        if max_size is None:
            max_size = min_size
        self.max_size = max_size

    def __call__(self, image, target):
        size = random.randint(self.min_size, self.max_size)
        # 这里size传入的是int类型,所以是将图像的最小边长缩放到size大小
        image = F.resize(image, size)
        target = F.resize(target, size, interpolation=T.InterpolationMode.NEAREST)
        return image, target

3.2 随机水平翻转 RandomHorizontalFlip

flip_prob 就是翻转的概率

class RandomHorizontalFlip(object):
    def __init__(self, flip_prob):
        self.flip_prob = flip_prob

    def __call__(self, image, target):
        if random.random() < self.flip_prob:
            image = F.hflip(image)
            target = F.hflip(target)
        return image, target

3.3 随机竖直翻转 RandomVerticalFlip

和水平翻转的一样

class RandomVerticalFlip(object):
    def __init__(self, flip_prob):
        self.flip_prob = flip_prob

    def __call__(self, image, target):
        if random.random() < self.flip_prob:
            image = F.vflip(image)
            target = F.vflip(target)
        return image, target

3.4 随机裁剪 RandomCrop

随机裁剪的代码如下,需要注意的是,因为图像很可能不足裁剪的大小,所以需要填充

class RandomCrop(object):
    def __init__(self, size):
        self.size = size

    def __call__(self, image, target):
        image = pad_if_smaller(image, self.size)
        target = pad_if_smaller(target, self.size, fill=255)
        crop_params = T.RandomCrop.get_params(image, (self.size, self.size))
        image = F.crop(image, *crop_params)
        target = F.crop(target, *crop_params)
        return image, target

填充的代码,这里填充255代表不敢兴趣的区域

def pad_if_smaller(img, size, fill=0):
    # 如果图像最小边长小于给定size,则用数值fill进行padding
    min_size = min(img.size)
    if min_size < size:
        ow, oh = img.size
        padh = size - oh if oh < size else 0
        padw = size - ow if ow < size else 0
        img = F.pad(img, (0, 0, padw, padh), fill=fill)
    return img

3.5 ToTensor

这里label不能进行官方实现的totensor方法,因为归一化,前景像素的灰度值就会被改变

dtype 是因为要使用交叉熵损失,需要为整型,且label的维度中不能有channel

class ToTensor(object):
    def __call__(self, image, target):
        image = F.to_tensor(image)
        target = torch.as_tensor(np.array(target), dtype=torch.int64)
        return image, target

3.6 normalization

normalization 的实现也很简单

class Normalize(object):
    def __init__(self, mean, std):
        self.mean = mean
        self.std = std

    def __call__(self, image, target):
        image = F.normalize(image, mean=self.mean, std=self.std)
        return image, target

3.7 Compose

将transform 逐个实现就行了

class Compose(object):
    def __init__(self, transforms):
        self.transforms = transforms

    def __call__(self, image, target):
        for t in self.transforms:
            image, target = t(image, target)
        return image, target

3.8 中心裁剪

class CenterCrop(object):
    def __init__(self, size):
        self.size = size

    def __call__(self, image, target):
        image = F.center_crop(image, self.size)
        target = F.center_crop(target, self.size)
        return image, target

3.9 Resize 缩放

        image = F.resize(image,(self.size,self.size)) 可以缩放成width = height

# 将图像和标签缩放
class Resize(object):
    def __init__(self, size:list):
        self.size = size

    def __call__(self, image, target):
        image = F.resize(image, self.size)    
        target = F.resize(target, self.size, interpolation=T.InterpolationMode.NEAREST)
        return image, target

4. 预处理结果可视化

dataset里面改成这样就行了

关于图像分割的预处理 transform

加载完数据这样调用即可

关于图像分割的预处理 transform

测试代码:

label 中灰度值只有0 1 255

label 中没有 channel

# 可视化数据
def plot(data_loader):
    plt.figure(figsize=(12,8))
    imgs,labels = data_loader
    for i,(x,y) in enumerate(zip(imgs,labels)):
        x = np.transpose(x.numpy(),(1,2,0))
        x[:,:,0] = x[:,:,0]*0.127 + 0.709       # 去 normalization
        x[:,:,1] = x[:,:,1]*0.079 + 0.381
        x[:,:,2] = x[:,:,2]*0.043 + 0.224
        y = y.numpy()

        # print(np.unique(y))   # 0 1 255
        # print(x.shape)      # 480*480*3
        # print(y.shape)      # 480*480

        plt.subplot(2,4,i+1)
        plt.imshow(x)

        plt.subplot(2,4,i+5)
        plt.imshow(y)
    plt.show()

显示结果:

关于图像分割的预处理 transform

在dataset 里面,将前景像素改成120,就可以看到label的细节

关于图像分割的预处理 transform

 关于图像分割的预处理 transform文章来源地址https://www.toymoban.com/news/detail-440689.html

到了这里,关于关于图像分割的预处理 transform的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • torchvision.transforms 数据预处理:ToTensor()

    ToTensor() 是pytorch中的数据预处理函数,包含在 torchvision.transforms 模块下。一般用于处理图像数据,所以其处理对象是 PIL Image 和 numpy.ndarray 。 必须要声明不能只看函数名,就以为 ToTensor() 只是将图像转为 tensor,其实它的功能不止于此 看一下 ToTensor() 函数的源码: 大意是:

    2024年02月02日
    浏览(60)
  • 数据预处理——fit()函数,transform()函数,fit_transform()函数

    sklearn 中封装的各种算法 调用之前都要 fit。 fit 相对于整个代码而言,为后续API服务, 用于从一个训练集中学习模型参数,包括归一化时要用到的均值,标准偏差 fit 之后,可以调用各种API方法, transform 是其中之一。 fit_transform 与 transform 运行结果一致,但是 fit 与 transfor

    2024年02月05日
    浏览(35)
  • Halcon 深度学习之语义分割 预处理 案例解析

    声明:本篇是个人针对于语义分割预处理案例的理解,有理解不到位或者错误的地方,还望各位能够给予指正,在此表示感谢! 例子名称: segment_pill_defects_deep_learning_1_preprocess ①:导入原图文件夹,标注文件夹,类别信息等 ②:通过Deep Learning Tool 工具创建的语义分割文件【

    2024年02月09日
    浏览(27)
  • 图像预处理算法————灰度化处理

    图像预处理算法适合在FPGA上完成,原理简单且需要快速处理,通常有灰度化、中值、均值滤波等,以及颜色空间转换算法。 灰度图像是一种特殊的彩色图像(R=G=B的彩色图像) 只有一种颜色分量,单通道的0-255 方法:一般有分量法、最大值法、平均值法、加权平均法四种方

    2024年01月17日
    浏览(39)
  • 使用 Monai 和 PyTorch 预处理 3D Volumes以进行肿瘤分割

    针对在使用传统图像处理工具时可能遇到的困难,深度学习已成为医疗保健领域的主要解决方案。 因为医学图像比标准图像更难处理(高对比度、人体的广泛变化……)深度学习用于分类、对象检测,尤其是分割任务。 在分割方面,深度学习用于分割人体器官,如肝脏、肺

    2023年04月11日
    浏览(46)
  • 图像预处理方法

    两个基本的形态学操作是腐 和膨胀。他们 的变体构成了开运算 ,闭运算, 梯度等。 根据卷积核的大小前景的所有像素会腐 掉 变为 0 ,所以前景物体会变小整幅图像的白色区域会减少。 对于去除白噪声很有用 也可以用来断开两个 在一块的物体等。 函数原型: ⚫src: 输入原

    2023年04月11日
    浏览(30)
  • 图像预处理技术与算法

    图像预处理是计算机视觉和图像处理中非常关键的第一步,其目的是为了提高后续算法对原始图像的识别、分析和理解能力。以下是一些主要的图像预处理技术: 1.图像增强: 对比度调整:通过直方图均衡化(Histogram Equalization)等方法改善图像整体或局部的对比度。 伽玛校

    2024年02月20日
    浏览(38)
  • 【第十七届智能车】智能车图像处理(1)-图像预处理

    本博客使用的硬件是逐飞总钻风130°无畸变摄像头,采用的图像分辨率为188*120,主控为CH32V307VCT6,使用DVI接口进行连接。 我们在本次比赛中采用的是头尾车总钻风摄像头+中间车线性CCD的方案。这两个感光部件各有优劣,使用方式和图像处理也大相径庭。这里讨论的是总钻风

    2024年02月08日
    浏览(39)
  • 使用 SKimage 的图像预处理

    介绍 图像是视觉对象的二维表示,例如照片、绘画或素描。在数字成像中,图像存储为像素值数组,其中每个像素代表图像亮度和颜色的样本。每个像素的颜色可以由一个或多个通道表示,如传统彩色图像中的红色、绿色和蓝色 (RGB) 通道。在本文中,你将学习各种图像预处

    2024年02月03日
    浏览(39)
  • 图像预处理 Tricks【1】:Contours

    轮廓可以简单地理解为连接所有连续点(沿物体边界)的曲线,这些点通常具有相同的颜色或强度。 轮廓在图像分析中具有重要意义,是物体形状分析和对象检测和识别的有用工具,是理解图像语义信息的重要依据。 本文主要介绍了在 opencv 中,一些重要的用于处理物体轮廓

    2024年02月11日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包