将 TIFF 图像转换为 XY 坐标
Converting TIFF Image to XY Coordinates
我正在尝试将 TIFF 图像解构为 Python 中的 XY 坐标。数据框中的第一列应为 X,第二列应为 Y。附上示例文件。它会以与 JPEG 相同的方式完成吗?到目前为止,我已经尝试了下面的代码。
示例 Tiff 图片:
https://file-examples.com/index.php/sample-images-download/sample-tiff-download/
示例代码(无法弄清楚我缺少什么来获取坐标):
from PIL import Image
import numpy as np
import pandas as pd
image= Image.open(r"file_example_TIFF_1MB.tiff")
mypixels= colourImg.convert("RGB")
colors = np.array(mypixels.getdata()).reshape(image.size + (3,))
colors
是一个 WxHx3
数组。我们来看colors[:, :, 0]
,也就是红色通道。 X 坐标是列索引,Y 坐标是行索引。要创建你想要的数据框,你需要迭代这些。
result = []
h, w, _ = colors.shape
for x in range(w):
for y in range(h):
result.append([x, y, *colors[y, x, :]])
然后,创建数据框
df = pd.DataFrame(result, columns=["X", "Y", "R", "G", "B"])
或者,使用 numpy.meshgrid()
为您创建 x
和 y
数字,然后将它们展平为列向量。对于较大的图像,这将比循环方法快得多。
result = np.zeros((w * h, 5))
h, w, c = colors.shape
xg, yg = np.meshgrid(range(w), range(h))
result[:, 0] = xg.flatten()
result[:, 1] = yg.flatten()
for i in range(c):
result[:, 2 + i] = colors[:, :, i].flatten()
现在您在 result
中拥有与之前相同的内容,因此您可以将其转换为数据帧。
我正在尝试将 TIFF 图像解构为 Python 中的 XY 坐标。数据框中的第一列应为 X,第二列应为 Y。附上示例文件。它会以与 JPEG 相同的方式完成吗?到目前为止,我已经尝试了下面的代码。
示例 Tiff 图片: https://file-examples.com/index.php/sample-images-download/sample-tiff-download/
示例代码(无法弄清楚我缺少什么来获取坐标):
from PIL import Image
import numpy as np
import pandas as pd
image= Image.open(r"file_example_TIFF_1MB.tiff")
mypixels= colourImg.convert("RGB")
colors = np.array(mypixels.getdata()).reshape(image.size + (3,))
colors
是一个 WxHx3
数组。我们来看colors[:, :, 0]
,也就是红色通道。 X 坐标是列索引,Y 坐标是行索引。要创建你想要的数据框,你需要迭代这些。
result = []
h, w, _ = colors.shape
for x in range(w):
for y in range(h):
result.append([x, y, *colors[y, x, :]])
然后,创建数据框
df = pd.DataFrame(result, columns=["X", "Y", "R", "G", "B"])
或者,使用 numpy.meshgrid()
为您创建 x
和 y
数字,然后将它们展平为列向量。对于较大的图像,这将比循环方法快得多。
result = np.zeros((w * h, 5))
h, w, c = colors.shape
xg, yg = np.meshgrid(range(w), range(h))
result[:, 0] = xg.flatten()
result[:, 1] = yg.flatten()
for i in range(c):
result[:, 2 + i] = colors[:, :, i].flatten()
现在您在 result
中拥有与之前相同的内容,因此您可以将其转换为数据帧。