【问题标题】:Binarized grayscale image contains too much noise二值化灰度图像包含太多噪声
【发布时间】:2019-02-02 18:27:59
【问题描述】:

我目前有这样的数字病理图像:

首先我使用以下代码将图像转换为灰度:

img=imread('DigitalPathology8.png');
figure;
imshow(img)
hsv=rgb2hsv(img); 
s=hsv(:,:,2); 

我得到了这张灰度图像:

虽然我尝试使用以下代码将此灰度图像二值化:

bw = imbinarize(s,'global'); 
figure
subplot(2,1,1)
imshow(s)
subplot(2,1,2)
imshow(bw)

我得到了这样的图像: 我的代码有什么问题?当我将相同的算法应用于其他图像时: 我可以得到只有蓝色单元格是白色的二值化图像,包括背景在内的其他单元格是黑色的。因此,在将相同的代码应用于我提到的第一张图像后,我也期望得到相同的结果。 有人可以帮我吗?

【问题讨论】:

  • 您要检测的单元格很少,因此阈值选择算法无法按您的意愿工作。在任何情况下,取决于 IHC 染色比苏木精更饱和不是最好的方法。查看污点分离(Google 中的“颜色反卷积”,这是一个用词不当,但很好)。
  • 感谢克里斯的建议!但我还是想问为什么它在第二张病理图像上效果很好?
  • 那里有更多的染色细胞。阈值寻找一个有意义地分离图像中灰度值的值。如果染色细胞太少,此过程将选择较低的阈值,以便有更多的白色输出像素。

标签: image matlab image-processing grayscale hsv


【解决方案1】:

您最好使用rgb2gray()(look here) 进行转换:

grey=rgb2gray(img)

这应该让你得到这样的东西:

我会推荐更复杂的方法,而不是全局阈值,例如Otsu,这将为您带来更好的结果:

但是,如果您只想提取蓝色单元格而不是图像的简单阈值版本,则应在灰度图像上使用完全不同的方法,例如 MaxEntropy。这会给你这样的东西:

还有这个

matlab中好像没有包含这个阈值的方法,而是一个plugin can be found

您还可以尝试一种完全不同的方法,通过基于color similarity 的阈值来检测蓝点: 使用这种方法,您可以将每个像素设置为白色,它与蓝色的颜色距离小于给定阈值。这应该会给你这样的东西(红色标记代表图像的前景):

参考颜色:

对于这种方法,我将 RGB 颜色 (17.3,32.5,54.5) 作为参考颜色,我的最大距离是 210。如果你有 ImageJ,你可以交互地使用这种方法,不久前我写了一个 plugin for that.As你可以看到,这种方法也会检测到错误的单元格,这是由于距离和选择的参考颜色值过高造成的。通过选择更合适的参考颜色和更小的距离值,可以最大限度地减少这种错误。

【讨论】:

  • 非常感谢您的友好回复!但是由于我需要处理甚至数百张这样的图像,我认为使用 ImageJ 可能不是一个好主意?
  • ImageJ 应该能够执行批处理,但该方法足够简单,可以在其他任何地方实现。
  • 那么使用MATLAB也应该通过实现这种方式达到同样的效果?
  • 是的,您只需要计算各个像素与参考颜色之间的颜色距离,如果距离低于任意阈值,则将像素设置为白色,否则将其设置为黑色
  • 谢谢!但是如何确定阈值呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多