无论什么方法,高斯变换都是实现弹性形变的一个关键步骤
注:本文用MONAI 没成功,用的opencv搞得弹性, 应该是 MONAI版本匹配 参数匹配的问题,这东西认版本,后面抽空补充写个MONAI 专用版本的短文

import pydicom
import numpy as np
import matplotlib.pyplot as plt
import os
import torch
import cv2
import monai
import sys
from packaging import version
# 打印MONAI版本信息
print(f"使用的MONAI版本: {monai.__version__}")
print(f"Python版本: {sys.version}")
def load_dicom_as_array(file_path):
"""加载DICOM文件并返回图像数组和元数据"""
ds = pydicom.dcmread(file_path)
image = ds.pixel_array.astype(np.float32)
# 应用窗口设置(如果存在)
if 'WindowCenter' in ds and 'WindowWidth' in ds:
center = float(ds.WindowCenter)
width = float(ds.WindowWidth)
vmin = center - width / 2
vmax = center + width / 2
image = np.clip(image, vmin, vmax)
image = (image - vmin) / (vmax - vmin)
else:
# 如果没有窗口设置,使用最小-最大归一化
image_min = np.min(image)
image_max = np.max(image)
image = (image - image_min) / (image_max - image_min)
return image, ds
def apply_elastic_deformation_cv2(image, alpha=1000, sigma=25, random_state=None):
"""
使用OpenCV实现弹性形变 (兼容所有环境)
参数:
image: 输入图像 (2D numpy数组)
alpha: 形变强度
sigma: 高斯滤波器的标准差
random_state: 随机种子
返回:
形变后的图像
"""
if random_state is None:
random_state = np.random.RandomState(None)
shape = image.shape
dx = random_state.rand(*shape) * 2 - 1
dy = random_state.rand(*shape) * 2 - 1
# 应用高斯模糊
dx = cv2.GaussianBlur(dx, (0, 0), sigma) * alpha
dy = cv2.GaussianBlur(dy, (0, 0), sigma) * alpha
# 创建坐标网格
x, y = np.meshgrid(np.arange(shape[1]), np.arange(shape[0]))
# 应用位移
map_x = np.float32(x + dx)
map_y = np.float32(y


1254

被折叠的 条评论
为什么被折叠?



