图像数据增强库imgaug学习笔记

本文转载于博客,记录了博主关于图像数据增强库imgaug的学习笔记

在深度学习项目中,寻找数据花费了相当多的时间。但在很多实际的项目中,我们难以找到充足的数据来完成任务。为了要保证完美地完成项目,有两件事情需要做好:

  1. 寻找更多的数据;
  2. 数据增强。

Imgaug 是一个封装好的用来进行图像 Augmentation 的 Python库,这个库功能全面,且有丰富的文档支持,能满足我们大多数的数据增强的需求。支持关键点(key point)和 bounding box一起变换。它可以将你的输入图片转换成很多新的、更大数据量的轻微变动的图片,这对于数量比较小的数据集来说简直是福音!常见的变换比如滤波,扰动,平移,翻转,缩放,裁剪,锐化,噪声,灰度,亮度,对比度等等。

项目主页: imgaug doc

1. 安装和卸载

# 通过github安装
sudo pip install git+https://github.com/aleju/imgaug

# 通过pypi安装
sudo pip install imgaug

# 本地安装, 下面的VERSION变成自己想要安装的version, 例如: imgaug-0.2.5.tar.gz
python setup.py sdist && sudo pip install dist/imgaug-VERSION.tar.gz

# 卸载
sudo pip uninstall imgaug

2. 基本使用

首先定义一个变换序列,然后直接将图像batch传入即可:

from imgaug import augmenters as iaa

seq = iaa.Sequential([
    iaa.Crop(px=(0, 16)), # crop images from each side by 0 to 16px (randomly chosen)
    iaa.Fliplr(0.5), # 0.5 is the probability, horizontally flip 50% of the images
    iaa.GaussianBlur(sigma=(0, 3.0)) # blur images with a sigma of 0 to 3.0
])

for batch_idx in range(1000):
    # 'images' should be either a 4D numpy array of shape (N, height, width, channels)
    # or a list of 3D numpy arrays, each having shape (height, width, channels).
    # Grayscale images must have shape (height, width, 1) each.
    # All images must have numpy's dtype uint8. Values are expected to be in
    # range 0-255.
    images = load_batch(batch_idx)
    images_aug = seq.augment_images(images)
    train_on_images(images_aug)
    

3. Augmenters常用函数

先导入Augmenters类:

from imgaug import augmenters as iaa

3.1 iaa.Sequential()

产生一个处理图片的Sequential
函数原型:

iaa.Sequential(children=None,
               random_order=False,
               name=None,
               deterministic=False,
               random_state=None)

参数:

  • children: 想要应用在图像上的Augmenter或者Augmenter集合。默认None
  • random_order: bool类型, 默认False。是否对每个batch的图片应用不同顺序的Augmenter list。当设置为True时,不同batch之间图片的处理顺序都会不一样,但是同一个batch内顺序相同。
  • deterministic: bool类型, 默认False。

3.2 iaa.someOf()

将Augmenter中的部分变换应用在图片处理上,而不是应用所有的Augmenter。例如:可以定义20种变换,但每次只选择其中的5个。但是不支持固定选择某一个Augmenter。

函数原型:

iaa.SomeOf(n=None,
           children=None,
           random_order=False,
           name=None,
           deterministic=False,
           random_state=None)

参数:

  • n: 从总的Augmenters中选择多少个。可以是一个int, tuple, list或者随机值。
  • random_order: 是否每次顺序不一样。
    例子:
# 每次选择一个翻转方式
seq = iaa.SomeOf(1, [
     iaa.Fliplr(1.0),
     iaa.Flipud(1.0)
 ])
imgs_aug = seq.augment_images(imgs)

# 每次使用1~3个Augmenter来处理图片,每个batch中的Augmenters顺序一样。
seq = iaa.SomeOf((1, 3), [
     iaa.Fliplr(1.0),
     iaa.Flipud(1.0),
     iaa.GaussianBlur(1.0)
 ])
imgs_aug = seq.augment_images(imgs)

# 每次使用1到多个Augmenter来处理图片,每个batch中的Augmenters顺序不一样。
seq = iaa.SomeOf((1, None), [
    iaa.Fliplr(1.0),
     iaa.Flipud(1.0),
     iaa.GaussianBlur(1.0)
 ], random_order=True)
imgs_aug = seq.augment_images(imgs)

3.3 iaa.OneOf()

每次从一系列Augmenters中选择一个来变换。

iaa.OneOf(children,
          name=None,
          deterministic=False,
          random_state=None)

参数含义与上面一样。

3.4 iaa.Sometimes()

对batch中的一部分图片应用一部分Augmenters,剩下的图片应用另外的Augmenters。

iaa.Sometimes(p=0.5,
              then_list=None,
              else_list=None,
              name=None,
              deterministic=False,
              random_state=None)
  • p: float。多大比例的图片会被Augmente。
  • then_list:Augmenter集合。p概率的图片进行变换的Augmenters。
  • else_list:1-p概率的图片会被进行变换的Augmenters。注意变换的图片应用的Augmenter只能是then_list或者else_list中的一个。

3.5 iaa.WithColorspace()

在某个特定的颜色空间对图像进行变换。即:先将图片从一个颜色空间变换到另一个颜色空间,然后在另一个颜色空间中对图像进行变换,最后再变换回原来的颜色空间。

iaa.WithColorspace(to_colorspace,
                   from_colorspace='RGB',
                   children=None,
                   name=None,
                   deterministic=False,
                   random_state=None)
  • to_colorspace: 要变换的颜色空间。有以下选择:RGB, BGR, GRAY, CIE, YCrCb, HSV, HLS, Lab, Luv
  • from_colorspace: 原来的颜色空间, 默认RGB。
  • children: 要执行的变换。
# 先将图片从RGB变换到HSV,然后将H值增加10,然后再变换回RGB。
aug = iaa.WithColorspace(to_colorspace="HSV", from_colorspace="RGB",
                         children=iaa.WithChannels(0, iaa.Add(10)))

3.6 iaa.WithChannels()

从图片中挑选出一个Channel来进行变换,变换完了之后再将该channel merge回去。

iaa.WithChannels(channels=None,
                 children=None,
                 name=None,
                 deterministic=False,
                 random_state=None)

参数:

  • channels: int或者int list。哪些channel要被用来变换。
  • children: channel被选出来之后要进行哪些变换。

3.7 iaa.Noop()

不进行任何变换。某些情况下只想使用一个Augmenter作为占位符,这样可以继续调用augment_image()函数,但实际不作变换。例如进行测试的时候可以使用这个。

3.8 iaa.Lambda()

自定义一些变换函数。

iaa.Lambda(func_images,
           func_keypoints,
           name=None,
           deterministic=False,
           random_state=None)

参数:

  • func_images: 对每一个image调用此函数。该函数的形式为:
function(images, random_state, parents, hooks)

