如何区分 R 中 .png 图像的材质?

How to differente between materials from .png image in R?

我有一张 png 图像,想通过 RGB 信息区分植物、金属和土壤等材料。我一直在 R 中寻找确切的值或方法,但没有成功。我是这个领域的新手,也许我用错了术语。

注意:我不是在寻找基于对象的方法,而是在寻找像素方法。

> library(png)
> library(fields)

> # read the image 
> pic091800<-readPNG("091800.png", native = FALSE, info = FALSE)

> dim(pic091800)
[1] 175 248   3

> pic091800[144,100,]
[1] 0.5882353 0.4941176 0.4549020

> pic091800[144,100,]*255
[1] 150 126 116

编辑:

我以前经常基于 RGB 值进行像素隔离。这是我如何着手做的一个例子。

假设我正在处理下图,我只想隔离蓝点。

为此,您需要软件包 library(raster)library(png)

加载 PNG 图片

library(raster)
library(png)
img <- png::readPNG('~/path to file/blue dot example.png')

使用 brick() 函数将图像转换为光栅文件

r <- brick(img)

绘制光栅

raster::plotRGB(r, scale = 1)

现在让我们绘制一个图,根据 RGB 值 (r==0,G==0,B==1)

隔离我们的蓝点
plot(r[[1]] == 0 & r[[3]] == 1)

最后,如果你想要真实的颜色,而不是光栅输出的颜色(在我们的例子中,我们想要蓝色),同时排除其他一切,只需使用下面的 mask() 函数

raster::plotRGB(mask(r, r[[1]] == 0 & r[[3]] == 1, maskvalue = 0), scale = 1)

这种方法的优点是 brick() 函数读取一个对象中的所有波段,但我一直没有想出如何使用这种方法隔离一幅图像中的多种颜色。如果你有兴趣这样做,举个例子,你想要泥土和植物,你可以这样去做:

为每个波段(R、G、B)创建栅格

ConvertedR <- raster("example blue dot.png", band = 1)
ConvertedG <- raster("example blue dot.png", band = 2)
ConvertedB <- raster("example blue dot.png", band = 3)

#isolate color frequency of interest (this is an example assuming I had some reds, greens, and blues I wanted to isolate, but I made up these numbers)

RGB_selection <- ConvertedR >= 0 & ConvertedR < 50 & ConvertedG >= 0 & ConvertedG < 30 & ConvertedB>=60 & ConvertedB <=90

我希望这会有所帮助,几年前我在 stackexchange GIS 上发布了一个像你这样的问题,这里有 link(https://gis.stackexchange.com/questions/267402/defining-color-band-to-recognize-from-sing-layer-raster-in-r/267409#267409 )