图像分割增强方法

本文介绍了Python中用于图像预处理的各种变换类,如Resize、通道翻转、高斯模糊、裁剪(随机、中心和滑动)、旋转等,以及Compose类的组合使用,展示了如何通过这些类进行数据增强,以提高模型训练效果。
摘要由CSDN通过智能技术生成

def call(self, img):

return img.resize(self.size, self.interpolation)

class FlipChannels(object):

def call(self, img):

img = np.array(img)[:, :, ::-1]

return Image.fromarray(img.astype(np.uint8))

class RandomGaussianBlur(object):

def call(self, img):

sigma = 0.15 + random.random() * 1.15

blurred_img = gaussian(np.array(img), sigma=sigma, multichannel=True)

blurred_img *= 255

return Image.fromarray(blurred_img.astype(np.uint8))

组合

class Compose(object):

def init(self, transforms):

self.transforms = transforms

def call(self, img, mask):

assert img.size == mask.size

for t in self.transforms:

img, mask = t(img, mask)

return img, mask

随机裁剪

class RandomCrop(object):

def init(self, size, padding=0):

if isinstance(size, numbers.Number):

self.size = (int(size), int(size))

else:

self.size = size

self.padding = padding

def call(self, img, mask):

if self.padding > 0:

img = ImageOps.expand(img, border=self.padding, fill=0)

mask = ImageOps.expand(mask, border=self.padding, fill=0)

assert img.size == mask.size

w, h = img.size

th, tw = self.size

if w == tw and h == th:

return img, mask

if w < tw or h < th:

return img.resize((tw, th), Image.BILINEAR), mask.resize((tw, th), Image.NEAREST)

x1 = random.randint(0, w - tw)

y1 = random.randint(0, h - th)

return img.crop((x1, y1, x1 + tw, y1 + th)), mask.crop((x1, y1, x1 + tw, y1 + th))

中心裁剪

class CenterCrop(object):

def init(self, size):

if isinstance(size, numbers.Number):

self.size = (int(size), int(size))

else:

self.size = size

def call(self, img, mask):

assert img.size == mask.size

w, h = img.size

th, tw = self.size

x1 = int(round((w - tw) / 2.))

y1 = int(round((h - th) / 2.))

return img.crop((x1, y1, x1 + tw, y1 + th)), mask.crop((x1, y1, x1 + tw, y1 + th))

class RandomHorizontallyFlip(object):

def call(self, img, mask):

if random.random() < 0.5:

return img.transpose(Image.FLIP_LEFT_RIGHT), mask.transpose(Image.FLIP_LEFT_RIGHT)

return img, mask

class Scale(object):

def init(self, size):

self.size = size

def call(self, img, mask):

assert img.size == mask.size

w, h = img.size

if (w >= h and w == self.size) or (h >= w and h == self.size):

return img, mask

if w > h:

ow = self.size

oh = int(self.size * h / w)

return img.resize((ow, oh), Image.BILINEAR), mask.resize((ow, oh), Image.NEAREST)

else:

oh = self.size

ow = int(self.size * w / h)

return img.resize((ow, oh), Image.BILINEAR), mask.resize((ow, oh), Image.NEAREST)

class RandomSizedCrop(object):

def init(self, size):

self.size = size

def call(self, img, mask):

assert img.size == mask.size

for attempt in range(10):

area = img.size[0] * img.size[1]

target_area = random.uniform(0.45, 1.0) * area

aspect_ratio = random.uniform(0.5, 2)

w = int(round(math.sqrt(target_area * aspect_ratio)))

h = int(round(math.sqrt(target_area / aspect_ratio)))

if random.random() < 0.5:

w, h = h, w

if w <= img.size[0] and h <= img.size[1]:

x1 = random.randint(0, img.size[0] - w)

y1 = random.randint(0, img.size[1] - h)

img = img.crop((x1, y1, x1 + w, y1 + h))

mask = mask.crop((x1, y1, x1 + w, y1 + h))

assert (img.size == (w, h))

return img.resize((self.size, self.size), Image.BILINEAR), mask.resize((self.size, self.size),

Image.NEAREST)

Fallback

scale = Scale(self.size)

crop = CenterCrop(self.size)

return crop(*scale(img, mask))

class RandomRotate(object):

def init(self, degree):

self.degree = degree

def call(self, img, mask):

rotate_degree = random.random() * 2 * self.degree - self.degree

return img.rotate(rotate_degree, Image.BILINEAR), mask.rotate(rotate_degree, Image.NEAREST)

class RandomSized(object):

def init(self, size):

self.size = size

self.scale = Scale(self.size)

