【医学图像处理】之图像增强、去噪、边缘检测(SimpleITK)

【医学图像处理】之图像增强、去噪、边缘检测(SimpleITK)

1.内容

1、对数变换
图像对数变换首先将图像从SimpleITK图像数据转成Numpy矩阵数据,然后采用Numpy的log1p()函数来计算数据的log(1+x)变换,由于1+x不能小于零,因此这里我们使用图像减去图像的最小值来计算对数变换结果。
2、幂次变换
图像对数变换首先将图像从SimpleITK图像数据转成Numpy矩阵数据,然后采用Numpy的power()函数来计算数据的幂次变换,为了防止出现计算值溢出错误,因此这里我们使用图像减去图像均值再除以图像方差来计算图像幂次变换结果,,在这里我们计算图像3次幂变换。
3、指数变换
图像指数变换首先将图像从SimpleITK图像数据转成Numpy矩阵数据,然后采用Numpy的exp()函数来计算数据的指数变换,为了防止出现计算值溢出错误,因此这里我们使用图像减去图像均值再除以图像方差来计算图像指数变换结果。
4、直方图均衡化
使用函数AdativeHistogramEqualizationImageFilter()函数来实现图像的直方图均衡化,这个类函数需要人为设置三个参数:Alpha,Beta,Radius,其中Alpha参数是用来控制结果相对于经典直方图均衡化方法结果的相似程度,Beta参数用来控制图像锐化程度,Radius用来控制直方图统计时的区域大小。
5、均值滤波
均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标像素为中心的周围8个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值。均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。我们使用MeanImageFilter()函数来对图像进行平滑去噪。参数设置就是统计均值计算的半径大小,这里可以xyz方向上都一样的半径大小,也可以设置成不同的半径大小,在这里我们设置成5,就意味着是10x10x10区域里计算均值滤波的结果。
6、中值滤波
中值滤波的原理很简答,对一副图像上的某一点作为中值滤波器,必须先将预求的像素及其邻点内的像素值排序,确定出中值,并将中值赋予该像素点,让周围的像素值接近的真实值,从而消除孤立的噪声点,中值滤波对消除椒盐噪声非常有效。我们使用MedianImageFilter()函数来对图像进行中值滤波去噪。参数设置就是统计中值计算的半径大小,这里可以xyz方向上都一样的半径大小,也可以设置成不同的半径大小,在这里我们设置成5,就意味着是10x10x10区域里计算中值滤波的结果。7
7、高斯滤波
高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。我们使用SmoothingRecursiveGaussianImageFilter()函数来对图像进行高斯滤波平滑去噪。参数设置就是高斯核参数Sigma大小,这里可以xyz方向上都一样的大小,也可以设置成不同的大小,还有一个参数设置是是否要对高斯进行尺度归一化。
8、Sobel算子
使用SobelEdgeDetectionImageFilter()函数来计算图像梯度,梯度是有幅值和方向的,返回的Sobel梯度结果是梯度幅值。没有需要输入的参数,直接输入2d或3d图像就可以了,这边还要提醒一下,输入的图像必须是float类型的图像才可以计算。
9、canny算子
使用CannyEdgeDetectionImageFilter()函数提取图像的边缘。参数有4个需要人为设置,双边阈值的上限阈值和下限阈值,高斯平滑由两个参数来控制高斯核参数大小,高斯最大误差,必须设置在0~1之间。这边还要提醒一下,输入的图像必须是float类型的图像才可以计算。

2.代码

import SimpleITK as sitk
import numpy as np


image = sitk.ReadImage("srcdicom.mha")
np_image = sitk.GetArrayFromImage(image)

# 1.log transform
np_log_image = np.log1p(np_image - np.min(np_image))
log_image = sitk.GetImageFromArray(np_log_image)
log_image.SetOrigin(image.GetOrigin())
log_image.SetDirection(image.GetDirection())
log_image.SetSpacing(image.GetSpacing())
sitk.WriteImage(log_image, "log_image.mha")

# 2.power transform
np_image_clone1 = np_image.copy()
np_image_clone1 = (np_image_clone1 - np_image.mean()) / np_image.std()
np_power_image = np.power(np_image_clone1, 3)
power_image = sitk.GetImageFromArray(np_power_image)
power_image.SetOrigin(image.GetOrigin())
power_image.SetDirection(image.GetDirection())
power_image.SetSpacing(image.GetSpacing())
sitk.WriteImage(power_image, "power_image.mha")

# 3.exp transform
np_image_clone = np_image.copy()
np_image_clone = (np_image_clone - np_image.mean()) / np_image.std()
np_exp_image = np.exp(np_image_clone)
exp_image = sitk.GetImageFromArray(np_exp_image)
exp_image.SetOrigin(image.GetOrigin())
exp_image.SetDirection(image.GetDirection())
exp_image.SetSpacing(image.GetSpacing())
sitk.WriteImage(exp_image, "exp_image.mha")

# 4.Histogram equalization
sitk_hisequal = sitk.AdaptiveHistogramEqualizationImageFilter()
sitk_hisequal.SetAlpha(0.9)
sitk_hisequal.SetBeta(0.9)
sitk_hisequal.SetRadius(3)
sitk_hisequal = sitk_hisequal.Execute(image)
sitk.WriteImage(sitk_hisequal, "sitk_hisequal.mha")

# 5.mean filter
sitk_mean = sitk.MeanImageFilter()
sitk_mean.SetRadius(5)
sitk_mean = sitk_mean.Execute(image)
sitk.WriteImage(sitk_mean, 'sitk_mean.mha')

# 6.median filter
sitk_median = sitk.MedianImageFilter()
sitk_median.SetRadius(5)
sitk_median = sitk_median.Execute(image)
sitk.WriteImage(sitk_median, 'sitk_median.mha')

# 7.gassuian
sitk_gassuian = sitk.SmoothingRecursiveGaussianImageFilter()
sitk_gassuian.SetSigma(3.0)
sitk_gassuian.NormalizeAcrossScaleOff()
sitk_gassuian = sitk_gassuian.Execute(image)
sitk.WriteImage(sitk_gassuian, 'sitk_gassuian.mha')

# 8.sobel
image_float = sitk.Cast(image, sitk.sitkFloat32)
sobel_op = sitk.SobelEdgeDetectionImageFilter()
sobel_sitk = sobel_op.Execute(image_float)
sobel_sitk = sitk.Cast(sobel_sitk, sitk.sitkInt16)
sitk.WriteImage(sobel_sitk, "sobel_sitk.mha")

# 9.canny
canny_op = sitk.CannyEdgeDetectionImageFilter()
canny_op.SetLowerThreshold(40)
canny_op.SetUpperThreshold(120)
canny_op.SetVariance(3)
canny_op.SetMaximumError(0.5)
canny_sitk = canny_op.Execute(image_float)
canny_sitk = sitk.Cast(canny_sitk, sitk.sitkInt16)
sitk.WriteImage(canny_sitk, "canny_sitk.mha")

你可能感兴趣的:(医学影像)