该函数必须返回变换后的图片。
+ func_keypoints: 对每个图像的关键点进行变换的函数。该函数形式为:

function(keypoints_on_images, random_state, parents, hooks)

该函数返回变换后的keypoint。

例子:

def func_images(images, random_state, parents, hooks):
    images[:, ::2, :, :] = 0
    return images

def func_keypoints(keypoints_on_images, random_state, parents, hooks):
    return keypoints_on_images

aug = iaa.Lambda(
    func_images=func_images,
    func_keypoints=func_keypoints
)

将每张图片没隔两行的像素点变成黑色的条带,关键点保留。
这里写图片描述

3.9 iaa.AssertShape()

assert要变换的图片和keypoint的shape。如果不满足就抛出异常。

iaa.AssertShape(shape,
                check_images=True,
                check_keypoints=True,
                name=None,
                deterministic=False,
                random_state=None)
 
 

参数:

  • shape: 元组,通常形式为(N, H, W, C)。元组中每个元素的值可以为:None, int, 两个int类型的tuple或者一个int类型的list。如果是None,表示所有值都可以接受。如果是int,则只有对应的位置是该值才会被接受。如果是int类型的tuple,例如(a,b),则对应位置的值必须是a<=x
# 检查输入的每张图片是否是32×32×3的,如果是则执行水平翻转,否则报错
seq = iaa.Sequential([
    iaa.AssertShape((None, 32, 32, 3)),
    iaa.Fliplr(0.5)
])

# 先检查图片的高度是否是32<=H<64, 宽度是否是32, channel是否是1或者3。如果都满足则执行水平翻转,否则报错。
seq = iaa.Sequential([
    iaa.AssertShape((None, (32, 64), 32, [1, 3])),
    iaa.Fliplr(0.5)
])

3.10 iaa.Scale()

将图像缩放到固定大小。

iaa.Scale(size,
          interpolation='cubic',
          name=None,
          deterministic=False,
          random_state=None)

参数:

  • size: 字符串”keep”,此时保持图像原大小不坐缩放。如果是一个整数n,则缩放成(n, n)。如果是一个float v,则每张图片会被缩放成(H*v, W*v),此时每张图像大小仍然不一样。如果是一个tuple类型(a, b), 如果a、b中至少有一个小数,则从[a,b]中挑选一个数作为缩放比例。如果a、b都是整数,则从[a,b]中挑选一个整数作为缩放后的大小。如果是1个list,则list中的数要么全是整数,要么全是小数(不能混用)。如果是一个dict类型,则该dict必须有两个key: height和width。每个key的值仍然可以按照上面的方法选取。此外, key的值还可以是”keep-aspect-ratio”, 表示按照比例缩放。
  • interpolation: 缩放方法。如果是All, 则会随机从下面挑选一个: nearest、linear、area、cubic,注意每张图片可能不一样。如果是int,则应该是下面的一种:cv2.INTER_NEAREST, cv2.INTER_LINEAR, cv2.INTER_AREA,cv2.INTER_CUBIC。如果是string,则该种方法会被一直使用,必须是下面的一种: nearest, linear, area, cubic。如果是int list或者string list, 则每张图片会从中随机选取一个。

3.11 iaa.CropAndPad()

截取(crop)或者填充(pad),填充时,被填充区域为黑色。

iaa.CropAndPad(px=None,
               percent=None,
               pad_mode='constant',
               pad_cval=0,
               keep_size=True,
               sample_independently=True,
               name=None,
               deterministic=False,
               random_state=None)

参数:

  • px: 想要crop(negative values)的或者pad(positive values)的像素点。注意与percent不能同时存在。如果是None, pixel级别的crop不会被使用。int或者int list与上面相同。如果是一个4个元素的tuple,那么4个元素分别代表(top, right, bottom, left),每个元素可以是int或者int tuple或者int list。
  • percent:按比例来crop或者pad, 与px相同。但是两者不能同时存在。
  • pad_mode: 填充方式。可以是All, string, string list。可选的填充方式有: constant, edge, linear_ramp, maximum, median, minimum, reflect, symmetric, wrap。具体含义可查numpy文档。
  • pad_cval: float、int、float tuple、int tuple、float list、int list。当pad_mode=constant的时候选择填充的值。
  • keep_size: bool类型。经过crop后,图像大小会改变。如果该值设置为1,则在crop或者pad后再缩放成原来的大小。
  • sample_independently : bool类型。如果设置为False,则每次从px或者percent中选出来的值会作用在四个方位。

3.12 iaa.Pad()

与iaa.CropAndPad()相同,只接受positive values。

3.13 iaa.Crop()

与iaa.CropAndPad()相同,只接受negative values。

3.14 iaa.Fliplr()

水平镜面翻转。

iaa.Fliplr(p=0, name=None, deterministic=False, random_state=None)

参数:
p: int或者float,每张图片呗翻转的概率

3.15 Flipud()

上下翻转,与上面相同。

3.16 iaa.ChangeColorspace()

改变图像空间。

iaa.ChangeColorspace(to_colorspace, from_colorspace='RGB', alpha=1.0, name=None, deterministic=False, random_state=None)
 
 
  • 1

参数:

  • to_colorspace: 见上。
  • from_colorspace: 见上。
  • alpha: 覆盖旧的颜色空间时,新颜色空间的Alpha值。为int, float, int tuple, float tuple

3.17 iaa.Grayscale()

变成灰度图。

iaa.Grayscale(alpha=0, from_colorspace='RGB', name=None, deterministic=False, random_state=None)

参数:

  • alpha: 覆盖旧的颜色空间时,新颜色空间的Alpha值。

3.18 iaa.GaussianBlur()

高斯扰动。

iaa.GaussianBlur(sigma=0, name=None, deterministic=False, random_state=None)

参数:

  • sigma: 高斯变换的标准差。可为float, float tuple。常见的有0,不扰动。3,强扰动。

3.19 iaa.AverageBlur()

从最邻近像素中取均值来扰动。

iaa.AverageBlur(k=1, name=None, deterministic=False, random_state=None)

参数:

  • k:窗口大小。可为int, int tuple。当为int tuple时,如果每个元素也是tuple,每个元素分别作为height和width,窗口大小不一致。

3.20 iaa.MedianBlur()

通过最近邻中位数来扰动。

iaa.MedianBlur(k=1, name=None, deterministic=False, random_state=None)

与上面相同。

3.21 iaa.Convolve()

对图像使用卷积。

iaa.Convolve(matrix=None, name=None, deterministic=False, random_state=None)

 
 
  • matrix: 卷积矩阵。

3.22 iaa.Sharpen()

锐化。

iaa.Sharpen(alpha=0, lightness=1, name=None, deterministic=False, random_state=None)

3.23 iaa.Emboss()

浮雕效果。

iaa.Emboss(alpha=0, strength=1, name=None, deterministic=False, random_state=None)

3.24 iaa.EdgeDetect()

