如何区分R中.png图像中的材质?
我有一个png图像,希望使用RGB信息区分材料,例如植物、金属和土壤。我一直在R中寻找精确的值或方法,但没有成功。我是这个领域的新手,也许我用错了术语 注意:我不是在寻找一种基于对象的方法,只是一种像素方法如何区分R中.png图像中的材质?,r,image,png,rgb,R,Image,Png,Rgb,我有一个png图像,希望使用RGB信息区分材料,例如植物、金属和土壤。我一直在R中寻找精确的值或方法,但没有成功。我是这个领域的新手,也许我用错了术语 注意:我不是在寻找一种基于对象的方法,只是一种像素方法 > library(png) > library(fields) > # read the image > pic091800<-readPNG("091800.png", native = FALSE, info = FALSE) &
> 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
>库(png)
>图书馆(字段)
>#阅读图片
>pic091800 dim(pic091800)
[1] 175 248 3
>pic091800[144100,]
[1] 0.5882353 0.4941176 0.4549020
>pic091800[144100,]*255
[1] 150 126 116
编辑:
我过去经常基于RGB值进行像素隔离。这里有一个我是如何着手做这件事的例子 假设我正在处理下图,我只想分离蓝点 为此,您需要软件包
library(光栅)
和library(png)
加载PNG图像
library(raster)
library(png)
img <- png::readPNG('~/path to file/blue dot example.png')
打印光栅
raster::plotRGB(r, scale = 1)
现在让我们做一个基于RGB值(r==0,G==0,B==1)隔离蓝点的绘图
最后,如果您想要真实的颜色,而不是光栅输出的颜色(在我们的例子中,我们想要蓝色),同时排除所有其他颜色,只需使用mask()
函数,如下所示
raster::plotRGB(mask(r, r[[1]] == 0 & r[[3]] == 1, maskvalue = 0), scale = 1)
这种方法的优点是brick()
函数可以读取一个对象中的所有条带,但我从来没有想到如何使用这种方法在一幅图像中隔离多种颜色。如果你对此感兴趣,比如说,你想要泥土和植物,你可以这样做:
为每个波段(R、G、B)创建光栅
ConvertedR您只能从RGB值中辨别颜色,但无法辨别材质。说一些颜色是红色的-可以是法拉利,可以是苹果,可以是口红。我知道。但由于我的现场图像仅限于三种材料:土壤、植物和金属管道。我想这会更容易:)我不知道,因为我看不到你的照片;-)添加了一个示例图像;-)感谢您精心设计的解决方案。我将修改它以包括我的案例:)@ahmathelte当然。我很高兴能帮上忙:)
plot(r[[1]] == 0 & r[[3]] == 1)
raster::plotRGB(mask(r, r[[1]] == 0 & r[[3]] == 1, maskvalue = 0), scale = 1)
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