上QQ阅读APP看书,第一时间看更新
4.1.2 图像对象和矩阵
EBImage使用特定的Image类来存储和处理图像,并将图像存储为包含像素强度的多维数组。所有的EBImage函数都可以使用矩阵和数组。下面,我们使用str()函数来查看Image对象的内部结构。
> str(img) Formal class 'Image' [package "EBImage"] with 2 slots ..@ .Data : num [1:1920, 1:1080] 0.424 0.424 0.424 0.424 0.424 ... ..@ colormode: int 0 > str(imgcol) Formal class 'Image' [package "EBImage"] with 2 slots ..@ .Data : num [1:603, 1:402, 1:3] 0.773 0.773 0.773 0.776 0.776 ... ..@ colormode: int 2
.Data是包含像素强度的数字数组。可以看到,img是灰色图像,所以数组是二维的,具有1920×1080个元素;imgcol是彩色图像,所以数组是三维的,具有603×402×3个元素,分别对应图像的像素宽度、像素高度和颜色通道。可以使用dim()函数来访问这些维度,方法与访问常规数组一样。
> dim(img) [1] 1920 1080 > dim(imgcol) [1] 603 402 3
可以使用imageData()函数查看图像数据。
> imageData(img)[1:3,1:6] [,1] [,2] [,3] [,4] [,5] [,6] [1,] 0.4235294 0.4235294 0.4235294 0.427451 0.427451 0.4313725 [2,] 0.4235294 0.4235294 0.4235294 0.427451 0.427451 0.4313725 [3,] 0.4235294 0.4235294 0.4235294 0.427451 0.427451 0.4313725 > imageData(imgcol)[1:3,1:3,1:3] , , 1 [,1] [,2] [,3] [1,] 0.772549 0.7725490 0.7803922 [2,] 0.772549 0.7725490 0.7843137 [3,] 0.772549 0.7764706 0.7843137 , , 2 [,1] [,2] [,3] [1,] 0.4862745 0.4862745 0.4941176 [2,] 0.4862745 0.4862745 0.4980392 [3,] 0.4862745 0.4901961 0.4980392 , , 3 [,1] [,2] [,3] [1,] 0.2705882 0.2705882 0.2784314 [2,] 0.2705882 0.2705882 0.2823529 [3,] 0.2705882 0.2745098 0.2823529
可以使用as.array()函数将Image转换为array。
> is.Image(img) [1] TRUE > is.Image(as.array(img)) [1] FALSE > is.array(as.array(img)) [1] TRUE
可以使用hist()函数绘制直方图,查看Image对象中像素强度的分布情况。运行以下程序代码可得到img和imgcol两个图像数据的直方图分布,如图4-4所示。
> par(mfrow=c(2,1)) > hist(img) > hist(imgcol) > par(mfrow=c(1,1))
图4-4 图像数据的直方图
图4-4中上部分是灰色图像img的直方图,只有一条灰色曲线,其值范围为[0,1],下部分是彩色图像imgcol的直方图,因此有红、绿、蓝三条曲线,值范围均为[0,1]。我们也可以使用range()函数查看像素强度的范围。
> range(img) [1] 0 1 > range(imgcol) [1] 0 1
使用print()函数,将其参数short设置为TRUE,可以获得更紧凑的图像对象概要,而不会给出像素强度数组。
> print(img,short = TRUE) Image colorMode : Grayscale storage.mode : double dim : 1920 1080 frames.total : 1 frames.render: 1 > print(imgcol,short = TRUE) Image colorMode : Color storage.mode : double dim : 603 402 3 frames.total : 3 frames.render: 1
colorMode表示的是颜色模式,img为Grayscale(灰色)、imgcol为Color(彩色)。dim是图像数据的维度,imgcol的第三维表示不同的颜色通道,分别对应图像的红色、绿色和蓝色强度。frames.total和frames.render表示图像中包含的帧总数以及渲染对应的帧数。