使用R

时间:2017-07-11 07:45:36

标签: r imagemagick wolfram-mathematica tiff

有没有人知道如何使用R中的magick包从16位tiff图像中获取每个通道(RGB)的像素值?目前我正在使用Mathematica来执行此操作,因为我找不到在mathematica中执行此操作的等效方法。

我试图从image-magick包中读取像素值,结果是原始类型(例如" ff")。我使用函数rawToNum(package" pack")将原始类型转换为数字,结果接近于我在Mathematica中使用ImageDate函数获得的结果,但不完全相同。

4 个答案:

答案 0 :(得分:2)

您还可以使用magick包将像素作为数字数组进行访问。该示例基于包中的this vignette

library(magick)

tiger <- image_read('http://jeroen.github.io/images/tiger.svg')
tiger_tiff <- image_convert(tiger, "tiff")

# Access data in raw format and convert to integer
tiger_array <- as.integer(tiger_tiff[[1]])

然后,如果检查维度和类型,则获得:

dim(tiger_array)
[1] 900 900   4
is.numeric(tiger_array)
[1] TRUE

答案 1 :(得分:1)

我对R一点都不太了解,但我想你可以“shell out”并使用system()或者某些东西执行外部命令。

如果,那么,也许你可以使用它。首先,让我们制作一个16位TIFF文件,这是一个红蓝色的渐变,只有10像素宽,1像素高:

convert -size 10x1 gradient:red-blue image.tiff

enter image description here

现在我们可以使用 ImageMagick

将像素转储到文件中
convert image.tiff rgb:image.rgb

# Now check its length - yes, 60 bytes = 10 pixels with 2 bytes each for RG &B
ls -l image.rgb
-rw-r--r--  1 mark  staff  60 11 Jul 10:32 image.rgb

我们也可以将数据写入stdout,如下所示:

convert image.tiff rgb:- 

并以每行1个像素(6个字节)来查看它

convert image.tiff rgb:- | xxd -g 3 -c 6
00000000: ffff00 000000  ......   # Full Red, no Green, no Blue
00000006: 8de300 00721c  ....r.   # Lots of Red, no Green, a little Blue
0000000c: 1cc700 00e338  .....8
00000012: aaaa00 005555  ....UU
00000018: 388e00 00c771  8....q
0000001e: c77100 00388e  .q..8.
00000024: 555500 00aaaa  UU....
0000002a: e33800 001cc7  .8....
00000030: 721c00 008de3  r.....
00000036: 000000 00ffff  ......   # No Red, no Green, full Blue

我希望你能在R做类似的事情:

system("convert image.tif rgb:-")

转储像素的另一种方法可能是使用Perl来覆盖整个文件,然后解压缩包含的unsigned short并在每行打印一个:

convert image.tiff rgb: | perl -e 'my $str=do{local $/; <STDIN>}; print join("\n",unpack("v*",$str)),"\n";'

示例输出

65535      # Full Red 
0          # No Green
0          # No Blue
58253      # Lots of Red
0          # No Green
7282       # A little Blue
50972      # Moderate Red
0
14563
43690
0
21845
36408
0
29127
29127
0
36408
21845
0
43690
14563
0
50972
7282
0          # No Green
58253      # Lots of Blue
0          # No Red
0          # No Green
65535      # Full Blue

查看数据的另一种方法可能是使用odawk,如下所示:

convert image.tiff rgb: | od -An -tuS | awk '{for(i=1;i<=NF;i++){print $i}}'
65535
0
0
58253
0
7282
50972
0
14563
43690
0
21845
36408
0
29127
29127
0
36408
21845
0
43690
14563
0
50972
7282
0
58253
0
0
65535

-An禁止打印地址,而-tuS表示数据类型是无符号短。

答案 2 :(得分:1)

在ImageMagick中使用txt:输出格式可能稍微简单一些。

使用Mark Setchell的图像:

convert -size 10x1 gradient:red-blue image.tiff

使用TXT:as

convert image.tiff txt: | sed -n 's/^.*[(]\(.*\)[)].*[#].*$/\1/p'

产地:

65535,0,0
58253,0,7282
50972,0,14563
43690,0,21845
36408,0,29127
29127,0,36408
21845,0,43690
14563,0,50972
7282,0,58253
0,0,65535

或使用TXT:包含像素坐标

convert image.tiff txt: | sed -n 's/^\(.*[)]\).*[#].*$/\1/p'

产地:

0,0: (65535,0,0)
1,0: (58253,0,7282)
2,0: (50972,0,14563)
3,0: (43690,0,21845)
4,0: (36408,0,29127)
5,0: (29127,0,36408)
6,0: (21845,0,43690)
7,0: (14563,0,50972)
8,0: (7282,0,58253)
9,0: (0,0,65535)

答案 3 :(得分:1)

谢谢大家。我找到的最佳答案是我的一名学生使用包栅格:

library(raster)
img <- stack(filename)
x <- as.matrix(raster(img, 1)) # here we specify the layer 1, 2 or 3

唯一的问题是包栅格的函数as.matrix可能与基础包中的函数混淆,因此可能需要指定raster :: as.matrix。