边缘检测。

iaa.EdgeDetect(alpha=0, name=None, deterministic=False, random_state=None)

3.25 iaa.DirectedEdgeDetect()

特定方向的边缘检测。

iaa.DirectedEdgeDetect(alpha=0, direction=(0.0, 1.0), name=None, deterministic=False, random_state=None)

3.26 iaa.Add()

随机加上一个值。

iaa.Add(value=0, per_channel=False, name=None, deterministic=False, random_state=None)

3.27 iaa.AddElementwise()

按像素加。

iaa.AddElementwise(value=0, per_channel=False, name=None, deterministic=False, random_state=None)

3.28 iaa.AdditiveGaussianNoise()

添加高斯噪声。

iaa.AdditiveGaussianNoise(loc=0, scale=0, per_channel=False, name=None, deterministic=False, random_state=None)

3.29 iaa.Multiply()

给图像中的每个像素点乘一个值使得图片更亮或者更暗。

iaa.Multiply(mul=1.0, per_channel=False, name=None, deterministic=False, random_state=None)

3.30 iaa.MultiplyElementwise()

按像素值乘。

iaa.MultiplyElementwise(self, mul=1.0, per_channel=False, name=None, deterministic=False, random_state=None)

3.31 iaa.Dropout()

随机去掉一些像素点, 即把这些像素点变成0。

iaa.Dropout(p=0, per_channel=False, name=None, deterministic=False, random_state=None)

3.32 iaa.CoarseDropout()

将矩形框的值设置为0。

iaa.CoarseDropout(p=0, size_px=None, size_percent=None, per_channel=False, min_size=4, name=None, deterministic=False, random_state=None)

3.33 iaa.Invert()

将每个像素值p变成255-p。

iaa.Invert(p=0, per_channel=False, min_value=0, max_value=255, name=None, deterministic=False, random_state=None)

3.34 iaa.ContrastNormalization()

改变图像的对比度。

iaa.ContrastNormalization(alpha=1.0, per_channel=False, name=None, deterministic=False, random_state=None)

3.35 iaa.Affine()

仿射变换。包含:平移(Translation)、旋转(Rotation)、放缩(zoom)、错切(shear)。仿设变换通常会产生一些新的像素点,我们需要指定这些新的像素点的生成方法,这种指定通过设置cvalmode两个参数来实现。参数order用来设置插值方法。

iaa.Affine(scale=1.0,
           translate_percent=None,
           translate_px=None,
           rotate=0.0,
           shear=0.0,
           order=1,
           cval=0,
           mode='constant',
           name=None, deterministic=False, random_state=None)

参数:

  • scale: 图像缩放因子。1表示不缩放,0.5表示缩小到原来的50%。此参数可以是float, float tuple, dict。如果是float, 则所有图片按照这种比例缩放。如果是float tuple, 则随机选取一个值来进行缩放,此时x-axisy-axis的缩放比例相同。如果是一个dict,则应该有两个key:x, y,每个xy的值都可以是float, float tuple,此时x-axisy-axis的缩放比例不一样。
  • translate_percent: 平移比例,0表示不平移,0.5表示平移50%。可以是float, float tuple, dict,具体含义与scale相同。用正负来表示平移方向。
  • translate_px: 按照像素来进行平移。可以是int, int tuple, dict,具体含义与translate_percent相同。
  • rotate: 平移角度,0~360度之间,正负也可以表示方向。可以为float, float tuple
  • shear: 错切的程度,0~360度之间,正负表示方向。可以为float, int, float tuple, int tuple
  • order: 插值顺序,与skimage中定义相同。下面0和1方法快,3比较慢,4、5特别慢。可以是int, int list, ia.ALL。如果是ia.ALL,则每次从所有的插值方法中随机选取。
    • 0:最邻近插值。
    • 1: 双线性插值(默认)。
    • 2: 双二次插值(不推荐)。
    • 3:双三次插值。
    • 4: Bi-quartic。
    • 5:Bi-quintic。
  • cval: 当平移后使用常量填充的时候指定填充的常量值,只有在mode=constant的时候才会生效。可以是int, float, tuple, ia.ALL。如果是ia.ALL,则会从[0,255]之间随机选取一个值填充。
  • mode: 采用何种方式填充经过变换后空白的像素点。可以是string, string list, ia.ALL。基本用法与上面相同。其中字符串的选取范围是:
    • constant: 采用一个常量填充。
    • edge: 边缘填充。
    • symmetric: 镜面对称填充。
    • reflect: Pads with the reflection of the vector mirrored on the first and last values of the vector along each axis.
    • wrap: Pads with the wrap of the vector along the axis. The first values are used to pad the end and the end values are used to pad the beginning.

3.36 iaa.PiecewiseAffine()

随机放置一些规则的网格点然后移动这些点的周围的像素。这回导致局部的扭曲。

iaa.PiecewiseAffine(scale=0,
                    nb_rows=4,
                    nb_cols=4,
                    order=1,
                    cval=0,
                    mode='constant',
                    name=None, deterministic=False, random_state=None)

3.37 iaa.ElasticTransformation()

通过移动局部像素来变换。

iaa.ElasticTransformation(alpha=0,
                          sigma=0,
                          name=None,
                          deterministic=False,
                          random_state=None)

4. keypoint变换

imgaug支持在图像变换的同时变换图像中的关键点。例子如下:

import imgaug as ia
from imgaug import augmenters as iaa

iaa.seed(1)

image=ia.quokka(size=(256,256))

# 定义4个关键点
keypoints=ia.KeypointsOnImage([
    ia.Keypoint(x=65, y=100),
    ia.Keypoint(x=75, y=200),
    ia.Keypoint(x=100, y=100),
    ia.Keypoint(x=200, y=80)
], shape=image.shape)

# 定义一个变换序列
seq=iaa.Sequential([
    iaa.Multiply((1.2, 1.5)), # 改变亮度,不影响关键点
    iaa.Affine(
        rotate=10,
        scale=(0.5, 0.7)
    ) # 旋转10度然后缩放,会影响关键点
])

# 固定变换序列,之后就可以先变换图像然后变换关键点,这样可以保证两次的变换完全相同。
# 如果调用次函数,需要在每次batch的时候都调用一次,否则不同的batch执行相同的变换。
seq_det = seq.to_deterministic()

# 转换成list或者batch来变换。由于只有一张图片, 因此用[0]来取出该图和关键点。
image_aug = seq_det.augment_images([image])[0]
keypoints_aug = seq_det.augment_keypoints([keypoints])[0]

# print coordinates before/after augmentation (see below)
# use after.x_int and after.y_int to get rounded integer coordinates
for i in range(len(keypoints.keypoints)):
    before = keypoints.keypoints[i]
    after = keypoints_aug.keypoints[i]
    print("Keypoint %d: (%.8f, %.8f) -> (%.8f, %.8f)" % (
        i, before.x, before.y, after.x, after.y)
    )

