我想要获取一个图像文件(例如 tiff)并将其转换为电子表格(csv 或其他),以便每个像素都变成一个具有该像素的数值的单元格。
我已经在 Google 上搜索过了,每个人都试图向我推销 OCR 软件,但这肯定不是我想要的。
我将事先编辑图像,以便可以将其转换为所需的任何格式,并将其裁剪为可管理的大小。
我感兴趣的主要是灰度,并且可以将我需要的一点颜色分成 3 个单独的文件(每个颜色通道一个)。
我稍后会在电子表格上进行统计分析。我可能会用 Java 编写一些东西来完成它,尤其是考虑到这是(更)后期编程项目的概念验证,但对于本应简单的任务来说,这确实感觉太麻烦了。
答案1
这并不太复杂。这是 Java 中的一种方法。您只需将其写入 CSV……只需简单地写入文件即可。
for (int x = 0; x < image.getWidth(); ++x)
for (int y = 0; y < image.getHeight(); ++y) {
int pixel = image.getRGB(x, y);
int r = (pixel >> 16) & 0xff;
int g = (pixel >> 8) & 0xff;
int b = (pixel) & 0xff;
}
}
其中image
a 是BufferedImage
。您可以使用 加载 a BufferedImage
。ImageIO.read(File input);
您会在javax.imageio.ImageIO
。
答案2
我会尝试使用免费的开源 SAGA GIS,使用 Module/File/Grid/Import/Image 加载您的图像 - 您将获得 SAGA 网格,您可以将其导出为 XYZ 文件,该文件实际上是包含 X 和 Y 值以及每个像素的 Z 网格值的文本文件。这应该是您需要的。SAGA 是免费的。:-) http://www.saga-gis.org/en/index.html
答案3
我遇到过类似的问题。我收到了很多包含图表的图像文件。这其实是我最讨厌的事情。人们不给我发送实际的数据点,而这正是我进行任何计算或分析所需要的,而是给我发送一张漂亮的图片,这几乎毫无价值。
如果数据集很小,并且图表是计算机打印输出(大多数现代图表都是这样),而不是手绘,那么使用 MS 画图会更准确。您需要做的是打开文件并放大 x 轴。放大直到您可以将鼠标光标移动到单个像素。右下角有一对数字,即 x 和 y 像素坐标。在 x 轴上可重复的点(例如它与水平线相交的位置)找到每个编号刻度标记的 x 和 y。
如果它是打印输出的结果或从计算机程序保存的图像,则它们都应该具有相同的 y 坐标。但如果它是手绘图形(就像您在旧期刊文章中找到的那样),那么您就需要有 y 坐标,因为您需要校正整个图像的旋转或绘制得不完美。对 y 轴重复此操作。如果刻度标记有多个像素宽,并且您无法在中间找到一个像素,则可以估计中心,例如,如果刻度标记有 4 个像素宽,从像素编号 51 开始,到像素 54 结束,那么中心就是 52.5。(如果图形没有达到这种精度,这可能有点小题大做,手绘源中很常见)。
接下来,以同样的方式从图表中读取值,方法是放大并准备好 x 和 y 像素坐标。根据图表的不同,您可能能够将数据点视为小符号,也可能只是一条线。您也可以简化您的流程,只取与线相交的点或类似的东西。没有什么是一成不变的。
现在您有了数据,请将其全部放入 excel 中。根据您所做的工作以及图表的制作方式,有各种技巧可以帮助您。例如,如果他们使用非常粗的线,有时它有助于拟合兴趣点周围的邻域,然后选择一条垂直于该拟合线的线并平均该点上的值。其他时候,对落在特定 y 点的所有 x 点进行简单平均效果更好。有时您可以简单地取所有边缘点,并将它们拟合到曲线上即可完成。
这可能会让工作变得容易得多,但我昨天才发现它,还没有用过。它应该把图像中的所有点都转换成逗号分隔的像素值列表。然后,您可以例如按颜色挑选像素。这样,您应该能够在 excel 中处理它们,以获得原始数据,或多或少。如果数据是由导出到图像的 excel 图表生成的,那么它应该非常准确。
https://itg.beckman.illinois.edu/technology_development/software_development/get_rgb/