如何对用SimpleITK读取的DICOM图像进行直方图均衡 [英] How to do histogram equalization to DICOM images read with SimpleITK

查看:1233
本文介绍了如何对用SimpleITK读取的DICOM图像进行直方图均衡的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试对从* .nii.gz文件读取的所有图像进行直方图均衡化.

I'm trying to do histogram equalization to all images read from a *.nii.gz file.

我已经尝试过以下代码:

I have tried this code:

import SimpleITK as sitk
flair_file = '/content/gdrive/My Drive/Colab Notebooks/.../FLAIR.nii.gz'

images = sitk.ReadImage(flair_file)
print("Width: ", images.GetWidth())
print("Height:", images.GetHeight())
print("Depth: ", images.GetDepth())

print("Dimension:", images.GetDimension())
print("Pixel ID: ", images.GetPixelIDValue())
print("Pixel ID Type:", images.GetPixelIDTypeAsString())

具有以下输出:

Width:  240
Height: 240
Depth:  48
Dimension: 3
Pixel ID:  8
Pixel ID Type: 32-bit float

但是当我尝试使用OpenCV进行直方图均衡时,会出现错误:

But when I try to do histogram equalization with OpenCV I get errors:

images_array = sitk.GetArrayFromImage(images)
gray = cv2.cvtColor(images_array[24], cv2.COLOR_BGR2GRAY)

输出:

error: OpenCV(4.1.2) /io/opencv/modules/imgproc/src/color.simd_helpers.hpp:92: error: (-2:Unspecified error) in function 'cv::impl::{anonymous}::CvtHelper<VScn, VDcn, VDepth, sizePolicy>::CvtHelper(cv::InputArray, cv::OutputArray, int) [with VScn = cv::impl::{anonymous}::Set<3, 4>; VDcn = cv::impl::{anonymous}::Set<1>; VDepth = cv::impl::{anonymous}::Set<0, 2, 5>; cv::impl::{anonymous}::SizePolicy sizePolicy = (cv::impl::<unnamed>::SizePolicy)2u; cv::InputArray = const cv::_InputArray&; cv::OutputArray = const cv::_OutputArray&]'
> Invalid number of channels in input image:
>     'VScn::contains(scn)'
> where
>     'scn' is 1

所以,我尝试了其他代码:

So, I have tried this other code:

images_array = sitk.GetArrayFromImage(images)
#gray = cv2.cvtColor(images_array[24], cv2.COLOR_BGR2GRAY)
output = cv2.equalizeHist(images_array[24])

但是我得到这个错误:

error: OpenCV(4.1.2) /io/opencv/modules/imgproc/src/histogram.cpp:3429: error: (-215:Assertion failed) _src.type() == CV_8UC1 in function 'equalizeHist'

如何对那些DICOM图像进行直方图均衡(也许不使用OpenCV,而是使用SimpleITK)?

How can I do histogram equalization to those DICOM images (maybe not using OpenCV, and using instead SimpleITK)?

更新:
当我运行此命令时:

UPDATE:
When I run this command:

print(images_array[24].shape, images_array[24].dtype)

我明白了:

(240, 240) float32

推荐答案

SimpleITK确实具有AdaptiveHistogramEqualization函数,并且适用于float32图像.使用方法如下:

SimpleITK does have an AdaptiveHistogramEqualization function, and it does work on float32 images. Here's how you could use it:

new_images = sitk.AdaptiveHistogramEqualization(images)

请注意,这将对整个3d图像进行均衡.如果您想逐个切片地执行此操作,则它看起来像这样:

Note that this would do equalization across the whole 3d image. If you wanted to do it on a slice-by-slice basis, it'd look something like this:

new_images = []
for z in range(images.GetDepth()):
    new_images.append(sitk.AdaptiveHistogramEqualization(images[:,:,z])

更新:如@blowekamp所指出的那样,AHE不会在整个图像上产生全局直方图均衡,而是产生局部均衡.这是一些示例代码,展示了如何使用他描述的HistogramMatching函数来实现全局直方图均衡.

UPDATE: As pointed out by @blowekamp, AHE doesn't produce a global histogram equalization across the whole image, but a local equalization. Here is some example code that show's how to use the HistogramMatching function, as described by him, to achieve global histogram equalization.

import SimpleITK as sitk
import numpy as np

# Create a noise Gaussian blob test image
img = sitk.GaussianSource(sitk.sitkFloat32, size=[240,240,48], mean=[120,120,24])
img = img + sitk.AdditiveGaussianNoise(img,10)

# Create a ramp image of the same size
h = np.arange(0.0, 255,1.0666666666, dtype='f4')
h2 = np.reshape(np.repeat(h, 240*48), (48,240,240))
himg = sitk.GetImageFromArray(h2)
print(himg.GetSize())

# Match the histogram of the Gaussian image with the ramp
result=sitk.HistogramMatching(img, himg)

# Display the 3d image
import itkwidgets
itkwidgets.view(result)

请注意,itkwidgets允许您在Jupyter笔记本中查看3d图像.您可以在那里看到图像的直方图.

Note that itkwidgets allows you to view a 3d image in a Jupyter notebook. You can see the histogram of the image there.

这篇关于如何对用SimpleITK读取的DICOM图像进行直方图均衡的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