【问题标题】:How to read image data as a 2D grid using gnuplot如何使用 gnuplot 将图像数据读取为 2D 网格
【发布时间】:2021-06-03 12:58:06
【问题描述】:

Gnuplot 是一个非常强大的库,它支持绘制具有大量科学操作的函数。我的情况是我想读取单通道灰度图像,就像我们在 matlab 或 python 中使用 imread 读取一样,并使用 gnuPlot 将其存储到 2D 数据网格中。

基本上,我想制作图像灰度强度的轮廓。为此,我使用 matlab 将图像的单通道亮度数据导出为 .dat 文件,一旦导出,我将使用以下方法对其进行 splot:

set contour base 
splot 'greyScaleImagePixelByPixelData.dat' matrix

这很好,但如果我不想使用 Matlab 逐像素导出数据以绘制图像,该怎么办?

【问题讨论】:

  • 这张图片是什么格式的? Gnuplot 可以原生读取一些图像类型(avs edf ehf gif jpeg png)。其他格式可能是可能的,但需要更多地了解确切的数据格式。
  • 是 png 或 jpg 文件

标签: matlab gnuplot grayscale


【解决方案1】:

以下示例已使用 8 位和 16 位灰度 png 图像(无 alpha 通道)进行了测试。如果您的特定图像与此不匹配,请提供更完整的编码说明。

在读取像素数据后,您还没有确切说明您想对它做什么,所以我展示了一个将其显示为图像的明显示例(例如,一个规则的像素数组)。如果您想在绘图之前对值进行进一步操作,请展开问题以提供更多详细信息。

[~/temp] file galaxy-16bitgrayscale.png
galaxy-16bitgrayscale.png: PNG image data, 580 x 363, 16-bit grayscale, non-interlaced
[~/temp] gnuplot
set autoscale noextend
plot 'galaxy-16bitgrayscale.png' binary filetype=png with rgbimage

请注意,gnuplot 没有针对灰度和 RGB 图像数据的任何单独存储模式。在这种情况下,它将每个 16 位灰度值的 3 个副本加载到并行存储中,就好像它是单独的 R/G/B 像素数据一样。

[第二次编辑:显示灰度图像和轮廓级别]

set autoscale noextend
set view map
set contour surface
set cntrparam levels discrete 100, 200
set cntrparam firstlinetype 1
set key outside title "Contour levels"
splot 'galaxy16bit.png' binary filetype=png with rgbimage notitle, \
      '' binary filetype=png with lines nosurface title ""

【讨论】:

  • 我编辑了问题以包含更多详细信息。请注意,我的图像逐像素数据介于 0 到 1 之间
  • PNG 和 JPEG 文件都包含整数数据,而不是 0 到 1 之间的浮点数。您希望 gnuplot 读取原始 PNG 或 JPEG 文件,还是希望它读取其他格式的文件包含浮点值?
  • 我实际上尝试了不同的排列。是的,我也尝试过您的回答,效果很好。我还尝试读取包含浮点数的文件,它也可以工作。但是我被困在一个点上,那就是你知道我们可以用什么方法来绘制你在灰度图像上的答案中显示的轮廓吗?我什至尝试使用'set table '来做到这一点,但那样我无法设置密钥
  • 我知道这与问题无关,但如果我可以将我的 Key 值除以常数然后显示,我可以完全实现我想要的。这可能吗?
  • notitle 替换等高线图的title "",然后使用keyentry with lines lt 1 title "Contour at my first value" 等额外子句手动添加所需的关键条目。
猜你喜欢
  • 2012-07-01
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-13
  • 1970-01-01
  • 2017-04-02
  • 2020-11-03
相关资源
最近更新 更多