Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何对simpletk读取的DICOM图像进行直方图均衡化_Python_Opencv_Dicom_Itk_Simpleitk - Fatal编程技术网

Python 如何对simpletk读取的DICOM图像进行直方图均衡化

Python 如何对simpletk读取的DICOM图像进行直方图均衡化,python,opencv,dicom,itk,simpleitk,Python,Opencv,Dicom,Itk,Simpleitk,我正在尝试对从*.nii.gz文件读取的所有图像进行直方图均衡化 我尝试过以下代码: 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())

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

我尝试过以下代码:

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进行直方图均衡化时,我会出现错误:

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
但我得到了这个错误:

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,而使用SimpleIK)

更新: 运行此命令时:

print(images_array[24].shape, images_array[24].dtype)
我明白了:

(240, 240) float32

SimpleTk确实有一个AdaptiveHistorogrameQualization函数,它可以处理float32图像。以下是您可以如何使用它:

new_images = sitk.AdaptiveHistogramEqualization(images)
请注意,这将对整个3d图像进行均衡。如果你想一片一片地做,它看起来是这样的:

new_images = []
for z in range(images.GetDepth()):
    new_images.append(sitk.AdaptiveHistogramEqualization(images[:,:,z])
更新:正如@blowekamp所指出的,AHE不会在整个图像上生成全局直方图均衡化,而是局部均衡化。下面是一些示例代码,展示了如何使用HistogramMatching函数(如他所述)实现全局直方图均衡化

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图像。您可以在那里看到图像的直方图。

SimpleTk确实有一个AdaptiveHistorogrameQualization函数,并且它可以处理float32图像。以下是您可以如何使用它:

new_images = sitk.AdaptiveHistogramEqualization(images)
请注意,这将对整个3d图像进行均衡。如果你想一片一片地做,它看起来是这样的:

new_images = []
for z in range(images.GetDepth()):
    new_images.append(sitk.AdaptiveHistogramEqualization(images[:,:,z])
更新:正如@blowekamp所指出的,AHE不会在整个图像上生成全局直方图均衡化,而是局部均衡化。下面是一些示例代码,展示了如何使用HistogramMatching函数(如他所述)实现全局直方图均衡化

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图像。您可以在那里看到图像的直方图。

什么是printimages\u array[24]。形状,图像\u array[24]。数据类型?您确定图像是BGR吗?我猜DICOM图像是16位灰度的,很多都是这样的。如果是这种情况,则无法执行cv2.COLOR_BGR2GRAY,因为它已为灰色且没有3个通道。你不能做cv2.equalizeHist因为它不是8位灰度。。。请打印HansHirse推荐的内容,看看正在发生什么。嗯,我想你必须自己实现它:至少有一个频道,所以它没有那么复杂。因为它是一个浮动垫,你必须创建一些箱子,你可以决定箱子的数量。然后得到从低强度到高强度排序的料仓的cdf,并对其进行归一化。当它是8位图像时更容易,因为您只需要计算每个强度的出现次数,因此在这种情况下,一个具有256个存储单元,并且易于标准化。。。。图像的值是离散的吗?范围是多少?0-255? 0-65536?什么是printimages_array[24]。形状,images_array[24]。数据类型?您确定这些图像是BGR吗?我猜DICOM图像是16位灰度的,很多都是这样的。如果是这种情况,则无法执行cv2.COLOR_BGR2GRAY,因为它已为灰色且没有3个通道。你不能做cv2.equalizeHist因为它不是8位灰度。。。请打印HansHirse推荐的内容,看看正在发生什么。嗯,我想你必须自己实现它:至少有一个频道,所以它没有那么复杂。因为它是一个浮动垫,你必须创建一些箱子,你可以决定箱子的数量。然后得到从低强度到高强度排序的料仓的cdf,并对其进行归一化。当它是8位图像时更容易,因为您只需要计算每个强度的出现次数,因此在这种情况下,一个具有256个存储单元,并且易于标准化。。。。图像的值是离散的吗?范围是多少?0-255? 0-65536?谢谢!这就是我要找的。自适应HistorogrameQualification做局部对比度增强。经典的直方图均衡化是一种全局强度映射。您要查找的过滤器是HistorogramatchingImageFilter。对于参考图像,您可以将np.arang0.0、1.0、256、dtype=float转换为sitk图像。@blowekamp您知道是否有办法将SimpleTk图像转换为OpenCV图像吗?换句话说,有没有办法将SimpleTk图像与cv2.equalizeHist方法一起使用?谢谢。@VansFannel您不能直接从SimpleTk转换到OpenCV。你必须通过numpy。@DaveChen当你说注意这将在整个3d图像上进行均衡时,你的意思是它将在每个图像上进行均衡。如果它有48个图像,它将使所有图像相等,不是吗?谢谢,谢谢!这就是我要找的。自适应HistorogrameQualification做局部对比度增强。经典的直方图均衡化是一种全局强度映射。您要查找的过滤器是HistorogramatchingImageFilter。对于参考图像,您可以将np.arang0.0、1.0、256、dtype=float转换为sitk图像。@blowekamp您知道有什么方法吗
要将SimpleTk图像转换为OpenCV图像?换句话说,有没有办法将SimpleTk图像与cv2.equalizeHist方法一起使用?谢谢。@VansFannel您不能直接从SimpleTk转换到OpenCV。你必须通过numpy。@DaveChen当你说注意这将在整个3d图像上进行均衡时,你的意思是它将在每个图像上进行均衡。如果它有48个图像,它将使所有图像相等,不是吗?谢谢