# 将关键点画在图片上。
# image with keypoints before/after augmentation (shown below)
image_before = keypoints.draw_on_image(image, size=7)
image_after = keypoints_aug.draw_on_image(image_aug, size=7)

fig, axes = plt.subplots(2, 1, figsize=(20, 15))
plt.subplots_adjust(left=0.2, bottom=0.2, right=0.8, top=0.8, hspace=0.3, wspace=0.0)
axes[0].set_title("image before")
axes[0].imshow(image_before)
axes[1].set_title("image after augmentation")
axes[1].imshow(image_after)

plt.show()

5. Bounding Boxes变换

imgaug在图像变换的同时变换图像中的bound box。bounding的支持包括:

  • 将bounding box封装成对象
  • 对bounding box进行变换
  • 将bounding box画在图像上
  • 移动bounding box的位置,将变换后的bounding box映射到图像上,计算bounding box的IoU。

5.1 基本变换

例子如下:

import imgaug as ia
from imgaug import augmenters as iaa

ia.seed(1)

image = ia.quokka(size=(256, 256))

# 定义2个bounding box
bbs = ia.BoundingBoxesOnImage([
    ia.BoundingBox(x1=65, y1=100, x2=200, y2=150),
    ia.BoundingBox(x1=150, y1=80, x2=200, y2=130)
], shape=image.shape)

seq = iaa.Sequential([
    iaa.Multiply((1.2, 1.5)), # 改变亮度, 不影响bounding box
    iaa.Affine(
        translate_px={"x": 40, "y": 60},
        scale=(0.5, 0.7)
    ) # 平移后缩放,会影响bounding box
])

# 固定变换
seq_det = seq.to_deterministic()

# 变换图像和bounding box
image_aug = seq_det.augment_images([image])[0]
bbs_aug = seq_det.augment_bounding_boxes([bbs])[0]

# 打印坐标
# use .x1_int, .y_int, ... to get integer coordinates
for i in range(len(bbs.bounding_boxes)):
    before = bbs.bounding_boxes[i]
    after = bbs_aug.bounding_boxes[i]
    print("BB %d: (%.4f, %.4f, %.4f, %.4f) -> (%.4f, %.4f, %.4f, %.4f)" % (
        i,
        before.x1, before.y1, before.x2, before.y2,
        after.x1, after.y1, after.x2, after.y2)
    )
# 输出
# BB 0: (65.0000, 100.0000, 200.0000, 150.0000) -> (130.7524, 171.3311, 210.1272, 200.7291)
# BB 1: (150.0000, 80.0000, 200.0000, 130.0000) -> (180.7291, 159.5718, 210.1272, 188.9699)

# image with BBs before/after augmentation (shown below)
image_before = bbs.draw_on_image(image, thickness=2)
image_after = bbs_aug.draw_on_image(image_aug, thickness=2, color=[0, 0, 255])

fig, axes = plt.subplots(2, 1, figsize=(20, 15))
plt.subplots_adjust(left=0.2, bottom=0.2, right=0.8, top=0.8, hspace=0.3, wspace=0.0)
axes[0].set_title("image before")
axes[0].imshow(image_before)
axes[1].set_title("image after augmentation")
axes[1].imshow(image_after)

plt.show()

5.2 平移bounding box

调用shift函数即可。

import imgaug as ia
from imgaug import augmenters as iaa

ia.seed(1)

# Define image and two bounding boxes
image = ia.quokka(size=(256, 256))
bbs = ia.BoundingBoxesOnImage([
    ia.BoundingBox(x1=25, x2=75, y1=25, y2=75),
    ia.BoundingBox(x1=100, x2=150, y1=25, y2=75)
], shape=image.shape)

# 两个box先右移动25像素,然后第2个box再向下移动25像素
bbs_shifted = bbs.shift(left=25)
bbs_shifted.bounding_boxes[1] = bbs_shifted.bounding_boxes[1].shift(top=25)

# Draw images before/after moving BBs
image = bbs.draw_on_image(image, color=[0, 255, 0], thickness=2, alpha=0.75)
image = bbs_shifted.draw_on_image(image, color=[0, 0, 255], thickness=2, alpha=0.75)

得到的图像为:
这里写图片描述

5.3 图像有缩放时bounding box的映射

调用on函数即可。

import imgaug as ia
from imgaug import augmenters as iaa

ia.seed(1)

# Define image with two bounding boxes
image = ia.quokka(size=(256, 256))
bbs = ia.BoundingBoxesOnImage([
    ia.BoundingBox(x1=25, x2=75, y1=25, y2=75),
    ia.BoundingBox(x1=100, x2=150, y1=25, y2=75)
], shape=image.shape)

# Rescale image and bounding boxes
image_rescaled = ia.imresize_single_image(image, (512, 512))
bbs_rescaled = bbs.on(image_rescaled)

# Draw image before/after rescaling and with rescaled bounding boxes
image_bbs = bbs.draw_on_image(image, thickness=2)
image_rescaled_bbs = bbs_rescaled.draw_on_image(image_rescaled, thickness=2)

5.4 计算Intersections, Unions和IoU

import imgaug as ia
from imgaug import augmenters as iaa
import numpy as np

ia.seed(1)

# Define image with two bounding boxes.
image = ia.quokka(size=(256, 256))
bb1 = ia.BoundingBox(x1=50, x2=100, y1=25, y2=75)
bb2 = ia.BoundingBox(x1=75, x2=125, y1=50, y2=100)

# Compute intersection, union and IoU value
# Intersection and union are both bounding boxes. They are here
# decreased/increased in size purely for better visualization.
bb_inters = bb1.intersection(bb2).extend(all_sides=-1)
bb_union = bb1.union(bb2).extend(all_sides=2)
iou = bb1.iou(bb2)

# Draw bounding boxes, intersection, union and IoU value on image.
image_bbs = np.copy(image)
image_bbs = bb1.draw_on_image(image_bbs, thickness=2, color=[0, 255, 0])
image_bbs = bb2.draw_on_image(image_bbs, thickness=2, color=[0, 255, 0])
image_bbs = bb_inters.draw_on_image(image_bbs, thickness=2, color=[255, 0, 0])
image_bbs = bb_union.draw_on_image(image_bbs, thickness=2, color=[0, 0, 255])
image_bbs = ia.draw_text(
    image_bbs, text="IoU=%.2f" % (iou,),
    x=bb_union.x2+10, y=bb_union.y1+bb_union.height//2,
    color=[255, 255, 255], size=13
)

得到的图像如下:
这里写图片描述

6. Stochastic Parameter

在做变换的时候,我们希望每张图片的变换都不一样,通过参数随机化选取可以实现。但是想要复现之前的变换,需要通过determinism来实现,比较繁琐。为了避免这种情况,使用Stochastic Parameters来实现。这个变量通常是一个抽象的概率分布,例如正太分布、均匀分布等等。通常所有的augmenter都能接受这个参数,这样就很方便控制变量范围。他们都可以和determinism结合。
例子:

