我有10个来自BrainWeb的灰色脑部核磁共振扫描。它们存储为一个4d numpy数组brains
,形状为(10, 181, 217, 181)
。这10个大脑中的每一个都是由181个沿着z平面(从头顶到颈部)的切片组成的,其中每个切片在x(耳朵到耳朵)和y(眼睛到脑后)平面上分别是181像素x 217像素。在
所有的大脑都是dtype('float64')
型。所有大脑的最大像素强度是~1328
,最小的是~0
。例如,对于第一个大脑,我通过brains[0].max()
给予1328.338086605072
和{brain[0]
的切片图:
我想通过将像素强度从[0, 1328]
调整为{0, 1}
来对所有这些大脑图像进行二值化。我的方法正确吗?
我首先将像素强度标准化为[0, 1]
:
normalized_brains = brains/1328
然后使用二项分布对每个像素进行二值化:
^{pr2}$绘制的结果看起来是正确的:
0像素强度表示黑色(背景),1像素强度表示白色(大脑)。在
我尝试了实现另一种方法来规范来自this post的图像,但它只给了我一个黑色的图像。这是因为np.finfo(np.float64)
是1.7976931348623157e+308
,所以规范化步骤
normalized_brains = brains/1.7976931348623157e+308
刚刚返回了一个零数组,在二进制化步骤中也得到了一个零数组。在
我是否使用正确的方法对图像进行二值化?
你试过在图像上设置一个阈值吗?在
这是一个common way对图像进行二值化,而不是尝试应用随机二项分布。你可以尝试一下:
它根据图像值是否小于或大于所选阈值返回0和1的数组。在
您将不得不试验阈值,以找到最适合您的图像,但不需要首先对其进行规格化。在
如果这不能很好地工作,您还可以尝试使用skimage filters包中可用的阈值选项。在
brain
binBrain
将图像转换为二值图像的方法基本上相当于随机抖动,这是在二元介质上产生灰度值错觉的糟糕方法。传统的印刷品是一种二元介质,几个世纪以来,他们对印刷品中的灰值照片进行了微调。这个过程被称为halftoning,它在一定程度上是由纸上墨水的特性决定的,我们不必在二值图像中处理这些特性。在
那么人们在印刷品之外想出了什么方法呢?有序抖动(主要是Bayer matrix)和{a3}。在维基百科上阅读更多关于抖动的信息。几年前我写了一篇blog post showing how to implement all of these methods in MATLAB。在
我建议您在特定的应用程序中使用错误扩散抖动。以下是MATLAB中的一些关于Floyd Steinberg算法的代码(摘自我上面的博客文章),我希望你能把它翻译成Python:
在应用抖动之前对图像进行重新采样可以大大改善结果:
^{pr2}$注意上述过程期望输入在[0255]范围内。很容易适应不同的范围,比如[01328]或[0,1],但也很容易将图像缩放到[0255]范围。在
相关问题 更多 >
编程相关推荐