【问题标题】:Converting height data from CSV file to IMG将高度数据从 CSV 文件转换为 IMG
【发布时间】:2020-01-12 18:28:43
【问题描述】:

我有一些来自显微镜的高度数据。我的问题是:如何将 CSV 文件转换为 IMG 输出并正确缩放颜色?我拥有的数据是 CSV 文件,例如:

90,40,50,30,20
11, 2, 7,30,20
90,40,50,30,50
16,40,50, 4, 6
90, 4,50,30,20
...

其中列是 x 坐标,行​​是 y 坐标,条目是 z 坐标。

它也应该超过一个固定的比例。这意味着生成的图像不应超过最高和最低值,以便多个文件具有可比性。

到目前为止我所做的是:

IMG = genfromtxt('RohCSV/{}.csv'.format(filename), delimiter=',')

那种工作,但我有规模问题。结果没有可比性。

我希望它是可以理解的。

【问题讨论】:

  • 请问IMG是什么?
  • 嗯?如果每一行包含一个 X、一个 Y 和一个 Z 值,为什么会有 5 个字段?哦,不,你说列是 x 坐标,行​​是 y 坐标,但我不明白 - 如果第一列是 x,那是 90,这意味着 x 是 90,但行是 y-坐标,所以 90 是行和列。不,那也一定是错的……请问第一行用简单的英语是什么意思?
  • @MarkSetchell 这已经是表格(图像)数据了。否则genfromtxt 不应该像问题中那样轻松工作。该评论确实具有误导性,但它只告诉我们典型的 NumPy(图像)数组索引(行 = y 坐标,列 = x 坐标)。我认为,唯一(剩下的)问题是“规模”,即从我的角度来看,最小/最大标准化。
  • @HansHirse 好的,谢谢。没听说过???

标签: python image numpy csv genfromtxt


【解决方案1】:

这取决于您如何比较输出。例如,当使用 Matplotlib 时,您应该获得默认的最小/最大标准化输出。我们来看下面的例子:

from matplotlib import pyplot as plt
import numpy as np

plt.figure(1, figsize=(12, 5))

# Original data/image
IMG = np.genfromtxt('test.csv', delimiter=',')
plt.subplot(1, 2, 1), plt.imshow(IMG), plt.colorbar()

# Min/max normalized data/image
IMG = IMG - np.min(IMG)
IMG = IMG / np.max(IMG)
plt.subplot(1, 2, 2), plt.imshow(IMG), plt.colorbar()

plt.tight_layout()
plt.show()

这就是输出:

如您所见,Matplotlib 的默认输出(左)与显式最小/最大归一化数据/图像(右)的输出是相等的。

除此之外,呈现的最小/最大归一化应该是您正在寻找的。​​p>

希望有帮助!

-----------------------
System information
-----------------------
Python:      3.8.1
Matplotlib:  3.2.0rc1
NumPy:       1.18.1
-----------------------

编辑:在评论中澄清后,我想在 Matplotlib 的 imshow 中使用 vminvmax 参数可能是最简单的方法:

from matplotlib import pyplot as plt
import numpy as np


def plot_scaled(data, min_scale, max_scale):
    plt.imshow(data, vmin=min_scale, vmax=max_scale), plt.colorbar()


# Original data/image
IMG = np.genfromtxt('test.csv', delimiter=',')

# Artificial data
IMG_large = IMG + 10
IMG_even_larger = IMG + 100

plt.figure(1, figsize=(15, 4))
for i, img in enumerate([IMG, IMG_large, IMG_even_larger]):
    plt.subplot(1, 3, i+1), plot_scaled(img, 0, 200)
plt.tight_layout()
plt.show()

值 100 在所有三个图中具有相同的颜色。

【讨论】:

  • 您好 HansHirse,谢谢您的回答。您的代码运行良好!我剩下的唯一问题是,np.min(IMG)np.max(IMG) 因图像而异。我的目标是,例如高度 5000000 在所有图像中始终以相同的颜色显示。我想我需要一个从高度到颜色的固定比例,但我不知道如何实现。现在我的输出是:imgur.com/a/foa3JXg 非常感谢您到目前为止的帮助!最好的问候马克斯
  • @Max 我更新了我的答案。例如,对于 Matplotlib 的可视化目的,实现这一目标的最简单方法是使用 vminvmax 参数。
  • 非常感谢!这正是我想要的!
猜你喜欢
  • 2019-09-11
  • 1970-01-01
  • 2011-06-12
  • 2013-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-13
  • 2013-01-08
相关资源
最近更新 更多