from imgaug import augmenters as iaa
from imgaug import parameters as iap

seq = iaa.Sequential([
    iaa.GaussianBlur(
        sigma=iap.Uniform(0.0, 1.0)
    ),
    iaa.ContrastNormalization(
        iap.Choice(
            [1.0, 1.5, 3.0],
            p=[0.5, 0.3, 0.2]
        )
    ),
    iaa.Affine(
        rotate=iap.Normal(0.0, 30),
        translate_px=iap.RandomSign(iap.Poisson(3))
    ),
    iaa.AddElementwise(
        iap.Discretize(
            (iap.Beta(0.5, 0.5) * 2 - 1.0) * 64
        )
    ),
    iaa.Multiply(
        iap.Positive(iap.Normal(0.0, 0.1)) + 1.0
    )
])

所有可用的概率分布有:

6.1 正态分布

Normal(loc, scale): 均值为loc,标准差scale。

from imgaug import parameters as iap
params = [
    iap.Normal(0, 1),
    iap.Normal(5, 3),
    iap.Normal(iap.Choice([-3, 3]), 1),
    iap.Normal(iap.Uniform(-3, 3), 1)
]
iap.show_distributions_grid(params)

这里写图片描述

6.2 拉普拉斯分布

Laplace(loc, scale): 峰值loc, 宽度scale:

from imgaug import parameters as iap
params = [
    iap.Laplace(0, 1),
    iap.Laplace(5, 3),
    iap.Laplace(iap.Choice([-3, 3]), 1),
    iap.Laplace(iap.Uniform(-3, 3), 1)
]
iap.show_distributions_grid(params)

这里写图片描述

6.3 其他连续概率分布还有:

  • 卡方分布(ChiSquare)
  • 韦伯分布(Weibull)
  • 均匀分布(Uniform )
  • Beta分布

6.4 离散概率分布

  • 二项分布(Binomial)
  • 离散均匀分布(DiscreteUniform)
  • 泊松分布(Poisson distribution)

6.5 对分布的数学运算

imgaug支持随机参数的算术运算。 允许修改从分布中抽取的值或者将几个分布相互组合。支持的操作有:

  • Add
  • Subtract
  • Multiply
  • Divide
  • Power

6.6 特殊参数

支持的操作有:

  • Deterministic
  • Choice
  • Clip
  • Discretize
  • Absolute
  • RandomSign
  • ForceSign
  • Positive
  • Negative
  • FromLowerResolution

具体含义和用法见文档。

7. Blending/Overlaying images

augment会直接改变图片而把原图舍弃掉了。有时我们需要改变图像的局部,或者将原来的图片跟新变换的图片结合起来。这可以通过给变换前后的图片配上一定的权重(αα参数)或者使用一个pixel-wise的mask。
一个例子如下:

# First row
iaa.Alpha(
    (0.0, 1.0),
    first=iaa.MedianBlur(11),
    per_channel=True
)

# Second row
iaa.SimplexNoiseAlpha(
    first=iaa.EdgeDetect(1.0),
    per_channel=False
)

# Third row
iaa.SimplexNoiseAlpha(
    first=iaa.EdgeDetect(1.0),
    second=iaa.ContrastNormalization((0.5, 2.0)),
    per_channel=0.5
)

# Forth row
iaa.FrequencyNoiseAlpha(
    first=iaa.Affine(
        rotate=(-10, 10),
        translate_px={"x": (-4, 4), "y": (-4, 4)}
    ),
    second=iaa.AddToHueAndSaturation((-40, 40)),
    per_channel=0.5
)

# Fifth row
iaa.SimplexNoiseAlpha(
    first=iaa.SimplexNoiseAlpha(
        first=iaa.EdgeDetect(1.0),
        second=iaa.ContrastNormalization((0.5, 2.0)),
        per_channel=True
    ),
    second=iaa.FrequencyNoiseAlpha(
        exponent=(-2.5, -1.0),
        first=iaa.Affine(
            rotate=(-10, 10),
            translate_px={"x": (-4, 4), "y": (-4, 4)}
        ),
        second=iaa.AddToHueAndSaturation((-40, 40)),
        per_channel=True
    ),
    per_channel=True,
    aggregation_method="max",
    sigmoid=False
)

