二值化图像d

2024-04-29 10:25:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有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]的切片图:

enter image description here

我想通过将像素强度从[0, 1328]调整为{0, 1}来对所有这些大脑图像进行二值化。我的方法正确吗?

我首先将像素强度标准化为[0, 1]

normalized_brains = brains/1328 

然后使用二项分布对每个像素进行二值化:

^{pr2}$

绘制的结果看起来是正确的:

enter image description here

0像素强度表示黑色(背景),1像素强度表示白色(大脑)。在

我尝试了实现另一种方法来规范来自this post的图像,但它只给了我一个黑色的图像。这是因为np.finfo(np.float64)1.7976931348623157e+308,所以规范化步骤

normalized_brains = brains/1.7976931348623157e+308

刚刚返回了一个零数组,在二进制化步骤中也得到了一个零数组。在

我是否使用正确的方法对图像进行二值化?


Tags: 方法图像np切片像素数组平面大脑
3条回答

你试过在图像上设置一个阈值吗?在

这是一个common way对图像进行二值化,而不是尝试应用随机二项分布。你可以尝试一下:

binarized_brains = (brains > threshold_value).astype(int)

它根据图像值是否小于或大于所选阈值返回0和1的数组。在

您将不得不试验阈值,以找到最适合您的图像,但不需要首先对其进行规格化。在

如果这不能很好地工作,您还可以尝试使用skimage filters包中可用的阈值选项。在

IT is easy in OpenCV. as mentioned a very common way is defining a threshold, But your result looks like you are allocating random values to your intensities instead of thresholding it. 

import cv2
im = cv2.imread('brain.png', cv2.CV_LOAD_IMAGE_GRAYSCALE)
(th, brain_bw) = cv2.threshold(imy, 128, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
th = (DEFINE HERE)
im_bin = cv2.threshold(im, th, 255, cv
cv2.imwrite('binBrain.png', brain_bw)

brain

binBrain

将图像转换为二值图像的方法基本上相当于随机抖动,这是在二元介质上产生灰度值错觉的糟糕方法。传统的印刷品是一种二元介质,几个世纪以来,他们对印刷品中的灰值照片进行了微调。这个过程被称为halftoning,它在一定程度上是由纸上墨水的特性决定的,我们不必在二值图像中处理这些特性。在

那么人们在印刷品之外想出了什么方法呢?有序抖动(主要是Bayer matrix)和{a3}。在维基百科上阅读更多关于抖动的信息。几年前我写了一篇blog post showing how to implement all of these methods in MATLAB。在

我建议您在特定的应用程序中使用错误扩散抖动。以下是MATLAB中的一些关于Floyd Steinberg算法的代码(摘自我上面的博客文章),我希望你能把它翻译成Python:

img = imread('https://i.stack.imgur.com/d5E9i.png');
img = img(:,:,1);

out = double(img);
sz = size(out);
for ii=1:sz(1)
   for jj=1:sz(2)
      old = out(ii,jj);
      %new = 255*(old >= 128); % Original Floyd-Steinberg
      new = 255*(old >= 128+(rand-0.5)*100); % Simple improvement
      out(ii,jj) = new;
      err = new-old;
         if jj<sz(2)
            % right
            out(ii  ,jj+1) = out(ii  ,jj+1)-err*(7/16);
         end
      if ii<sz(1)
         if jj<sz(2)
            % right-down
            out(ii+1,jj+1) = out(ii+1,jj+1)-err*(1/16);
         end
            % down
            out(ii+1,jj  ) = out(ii+1,jj  )-err*(5/16);
         if jj>1
            % left-down
            out(ii+1,jj-1) = out(ii+1,jj-1)-err*(3/16);
         end
      end
   end
end

imshow(out)

enter image description here

在应用抖动之前对图像进行重新采样可以大大改善结果:

^{pr2}$

enter image description here

注意上述过程期望输入在[0255]范围内。很容易适应不同的范围,比如[01328]或[0,1],但也很容易将图像缩放到[0255]范围。在

相关问题 更多 >