医学影像弹性形变处理

 无论什么方法,高斯变换都是实现弹性形变的一个关键步骤

注:本文用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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值