self.crop = RandomCrop(self.size)

def call(self, img, mask):

assert img.size == mask.size

w = int(random.uniform(0.5, 2) * img.size[0])

h = int(random.uniform(0.5, 2) * img.size[1])

img, mask = img.resize((w, h), Image.BILINEAR), mask.resize((w, h), Image.NEAREST)

return self.crop(*self.scale(img, mask))

class SlidingCropOld(object):

def init(self, crop_size, stride_rate, ignore_label):

self.crop_size = crop_size

self.stride_rate = stride_rate

self.ignore_label = ignore_label

def _pad(self, img, mask):

h, w = img.shape[: 2]

pad_h = max(self.crop_size - h, 0)

pad_w = max(self.crop_size - w, 0)

img = np.pad(img, ((0, pad_h), (0, pad_w), (0, 0)), ‘constant’)

mask = np.pad(mask, ((0, pad_h), (0, pad_w)), ‘constant’, constant_values=self.ignore_label)

return img, mask

def call(self, img, mask):

assert img.size == mask.size

w, h = img.size

long_size = max(h, w)

img = np.array(img)

mask = np.array(mask)

if long_size > self.crop_size:

stride = int(math.ceil(self.crop_size * self.stride_rate))

h_step_num = int(math.ceil((h - self.crop_size) / float(stride))) + 1

w_step_num = int(math.ceil((w - self.crop_size) / float(stride))) + 1

img_sublist, mask_sublist = [], []

for yy in range(h_step_num):

for xx in range(w_step_num):

sy, sx = yy * stride, xx * stride

ey, ex = sy + self.crop_size, sx + self.crop_size

img_sub = img[sy: ey, sx: ex, :]

mask_sub = mask[sy: ey, sx: ex]

img_sub, mask_sub = self._pad(img_sub, mask_sub)

img_sublist.append(Image.fromarray(img_sub.astype(np.uint8)).convert(‘RGB’))

mask_sublist.append(Image.fromarray(mask_sub.astype(np.uint8)).convert(‘P’))

return img_sublist, mask_sublist

else:

img, mask = self._pad(img, mask)

img = Image.fromarray(img.astype(np.uint8)).convert(‘RGB’)

mask = Image.fromarray(mask.astype(np.uint8)).convert(‘P’)

return img, mask

class SlidingCrop(object):

def init(self, crop_size, stride_rate, ignore_label):

self.crop_size = crop_size

self.stride_rate = stride_rate

self.ignore_label = ignore_label

def _pad(self, img, mask):

h, w = img.shape[: 2]

pad_h = max(self.crop_size - h, 0)

pad_w = max(self.crop_size - w, 0)

img = np.pad(img, ((0, pad_h), (0, pad_w), (0, 0)), ‘constant’)

mask = np.pad(mask, ((0, pad_h), (0, pad_w)), ‘constant’, constant_values=self.ignore_label)

return img, mask, h, w

def call(self, img, mask):

assert img.size == mask.size

w, h = img.size

long_size = max(h, w)

img = np.array(img)

mask = np.array(mask)

if long_size > self.crop_size:

stride = int(math.ceil(self.crop_size * self.stride_rate))

h_step_num = int(math.ceil((h - self.crop_size) / float(stride))) + 1

w_step_num = int(math.ceil((w - self.crop_size) / float(stride))) + 1

img_slices, mask_slices, slices_info = [], [], []

for yy in range(h_step_num):

for xx in range(w_step_num):

sy, sx = yy * stride, xx * stride

ey, ex = sy + self.crop_size, sx + self.crop_size

img_sub = img[sy: ey, sx: ex, :]

mask_sub = mask[sy: ey, sx: ex]

img_sub, mask_sub, sub_h, sub_w = self._pad(img_sub, mask_sub)

img_slices.append(Image.fromarray(img_sub.astype(np.uint8)).convert(‘RGB’))

mask_slices.append(Image.fromarray(mask_sub.astype(np.uint8)).convert(‘P’))

slices_info.append([sy, ey, sx, ex, sub_h, sub_w])

return img_slices, mask_slices, slices_info

else:

img, mask, sub_h, sub_w = self._pad(img, mask)

img = Image.fromarray(img.astype(np.uint8)).convert(‘RGB’)

mask = Image.fromarray(mask.astype(np.uint8)).convert(‘P’)

return [img], [mask], [[0, sub_h, 0, sub_w, sub_h, sub_w]]

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)

[外链图片转存中…(img-YwhUFpxU-1713771573445)]

[外链图片转存中…(img-MOBYBNJG-1713771573446)]

[外链图片转存中…(img-AqzlywUP-1713771573447)]

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值