目录
1、导入需要的库
2、定义可视化函数
3、从磁盘读取16位TIFF映像
4、定义适用于16位TIFF图像的增强管道
本示例说明了如何增强16位TIFF图像。 在卫星图像中使用16位图像。 以下技术也可以应用于所有非8位图像(即24位图像,32位图像等)。
1、导入需要的库
import random
import cv2
from matplotlib import pyplot as plt
import albumentations as A
2、定义可视化函数
def visualize(image):
# Divide all values by 65535 so we can display the image using matplotlib
image = image / 65535
plt.figure(figsize=(10, 10))
plt.axis('off')
plt.imshow(image)
3、从磁盘读取16位TIFF映像
# The image is taken from http://www.brucelindbloom.com/index.html?ReferenceImages.html
# © Bruce Justin Lindbloom
image = cv2.imread('images/DeltaE_16bit_gamma2.2.tif', cv2.IMREAD_UNCHANGED)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
visualize(image)
注意:OpenCV可能会错误地读取某些TIFF文件。 考虑使用tifffile地址:https://github.com/blink1073/tifffile
4、定义适用于16位TIFF图像的增强管道
Albumentations 支持两种描述像素强度的数据类型:-np.uint8,一个无符号的8位整数,可以定义0到255之间的值。-np.float32,一个单精度浮点数。对于np.float32输入,Albumentations期望该值在0.0到1.0之间。
Albumentations 有一个名为ToFloat的专用转换函数,该转换接受一个NumPy数组,其数据类型为np.uint16,np.uint32等(因此,任何使用大于255的值表示像素强度的数据类型)并将其转换为具有以下内容的NumPy数组np.float32数据类型。此外,此转换将所有输入值划分为[0.0,1.0]。默认情况下,如果输入数据类型为np.uint16,则将所有值除以65536,如果输入数据类型为np.uint32,则将所有值均除以4294967295.您可以在max_value参数中指定分频器。
非8位图像的增强流水线包括以下阶段:
首先,您使用ToFloat转换将输入图像转换为float32。转换后的图像中的所有值都将在[0.0,1.0]范围内。
然后,您使用所有必要的图像变换。
你可以选择在扩充管道的末尾使用FromFloat转换将图像转换回其原始数据类型。
transform = A.Compose([
A.ToFloat(max_value=65535.0),
A.RandomRotate90(),
A.Flip(),
A.OneOf([
A.MotionBlur(p=0.2),
A.MedianBlur(blur_limit=3, p=0.1),
A.Blur(blur_limit=3, p=0.1),
], p=0.2),
A.ShiftScaleRotate(shift_limit=0.0625, scale_limit=0.2, rotate_limit=45, p=0.2),
A.OneOf([
A.OpticalDistortion(p=0.3),
A.GridDistortion(p=0.1),
], p=0.2),
A.HueSaturationValue(hue_shift_limit=20, sat_shift_limit=0.1, val_shift_limit=0.1, p=0.3),
A.FromFloat(max_value=65535.0),
])
我们固定随机种子是为了可视化目的,因此增强将始终产生相同的结果。 在真实的计算机视觉管道中,您不应该在对图像应用转换之前固定随机种子,因为在这种情况下,管道将始终输出相同的图像。 图像增强的目的是每次使用不同的变换。
random.seed(7)
augmented = transform(image=image)
visualize(augmented['image'])