Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何区分R中.png图像中的材质?_R_Image_Png_Rgb - Fatal编程技术网

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

如何区分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) &

我有一个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

>库(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