得到的图片为:
这里写图片描述
具体用法见文档。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 直方图均衡化的 Matlab 实现 1.1 imhist 函数 功能:计算和显示图像的色彩直方图 格式:imhist(I,n) imhist(X,map) 说明:imhist(I,n) 其中,n 为指定的灰度级数目,缺省值为256;imhist(X,map) 就算和显示索引色图像 X 的直方图,map 为调色板。用 stem(x,counts) 同样可以显示直方图。 1.2 imcontour 函数 功能:显示图像的等灰度值图 格式:imcontour(I,n),imcontour(I,v) 说明:n 为灰度级的个数,v 是有用户指定所选的等灰度级向量。 1.3 imadjust 函数 功能:通过直方图变换调整对比度 格式:J=imadjust(I,[low high],[bottom top],gamma) newmap=imadjust(map,[low high],[bottom top],gamma) 说明:J=imadjust(I,[low high],[bottom top],gamma) 其中,gamma 为校正量r,[low high] 为原图像中要变换的灰度范围,[bottom top] 指定了变换后的灰度范围;newmap=imadjust(map,[low high],[bottom top],gamma) 调整索引色图像的调色板 map 。此时若 [low high] 和 [bottom top] 都为2×3的矩阵,则分别调整 R、G、B 3个分量。 1.4 histeq 函数 功能:直方图均衡化 格式:J=histeq(I,hgram) J=histeq(I,n) [J,T]=histeq(I,...) newmap=histeq(X,map,hgram) newmap=histeq(X,map) [new,T]=histeq(X,...) 说明:J=histeq(I,hgram) 实现了所谓“直方图规定化”,即将原是图象 I 的直方图变换成用户指定的向量 hgram 。hgram 中的每一个元素 都在 [0,1] 中;J=histeq(I,n) 指定均衡化后的灰度级数 n ,缺省值为 64;[J,T]=histeq(I,...) 返回从能将图像 I 的灰度直方图变换成 图像 J 的直方图的变换 T ;newmap=histeq(X,map) 和 [new,T]=histeq(X,...) 是针对索引色图像调色板的直方图均衡。 2. 噪声及其噪声的 Matlab 实现 imnoise 函数 格式:J=imnoise(I,type) J=imnoise(I,type,parameter) 说明:J=imnoise(I,type) 返回对图像 I 添加典型噪声后的有噪图像 J ,参数 type 和 parameter 用于确定噪声的类型和相应的参数。 3. 图像滤波的 Matlab 实现 3.1 conv2 函数 功能:计算二维卷积 格式:C=conv2(A,B) C=conv2(Hcol,Hrow,A) C=conv2(...,'shape') 说明:对于 C=conv2(A,B) ,conv2 的算矩阵 A 和 B 的卷积,若 [Ma,Na]=size(A), [Mb,Nb]=size(B), 则 size(C)=[Ma+Mb-1,Na+Nb-1]; C=conv2(Hcol,Hrow,A) 中,矩阵 A 分别与 Hcol 向量在列方向和 Hrow 向量在行方向上进行卷积;C=conv2(...,'shape') 用来指定 conv2 返回二维卷积结果部分,参数 shape 可取值如下: 》full 为缺省值,返回二维卷积的全部结果; 》same 返回二维卷积结果中与 A 大小相同的中间部分; valid 返回在卷积过程中,未使用边缘补 0 部分进行计算的卷积结果部分,当 size(A)>size(B) 时,size(C)=[Ma-Mb+1,Na-Nb+1] 。 3.2 conv 函数 功能:计算多维卷积 格式:与 conv2 函数相同 3.3 filter2函数 功能:计算二维线型数字滤波,它与函数 fspecial 连用 格式:Y=filter2(B,X) Y=filter2(B,X,'shape') 说明:对于 Y=filter2(B,X) ,filter2 使用矩阵 B 中的二维 FIR 滤波器对数据 X 进行滤波,结果 Y 是通过二维互相关计算出来的,其大 小与 X 一样;对于 Y=filter2(B,X,'shape') ,filter2 返回的 Y 是通过二维互相关计算出来的,其大小由参数 shape 确定,其取值如下 : 》full 返回二维相关的全部结果,size(Y)>size(X); 》same 返回二维互相关结果的中间部分,Y 与 X 大小相同; 》valid 返回在二维互相关过程中,未使用边缘补 0 部分进行计算的结果部分,有 size(Y)<size(X) 。 3.4 fspecial 函数 功能:产生预定义滤波器 格式:H=fspecial(type) H=fspecial('gaussian',n,sigma) 高斯低通滤波器 H=fspecial('sobel') Sobel 水平边缘增强滤波器 H=fspecial('prewitt') Prewitt 水平边缘增强滤波器 H=fspecial('laplacian',alpha) 近似二维拉普拉斯运算滤波器 H=fspecial('log',n,sigma) 高斯拉普拉斯(LoG)运算滤波器 H=fspecial('average',n) 均值滤波器 H=fspecial('unsharp',alpha) 模糊对比增强滤波器 说明:对于形式 H=fspecial(type) ,fspecial 函数产生一个由 type 指定的二维滤波器 H ,返回的 H 常与其它滤波器搭配使用。 4. 彩色增强的 Matlab 实现 4.1 imfilter函数 功能:真彩色增强 格式:B=imfilter(A,h) 说明:将原始图像 A 按指定的滤波器 h 进行滤波增强处理,增强后的图像 B 与 A 的尺寸和类型相同 图像的变换 1. 离散傅立叶变换的 Matlab 实现 Matlab 函数 fft、fft2 和 fftn 分别可以实现一维、二维和 N 维 DFT 算法;而函数 ifft、ifft2 和 ifftn 则用来计算反 DFT 。 这些函数的调用格式如下: A=fft(X,N,DIM) 其中,X 表示输入图像;N 表示采样间隔点,如果 X 小于该数值,那么 Matlab 将会对 X 进行零填充,否则将进行截取,使之长度为 N ;DIM 表示要进行离散傅立叶变换。 A=fft2(X,MROWS,NCOLS) 其中,MROWS 和 NCOLS 指定对 X 进行零填充后的 X 大小。 A=fftn(X,SIZE) 其中,SIZE 是一个向量,它们每一个元素都将指定 X 相应维进行零填充后的长度。 函数 ifft、ifft2 和 ifftn的调用格式于对应的离散傅立叶变换函数一致。 例子:图像的二维傅立叶频谱 % 读入原始图像 I=imread('lena.bmp'); imshow(I) % 求离散傅立叶频谱 J=fftshift(fft2(I)); figure; imshow(log(abs(J)),[8,10]) 2. 离散余弦变换的 Matlab 实现 2.1. dCT2 函数 功能:二维 DCT 变换 格式:B=dct2(A) B=dct2(A,m,n) B=dct2(A,[m,n]) 说明:B=dct2(A) 计算 A 的 DCT 变换 B ,A 与 B 的大小相同;B=dct2(A,m,n) 和 B=dct2(A,[m,n]) 通过对 A 补 0 或剪裁,使 B 的大 小为 m×n。 2.2. dict2 函数 功能:DCT 反变换 格式:B=idct2(A) B=idct2(A,m,n) B=idct2(A,[m,n]) 说明:B=idct2(A) 计算 A 的 DCT 反变换 B ,A 与 B 的大小相同;B=idct2(A,m,n) 和 B=idct2(A,[m,n]) 通过对 A 补 0 或剪裁,使 B 的大小为 m×n。 2.3. dctmtx函数 功能:计算 DCT 变换矩阵 格式:D=dctmtx(n) 说明:D=dctmtx(n) 返回一个 n×n 的 DCT 变换矩阵,输出矩阵 D 为 double 类型。 3. 图像小波变换的 Matlab 实现 3.1 一维小波变换的 Matlab 实现 (1) dwt 函数 功能:一维离散小波变换 格式:[cA,cD]=dwt(X,'wname') [cA,cD]=dwt(X,Lo_D,Hi_D) 说明:[cA,cD]=dwt(X,'wname') 使用指定的小波基函数 'wname' 对信号 X 进行分解,cA、cD 分别为近似分量和细节分量;[cA,cD]=dwt(X,Lo_D,Hi_D) 使用指定的滤波器组 Lo_D、Hi_D 对信号进行分解。 (2) idwt 函数 功能:一维离散小波反变换 格式:X=idwt(cA,cD,'wname') X=idwt(cA,cD,Lo_R,Hi_R) X=idwt(cA,cD,'wname',L) X=idwt(cA,cD,Lo_R,Hi_R,L) 说明:X=idwt(cA,cD,'wname') 由近似分量 cA 和细节分量 cD 经小波反变换重构原始信号 X 。 'wname' 为所选的小波函数 X=idwt(cA,cD,Lo_R,Hi_R) 用指定的重构滤波器 Lo_R 和 Hi_R 经小波反变换重构原始信号 X 。 X=idwt(cA,cD,'wname',L) 和 X=idwt(cA,cD,Lo_R,Hi_R,L) 指定返回信号 X 中心附近的 L 个点。 3.2 二维小波变换的 Matlab 实现 二维小波变换的函数 ------------------------------------------------- 函数名 函数功能 --------------------------------------------------- dwt2 二维离散小波变换 wavedec2 二维信号的多层小波分解 idwt2 二维离散小波反变换 waverec2 二维信号的多层小波重构 wrcoef2 由多层小波分解重构某一层的分解信号 upcoef2 由多层小波分解重构近似分量或细节分量 detcoef2 提取二维信号小波分解的细节分量 appcoef2 提取二维信号小波分解的近似分量 upwlev2 二维小波分解的单层重构 dwtpet2 二维周期小波变换 idwtper2 二维周期小波反变换 ------------------------------------------------------------- (1) wcodemat 函数 功能:对数据矩阵进行伪彩色编码 格式:Y=wcodemat(X,NB,OPT,ABSOL) Y=wcodemat(X,NB,OPT) Y=wcodemat(X,NB) Y=wcodemat(X) 说明:Y=wcodemat(X,NB,OPT,ABSOL) 返回数据矩阵 X 的编码矩阵 Y ;NB 伪编码的最大值,即编码范围为 0~NB,缺省值 NB=16; OPT 指定了编码的方式(缺省值为 'mat'),即: OPT='row' ,按行编码 OPT='col' ,按列编码 OPT='mat' ,按整个矩阵编码 ABSOL 是函数的控制参数(缺省值为 '1'),即: ABSOL=0 时,返回编码矩阵 ABSOL=1 时,返回数据矩阵的绝对值 ABS(X) (2) dwt2 函数 功能:二维离散小波变换 格式:[cA,cH,cV,cD]=dwt2(X,'wname') [cA,cH,cV,cD]=dwt2(X,Lo_D,Hi_D) 说明:[cA,cH,cV,cD]=dwt2(X,'wname')使用指定的小波基函数 'wname' 对二维信号 X 进行二维离散小波变幻;cA,cH,cV,cD 分别为近似分 量、水平细节分量、垂直细节分量和对角细节分量;[cA,cH,cV,cD]=dwt2(X,Lo_D,Hi_D) 使用指定的分解低通和高通滤波器 Lo_D 和 Hi_D 分 解信号 X 。 (3) wavedec2 函数 功能:二维信号的多层小波分解 格式:[C,S]=wavedec2(X,N,'wname') [C,S]=wavedec2(X,N,Lo_D,Hi_D) 说明:[C,S]=wavedec2(X,N,'wname') 使用小波基函数 'wname' 对二维信号 X 进行 N 层分解;[C,S]=wavedec2(X,N,Lo_D,Hi_D) 使用指定 的分解低通和高通滤波器 Lo_D 和 Hi_D 分解信号 X 。 (4) idwt2 函数 功能:二维离散小波反变换 格式:X=idwt2(cA,cH,cV,cD,'wname') X=idwt2(cA,cH,cV,cD,Lo_R,Hi_R) X=idwt2(cA,cH,cV,cD,'wname',S) X=idwt2(cA,cH,cV,cD,Lo_R,Hi_R,S) 说明:X=idwt2(cA,cH,cV,cD,'wname') 由信号小波分解的近似信号 cA 和细节信号 cH、cH、cV、cD 经小波反变换重构原信号 X ;X=idwt2(cA,cH,cV,cD,Lo_R,Hi_R) 使用指定的重构低通和高通滤波器 Lo_R 和 Hi_R 重构原信号 X ;X=idwt2(cA,cH,cV,cD,'wname',S) 和 X=idwt2(cA,cH,cV,cD,Lo_R,Hi_R,S) 返回中心附近的 S 个数据点。 (5) waverec2 函数 说明:二维信号的多层小波重构 格式:X=waverec2(C,S,'wname') X=waverec2(C,S,Lo_R,Hi_R) 说明:X=waverec2(C,S,'wname') 由多层二维小波分解的结果 C、S 重构原始信号 X ,'wname' 为使用的小波基函数;X=waverec2(C,S,Lo_R,Hi_R) 使用重构低通和高通滤波器 Lo_R 和 Hi_R 重构原信号。 图像处理工具箱 1. 图像图像数据 缺省情况下,MATLAB将图像中的数据存储为双精度类型(double),64位浮点 数,所需存储量很大;MATLAB还支持另一种类型无符号整型(uint8),即图像矩 阵中每个数据占用1个字节。 在使用MATLAB工具箱时,一定要注意函数所要求的参数类型。另外,uint8 与double两种类型数据的值域不同,编程需注意值域转换。 从uint8到double的转换 --------------------------------------------- 图像类型 MATLAB语句 --------------------------------------------- 索引色 B=double(A)+1 索引色或真彩色 B=double(A)/255 二值图像 B=double(A) --------------------------------------------- 从double到uint8的转换 --------------------------------------------- 图像类型 MATLAB语句 --------------------------------------------- 索引色 B=uint8(round(A-1)) 索引色或真彩色 B=uint8(round(A*255)) 二值图像 B=logical(uint8(round(A))) --------------------------------------------- 2. 图像处理工具箱所支持的图像类型 2.1 真彩色图像 R、G、B三个分量表示一个像素的颜色。如果要读取图像中(100,50)处的像素值, 可查看三元数据(100,50,1:3)。 真彩色图像可用双精度存储,亮度值范围是[0,1];比较符合习惯的存储方法是用无 符号整型存储,亮度值范围[0,255] 2.2 索引色图像 包含两个结构,一个是调色板,另一个是图像数据矩阵。调色板是一个有3列和若干行 的色彩映象矩阵,矩阵每行代表一种颜色,3列分别代表红、绿、蓝色强度的双精度数。 注意:MATLAB中调色板色彩强度[0,1],0代表最暗,1代表最亮。 常用颜色的RGB值 -------------------------------------------- 颜色 R G B 颜色 R G B -------------------------------------------- 黑 0 0 1 洋红 1 0 1 白 1 1 1 青蓝 0 1 1 红 1 0 0 天蓝 0.67 0 1 绿 0 1 0 橘黄 1 0.5 0 蓝 0 0 1 深红 0.5 0 0 黄 1 1 0 灰 0.5 0.5 0.5 -------------------------------------------- 产生标准调色板的函数 ------------------------------------------------- 函数名 调色板 ------------------------------------------------- Hsv 色彩饱和度,以红色开始,并以红色结束 Hot 黑色-红色-黄色-白色 Cool 青蓝和洋红的色度 Pink 粉红的色度 Gray 线型灰度 Bone 带蓝色的灰度 Jet Hsv的一种变形,以蓝色开始,以蓝色结束 Copper 线型铜色度 Prim 三棱镜,交替为红、橘黄、黄、绿和天蓝 Flag 交替为红、白、蓝和黑 -------------------------------------------------- 缺省情况下,调用上述函数灰产生一个64×3的调色板,用户也可指定调色板大小。 索引色图像数据也有double和uint8两种类型。 当图像数据为double类型时,值1代表调色板中的第1行,值2代表第2行…… 如果图像数据为uint8类型,0代表调色板的第一行,,值1代表第2行…… 2.3 灰度图像 存储灰度图像只需要一个数据矩阵。 数据类型可以是double,[0,1];也可以是uint8,[0,255] 2.4 二值图像 二值图像只需一个数据矩阵,每个像素只有两个灰度值,可以采用uint8或double类型存储。 MATLAB工具箱中以二值图像作为返回结果的函数都使用uint8类型。 2.5 图像序列 MATLAB工具箱支持将多帧图像连接成图像序列。 图像序列是一个4维数组,图像帧的序号在图像的长、宽、颜色深度之后构成第4维。 分散的图像也可以合并成图像序列,前提是各图像尺寸必须相同,若是索引色图像, 调色板也必须相同。 可参考cat()函数 A=cat(4,A1,A2,A3,A4,A5) 3. MATLAB图像类型转换 图像类型转换函数 --------------------------------------------------------------------------- 函数名 函数功能 --------------------------------------------------------------------------- dither 图像抖动,将灰度图变成二值图,或将真彩色图像抖动成索引色图像 gray2ind 将灰度图像转换成索引图像 grayslice 通过设定阈值将灰度图像转换成索引色图像 im2bw 通过设定亮度阈值将真彩色、索引色、灰度图转换成二值图 ind2gray 将索引色图像转换成灰度图像 ind2rgb 将索引色图像转换成真彩色图像 mat2gray 将一个数据矩阵转换成一副灰度图 rgb2gray 将一副真彩色图像转换成灰度图像 rgb2ind 将真彩色图像转换成索引色图像 ---------------------------------------------------------------------------- 4. 图像文件的读写和查询 4.1 图形图像文件的读取 利用函数imread()可完成图形图像文件的读取,语法: A=imread(filename,fmt) [X,map]=imread(filename,fmt) [...]=imread(filename) [...]=imread(filename,idx) (只对TIF格式的文件) [...]=imread(filename,ref) (只对HDF格式的文件) 通常,读取的大多数图像均为8bit,当这些图像加载到内存中时,Matlab就将其存放 在类uint8中。此为Matlab还支持16bit的PNG和TIF图像,当读取这类文件时,Matlab就将 其存贮在uint16中。 注意:对于索引图像,即使图像阵列的本身为类uint8或类uint16,imread函数仍将 颜色映象表读取并存贮到一个双精度的浮点类型的阵列中。 4.2 图形图像文件的写入 使用imwrite函数,语法如下: imwrite(A,filename,fmt) imwrite(X,map,filename,fmt) imwrite(...,filename) imwrite(...,parameter,value) 当利用imwrite函数保存图像时,Matlab缺省的方式是将其简化道uint8的数据格式。 4.3 图形图像文件信息的查询 imfinfo()函数 5. 图像文件的显示 5.1 索引图像及其显示 方法一: image(X) colormap(map) 方法二: imshow(X,map) 5.2 灰度图像及其显示 Matlab 7.0 中,要显示一副灰度图像,可以调用函数 imshow 或 imagesc (即 imagescale,图像缩放函数) (1) imshow 函数显示灰度图像 使用 imshow(I) 或 使用明确指定的灰度级书目:imshow(I,32) 由于Matlab自动对灰度图像进行标度以适合调色板的范围,因而可以使用自定义 大小的调色板。其调用格式如下: imshow(I,[low,high]) 其中,low 和 high 分别为数据数组的最小值和最大值。 (2) imagesc 函数显示灰度图像 下面的代码是具有两个输入参数的 imagesc 函数显示一副灰度图像 imagesc(1,[0,1]); colormap(gray); imagesc 函数中的第二个参数确定灰度范围。灰度范围中的第一个值(通常是0), 对应于颜色映象表中的第一个值(颜色),第二个值(通常是1)则对应与颜色映象表 中的最后一个值(颜色)。灰度范围中间的值则线型对应与颜色映象表中剩余的值(颜色)。 在调用 imagesc 函数时,若只使用一个参数,可以用任意灰度范围显示图像。在该 调用方式下,数据矩阵中的最小值对应于颜色映象表中的第一个颜色值,数据矩阵中的最大 值对应于颜色映象表中的最后一个颜色值。 5.3 RGB 图像及其显示 (1) image(RGB) 不管RGB图像的类型是double浮点型,还是 uint8 或 uint16 无符号整数型,Matlab都 能通过 image 函数将其正确显示出来。 RGB8 = uint8(round(RGB64×255)); % 将 double 浮点型转换为 uint8 无符号整型 RGB64 = double(RGB8)/255; % 将 uint8 无符号整型转换为 double 浮点型 RGB16 = uint16(round(RGB64×65535)); % 将 double 浮点型转换为 uint16 无符号整型 RGB64 = double(RGB16)/65535; % 将 uint16 无符号整型转换为 double 浮点型 (2) imshow(RGB) 参数是一个 m×n×3 的数组 5.4 二进制图像及其显示 (1) imshow(BW) 在 Matlab 7.0 中,二进制图像是一个逻辑类,仅包括 0 和 1 两个数值。像素 0 显示 为黑色,像素 1 显示为白色。 显示时,也可通过NOT(~)命令,对二进制图象进行取反,使数值 0 显示为白色;1 显示 为黑色。 例如: imshow(~BW) (2) 此外,还可以使用一个调色板显示一副二进制图像。如果图形是 uint8 数据类型, 则数值 0 显示为调色板的第一个颜色,数值 1 显示为第二个颜色。 例如: imshow(BW,[1 0 0;0 0 1]) 5.5 直接从磁盘显示图像 可使用一下命令直接进行图像文件的显示: imshow filename 其中,filename 为要显示的图像文件的文件名。 如果图像是多帧的,那么 imshow 将仅显示第一帧。但需注意,在使用这种方式时,图像 数据没有保存在Matlab 7.0 工作平台。如果希望将图像装入工作台中,需使用 getimage 函 数,从当前的句柄图形图像对象中获取图像数据, 命令形式为: rgb = getimage; bwlabel 功能: 标注二进制图像中已连接的部分。 L = bwlabel(BW,n) [L,num] = bwlabel(BW,n) isbw 功能: 判断是否为二进制图像。 语法: flag = isbw(A) 相关命令: isind, isgray, isrgb 74.isgray 功能: 判断是否为灰度图像。 语法: flag = isgray(A) 相关命令: isbw, isind, isrgb 11.bwselect 功能: 在二进制图像中选择对象。 语法: BW2 = bwselect(BW1,c,r,n) BW2 = bwselect(BW1,n) [BW2,idx] = bwselect(...) 举例 BW1 = imread('text.tif'); c = [16 90 144]; r = [85 197 247]; BW2 = bwselect(BW1,c,r,4); imshow(BW1) figure, imshow(BW2) 47.im2bw 功能: 转换图像为二进制图像。 语法: BW = im2bw(I,level) BW = im2bw(X,map,level) BW = im2bw(RGB,level) 举例 load trees BW = im2bw(X,map,0.4); imshow(X,map)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值