将TIFF图像转换为XY坐标

3

我正试图在Python中将一个TIFF图像解构为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,))

1
请注意,上传到imgur会自动将您的文件转换为png格式。 - Pranav Hosangadi
糟糕!是的,我肯定可以添加代码,我不知道我怎么忘了添加它。是的,我也可以添加原始图像链接。对此感到抱歉! - maximus
嗨@PranavHosangadi!您能否检查一下是否能够看到代码和示例图像?然后,如果您能够帮忙去掉-1,我们将不胜感激。再次感谢您的建议! - maximus
1个回答

0

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()为您创建xy数值,然后将它们展平成列向量。对于较大的图像,这比循环方法快得多。

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中,因此你可以将其转换为数据框。

你需要导入哪些包来使用'colors.shape'? - maximus
“colors”是一个numpy数组,因此您不需要导入任何东西。 - Pranav Hosangadi
1
我认为您在append语句之后缺少了一个右括号。此外,当我运行此代码时,我遇到了一个索引错误: result.append([x, y, *colors[y, x, :]]) IndexError: index 434 is out of bounds for axis 1 with size 434 - maximus
1
@sarah 抱歉,w, h = colors.shapew, h 的顺序被颠倒了。现在已经修复了。 - Pranav Hosangadi
@sarah 使用一个更小的图片(只是一个 WxHx3 数组,例如使用一个4x5x3数组 colors = np.arange(4*5*3).reshape((4, 5, 3))),并验证每个坐标是否与您的期望相匹配。或者反转循环。 - Pranav Hosangadi
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接