医学图像的新型数据增强技术
- CS-DA 核心思想
- 自然图像和医学图像之间的关键差异
- CS-DA 步骤
- 确定增强后的数据数量
- 代码复现
论文链接:https://arxiv.org/ftp/arxiv/papers/2210/2210.09099.pdf
大多数用于医学分割的数据增强技术最初是在自然图像上开发的,没有考虑到医学图像整体布局标准固定的特点。
基于医学图像的特点,作者开发了切割-拼接数据增强(CS-DA)方法,这是一种用于医学图像分割的新型数据增强技术。
CS-DA通过将从不同原始医学图像中切割的不同位置分量拼接成新图像来增强数据集。
CS-DA的思想很简单:
假设有五张原始医学图像,每张图像都代表不同的医学情境,如X光片或MRI图像。
每张原始图像都被切割成四个相同大小的组件,就像将图像分成四个拼图块一样。
现在,我们可以创建新的图像,通过从这些原始图像中选择不同位置的组件并将它们拼接在一起。
假设我们从第一张原始图像中选择了第一个组件,从第二张原始图像中选择了第二个组件,依此类推,直到从第五张原始图像中选择了第五个组件。
这样,我们就创建了一张新的图像,它的组成部分来自不同原始图像的不同位置。
这个新图像会保持与原始图像相同的整体布局和外观,因为每个组件都是从医学图像中切割出的,并且它们有相似的对象或背景。
与传统的数据增强技术(如Cla-DA)不同,CS-DA不需要对原始图像进行复杂的数学函数处理,只需将组件按矩阵格式拼接起来。
而且,CS-DA不会引入任何噪音或虚假信息到新图像中,因为所有信息都来自于原始图像的合法组件。
更重要的是,Cla-DA技术通过随机改变原始图像的信息来生成新图像,这会引入虚假信息到新图像中。
相比之下,CS-DA不会向原始图像引入任何噪音或虚假信息。
CS-DA创建的新图像中的所有信息都来自原始图像。
整体布局的一致性导致了不同医学图像中相同位置区域的互换性。
可以通过使用一个医学图像中的区域来替换另一个医学图像中相同位置的区域来创建新的医学图像。
新的医学图像具有与原始医学图像相同的整体布局,并且新医学图像中的对象完整。
在分割任务中,新的医学图像可以与原始医学图像混合在一起,用于训练分割模型。
自然图像和医学图像之间的关键差异,这些差异在以下六个方面得到反映:摄像机方向、对象姿势、对象位置、对象完整性、对象比例和对象类别。
摄像机方向
对象姿势
对象位置
对象完整性
对象比例
对象类别
在上述六个方面,自然图像具有很多可能性。
这些方面的不确定性使得自然图像变化多样。
因此,包含相同类型对象的自然图像之间存在巨大差异。
另一方面,医学图像在这六个方面受到标准扫描设备、经过良好训练的放射科医生以及严格遵守扫描规范的患者的限制。
因此,在特定的分割任务中,医学图像的整体布局是标准和固定的。
这一特点使得医学图像之间的整体布局保持一致。
当涉及到2D图像时,通常有两个维度可以用于切割,例如横向和纵向。
而在3D图像中,通常有三个维度可以用于切割,例如长度、宽度和高度。
基于医学图像的区域互换性,本研究提出了CS-DA技术,包括两个步骤:切割图像成组件,以及将组件拼接成新图像。
1) 切割图像成组件
2) 将组件拼接成新图像
原始图像的特定位置组件用于填充新图像的相同位置区域(NorS):
原始图像的翻转组件用于填充新图像的对称位置区域(SymS):
上图展示了由CS-DA创建的一些自然图像和医学图像。
自然图像整体布局的多样性使新图像异常。
新自然图像中对象的完整性被破坏。
相比之下,新医学图像看起来正常。
每个新医学图像都具有完整的对象。
这个过程允许利用医学图像的互换性来增加数据集的多样性,从而提高分割模型的性能。
假设我们有一个原始数据集,其中包含两个不同的医学图像:
每个原始图像都可以被切割成两个组件:
非对称情况(使用NorS方法):
对称情况(使用SymS方法):
总结:
确定增强后的数据集样本大小的方法:
原始数据集大小: 根据原始数据集中包含的图像数量来确定。
组件数量: 根据每个原始图像可以切割成多少个组件来计算。
拼接方法: 根据使用的拼接方法来调整样本大小。
非对称情况: 如果使用NorS方法,增强后的数据集样本大小等于原始数据集大小
乘以组件数量
。
对称情况: 如果使用SymS方法,增强后的数据集样本大小是NorS方法的四倍,即原始数据集大小
乘以组件数量
乘以4
。
import cv2
import numpy as np
# 定义NorS方法
def cs_da_nors(original_image, num_components):
height, width, _ = original_image.shape
component_width = width // num_components
new_image = np.zeros_like(original_image)
for i in range(num_components):
start_x = i * component_width
end_x = (i + 1) * component_width
component = original_image[:, start_x:end_x, :]
new_image[:, start_x:end_x, :] = component
return new_image
# 定义SymS方法
def cs_da_syms(original_image, num_components):
height, width, _ = original_image.shape
component_width = width // num_components
new_image = np.zeros_like(original_image)
for i in range(num_components):
start_x = i * component_width
end_x = (i + 1) * component_width
component = original_image[:, start_x:end_x, :]
if i % 2 == 1:
component = cv2.flip(component, 1) # 翻转组件
new_image[:, start_x:end_x, :] = component
return new_image
# 使用NorS方法
original_image = cv2.imread("original_image.png") # 假设加载原始图像
num_components = 4
# 保存所有生成图像到文件
for i in range(num_components):
augmented_image_nors = cs_da_nors(original_image, num_components)
cv2.imwrite(f"augmented_image_nors_{i}.png", augmented_image_nors)
# 使用SymS方法
num_components = 4
# 保存所有生成图像到文件
for i in range(num_components):
augmented_image_syms = cs_da_syms(original_image, num_components)
cv2.imwrite(f"augmented_image_syms_{i}.png", augmented_image_syms)