【问题标题】:R raster recognizing black color raster imageR raster 识别黑色光栅图像
【发布时间】:2015-07-06 14:59:55
【问题描述】:

下面的代码在我的图像上生成了两个框。我计划进一步分析这些框中的像素。

我想设置一个条件,如果沿着框的边缘有黑色(或类似颜色,如灰色)像素,则不要继续。我怎样才能指定这样的条件?

在下面的示例中,对于红色方块,我不想继续进行,因为它在右上角有黑色像素。虽然我想继续处理绿色正方形,因为它的边缘没有黑色像素。

library(raster)
r1 <- brick(system.file("external/rlogo.grd", package="raster"))
x <- crop(r1, extent(0,50,0,50))
plotRGB(x)
plot(extent(c(0,20,0,20)), lwd=2, col="red", add=TRUE)
plot(extent(c(21,35,0,10)), lwd=2, col="Green", add=TRUE)

【问题讨论】:

    标签: r image image-processing colors raster


    【解决方案1】:

    这不是很好的定义,因为在这种情况下颜色是由 RGB 值组成的。但这是一个您可以适应的通用解决方案。我通过取平均值将它们“展平”为单个通道,然后在边界处测试最小值是否低于阈值(RGB 中的白色为 255、255、255,黑色为 0,0,0)

    proceed <- function(f, e, threshold) {
        lns <- as(as(e, 'SpatialPolygons'), 'SpatialLines')
        v <- unlist(extract(f, lns))
        ifelse( min(v, na.rm=TRUE) < threshold, FALSE, TRUE)
    }
    
    # flat <- mean(x) # not sophisticated see
    # http://stackoverflow.com/questions/687261/converting-rgb-to-grayscale-intensity
    flat <- sum(x * c(0.2989, 0.5870, 0.1140))
    proceed(flat, extent(c(0,20,0,20)), 100)
    proceed(flat, extent(c(21,35,0,10)), 100)
    

    (在看到 jbaums 的解决方案后得到了很大改善;现在已经消失了)

    【讨论】:

    • 我们在这里互相跳舞;)。我喜欢你已经包装成一个函数,所以我会删除。你有什么理由使用calc(x, mean) 而不是mean? (我可能还建议删除ifelse - 可以更改为min(v, na.rm=TRUE) &gt;= thresholdall(v &gt;= threshold, na.rm=TRUE))。
    • 没有。 mean(x) 会更清楚,所以我进行了编辑
    • 出于好奇,如果SpatialLines 位于单元格边界,则会提取哪些单元格的值?
    • 它使用下面的单元格。 library(raster); r &lt;- raster(nc=2, nr=2, xmn=0, xmx=2, ymn=0, ymx=2); values(r) &lt;- 1:4; line &lt;- spLines(rbind(c(0,1), c(2,1))); extract(r, line)
    • 伙计们,感谢您在过去几天回答我的问题...如果黑色或类似颜色不是一个好的条件,那么如果我将约束更改为如果像素在边缘会更容易有超过 1 种颜色然后忽略该方块所属的方块?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    • 2014-09-24
    • 2015-09-03
    • 2015-01-10
    • 2020-03-27
    • 1970-01-01
    相关资源
    最近更新 更多