【问题标题】:Auto Thresholding on R raster objectR光栅对象上的自动阈值
【发布时间】:2018-07-03 23:34:55
【问题描述】:

是否有可用于 R 栅格对象的自动阈值算法,例如“Otsu”。我曾尝试使用“authothresholder”包,但它效率低下,因为它适用于矩阵并且不适用于 32 位 tif 文件。我正在尝试将 NDWI 图像转换为二进制层。

【问题讨论】:

  • 维基百科文章 en.wikipedia.org/wiki/Otsu%27s_method 中的 matlab 代码大约需要五分钟才能转换为 R。它适用于 256 个 bin(即 8 位图像中的像素数),但我怀疑 NDWI 类似于 ( 0,1) 间隔,所以可能需要一些调整 - 你试过 tdhat 吗?
  • classInt 包实现了jenks 查找类的方法,我认为具有两个类的 Jenks 区间可能与 Otsu 阈值相同......
  • 您希望基于什么来确定阈值?你可以做x <- r > 0.5
  • 我想使用一种“自动阈值”方法。正如其他人所建议的那样,我可以使用可用的 R 包来实现它,例如 classInt、auththresholder 或 EBImage。但是,这将是非常低效的,因为它们不是来自空间数据。我将尝试使用这些包来估计阈值(t)值并按照建议应用 x t。我想知道是否有人有更有效的方法来解决这个问题。
  • @Arihant 如果您在问题中包含示例数据集,也许我们可以做一些基准测试?否则,除了自动阈值之前的采样之外,我看不出所提到的方法可以如何改进。

标签: r raster r-raster


【解决方案1】:

这是在 Bioconductor 提供的 EBImage 包中实现的。这是一个使用示例:

library(EBImage)
img <- readImage(system.file("images", "sample.png", package = "EBImage"))
thr <- img > otsu(img)
display(img)
display(thr)

实现基本上如下(取自 EBImage::otsu 的函数定义,即不是我的工作),因此您应该能够针对您使用的任何图像分析工具集调整以下内容:

img  # assuming img is a numeric matrix or vector

range = c(0, 1)  # assuming values in the matrix range from 0 to 1
levels = 256L
breaks = seq(range[1], range[2], length.out = levels + 1)

h = hist.default(img, breaks = breaks, plot = FALSE)
counts = as.double(h$counts)
mids = as.double(h$mids)
len = length(counts)
w1 = cumsum(counts)
w2 = w1[len] + counts - w1
cm = counts * mids
m1 = cumsum(cm)
m2 = m1[len] + cm - m1
var = w1 * w2 * (m2/w2 - m1/w1)^2
maxi = which(var == max(var, na.rm = TRUE))
(mids[maxi[1]] + mids[maxi[length(maxi)]])/2

【讨论】:

    猜你喜欢
    • 2020-03-22
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多