如何在 R 中将矩阵写为原始位图
How do I write a matrix as a raw bitmap in R
不是问题:
有很多人问 "how do I save a figure" 的变体,其中图形有边框、注释和样式;我不是在寻找任何东西,因为我可以在 base、lattice 或 ggsave 中做到这一点。如果您需要我,那么我可以列出 20 个 SO 问题,这与此不同。
tl;dr
我想要一个位图文件,其中我的矩阵是值。在 python 中,使用 OpenCV 我可以读取矩阵,像素 [1,1] 将具有特定值。如果我改变它并保存它,那么强度值就会改变。我如何获得它?
详情:
当我 运行 此代码时:
set.seed(1)
img_data <- matrix(sample(x = 0:255, size = 228*228,replace = T),nrow = 228,ncol = 228)
image(img_data)
我得到这张图片:
您可以看到默认注释。可以删除注释。
set.seed(1)
img_data <- matrix(sample(x = 0:255, size = 228*228,replace = T),nrow = 228,ncol = 228)
image(img_data, xaxt='n',yaxt='n')
这看起来不那么糟糕了。
但是用mspaint打开,显示问题。
问题:
- 实际信息周围有白色边框
- 图像大小为 789x503
我想要一张228x228的图片,图片的值[1,1]就是矩阵的值[1,1]。
如何在 base、lattice、ggplot 或其他 R 语言中做到这一点?
更新:
这几乎有效。
set.seed(1)
img_data <- matrix(sample(x = 0:255, size = 228*228,replace = T),nrow = 228,ncol = 228)
mar_old <- par("mar") #lets not permanently change values
xpd_old <- par("xpd") #lets not permanently change values
bmp(filename = "mytest.bmp", width = 227, height = 228, units = "px")
par(mar=rep(0, 4), xpd = NA)
image(img_data, bty ="n",axes=F,frame.plot=F, xaxt='n', ann=FALSE, yaxt='n', asp=1)
dev.off()
par(mar=mar_old, xpd=xpd_old)
它使这个图像
在mspaint中查看时,仍然在右侧和下边缘留下一条白线。
也许位图从零开始计数??
更新2:
这几乎行得通,而且可能是我不得不接受的。
library(magick)
set.seed(1)
img_data <- array(sample(x = 0:255, size = 228*228*3,replace = T),dim = c(228,228,3))
img <- magick::image_read(img_data/255)
image_write(img, path = "mystes3.bmp", format = "bmp")
它给出了这个:
并且在 mspaint 中:
它必须有 3 层,RGB (rgba?),才能转换。这意味着它是一个 3d 数组而不是 2d 矩阵。它的大小合适,因为它不添加填充。
您需要在image()
中将useRaster
参数设置为TRUE
:
set.seed(1)
img_data <- matrix(sample(x = 0:255, size = 228*228,replace = T),nrow = 228,ncol = 228)
mar_old <- par("mar") #lets not permanently change values
xpd_old <- par("xpd") #lets not permanently change values
bmp(filename = "mytest.bmp", width = 228, height = 228, units = "px")
par(mar=rep(0, 4), xpd = NA)
image(img_data, bty ="n",axes=F,frame.plot=F, xaxt='n', ann=FALSE, yaxt='n', asp=1, useRaster = T)
dev.off()
par(mar=mar_old, xpd=xpd_old)
我还将高度从 227 改成了 228。
做了小图:
与useRaster = T
没有useRaster
:
没有 useRaster
你甚至会丢失一行和一列。
不是问题:
有很多人问 "how do I save a figure" 的变体,其中图形有边框、注释和样式;我不是在寻找任何东西,因为我可以在 base、lattice 或 ggsave 中做到这一点。如果您需要我,那么我可以列出 20 个 SO 问题,这与此不同。
tl;dr
我想要一个位图文件,其中我的矩阵是值。在 python 中,使用 OpenCV 我可以读取矩阵,像素 [1,1] 将具有特定值。如果我改变它并保存它,那么强度值就会改变。我如何获得它?
详情:
当我 运行 此代码时:
set.seed(1)
img_data <- matrix(sample(x = 0:255, size = 228*228,replace = T),nrow = 228,ncol = 228)
image(img_data)
我得到这张图片:
您可以看到默认注释。可以删除注释。
set.seed(1)
img_data <- matrix(sample(x = 0:255, size = 228*228,replace = T),nrow = 228,ncol = 228)
image(img_data, xaxt='n',yaxt='n')
这看起来不那么糟糕了。
但是用mspaint打开,显示问题。
问题:
- 实际信息周围有白色边框
- 图像大小为 789x503
我想要一张228x228的图片,图片的值[1,1]就是矩阵的值[1,1]。
如何在 base、lattice、ggplot 或其他 R 语言中做到这一点?
更新:
这几乎有效。
set.seed(1)
img_data <- matrix(sample(x = 0:255, size = 228*228,replace = T),nrow = 228,ncol = 228)
mar_old <- par("mar") #lets not permanently change values
xpd_old <- par("xpd") #lets not permanently change values
bmp(filename = "mytest.bmp", width = 227, height = 228, units = "px")
par(mar=rep(0, 4), xpd = NA)
image(img_data, bty ="n",axes=F,frame.plot=F, xaxt='n', ann=FALSE, yaxt='n', asp=1)
dev.off()
par(mar=mar_old, xpd=xpd_old)
它使这个图像
在mspaint中查看时,仍然在右侧和下边缘留下一条白线。
也许位图从零开始计数??
更新2:
这几乎行得通,而且可能是我不得不接受的。
library(magick)
set.seed(1)
img_data <- array(sample(x = 0:255, size = 228*228*3,replace = T),dim = c(228,228,3))
img <- magick::image_read(img_data/255)
image_write(img, path = "mystes3.bmp", format = "bmp")
它给出了这个:
并且在 mspaint 中:
它必须有 3 层,RGB (rgba?),才能转换。这意味着它是一个 3d 数组而不是 2d 矩阵。它的大小合适,因为它不添加填充。
您需要在image()
中将useRaster
参数设置为TRUE
:
set.seed(1)
img_data <- matrix(sample(x = 0:255, size = 228*228,replace = T),nrow = 228,ncol = 228)
mar_old <- par("mar") #lets not permanently change values
xpd_old <- par("xpd") #lets not permanently change values
bmp(filename = "mytest.bmp", width = 228, height = 228, units = "px")
par(mar=rep(0, 4), xpd = NA)
image(img_data, bty ="n",axes=F,frame.plot=F, xaxt='n', ann=FALSE, yaxt='n', asp=1, useRaster = T)
dev.off()
par(mar=mar_old, xpd=xpd_old)
我还将高度从 227 改成了 228。
做了小图:
与useRaster = T
没有useRaster
:
没有 useRaster
你甚至会丢失一行和一列。