R栅格识别黑色光栅图像

时间:2015-04-27 23:52:35

标签: r image image-processing colors raster

以下代码在我的图片上生成两个框。我打算进一步分析这些盒子里的像素。

我想提出一个条件,如果沿着盒子的边缘,有一个黑色(或类似颜色,如灰色)像素,那么就不要继续了。我该如何指定这样的条件?

在下面的示例中,在红色方块的情况下,我不想继续前进,因为它在右上角有黑色像素。虽然我想继续绿色方块的情况,因为沿着它的边缘没有黑色像素。

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)

1 个答案:

答案 0 :(得分:2)

这个定义不是很明确,因为在这种情况下,颜色由RGB值组成。但这是一个可以适应的通用解决方案。我通过取平均值将这些'压扁'到单个通道,然后在边界处测试最小值低于阈值(白色为255,255,255,RGB为黑色,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的解决方案后大大改善了;现在已经消失了)