如何从图像中提取 (x, y) 坐标并写入 CSV 文件?

Posted

技术标签:

【中文标题】如何从图像中提取 (x, y) 坐标并写入 CSV 文件?【英文标题】:How to extract (x, y) coordinates from image and write to CSV file? 【发布时间】:2021-06-03 03:52:07 【问题描述】:

我需要使用 Python 从给定的图像文件中提取(x, y) 坐标。

我希望数据采用以下格式

pixel#   x    y  
1        0    0  
2        1    0  
.  
. 
301      0    1  
302      1    1  
.  
.  
XX,000   299 199  

对于我拥有的任何大小的图像文件。

目前我正在使用这个脚本:

from PIL import Image
import numpy as np 
import sys

# load the original image
img_file = Image.open("inputimage_005004.jpg") 
img_file.show() 

# get original image parameters...
width, height = img_file.size
format = img_file.format
mode = img_file.mode

# Make image Greyscale
img_grey = img_file.convert('L') 
img_grey.save('result.jpg')
img_grey.show()
value = np.asarray(img_grey.getdata(),dtype=img_grey.float64).reshape((img_grey.size[1],img_grey.size[0]))
np.savetxt("outputdata.csv", value, delimiter=',')

但是我在倒数第二行遇到错误

value = np.asarray(...)

错误是:

AttributeError: 'Image' object has no attribute 'float64`

另外,我希望输出类似于这个 *** 问题中的输出:

Extract x,y coordinates of each pixel from an image in Python.

如何将我当前的脚本与上述链接结合并修复我当前的错误?


编辑:

错误已修复,但我没有正确获取图像文件的(x, y) 坐标。它给了我一个很长的数字,像这样:

2.270000000000000000e+02,2.370000000000000000e+02,2.270000000000000000e+02,2.320000000000000000e+02,2.330000000000000000e+02,...

但是,我希望它采用如上所示的格式。我怎样才能做到这一点?

【问题讨论】:

在倒数第二行尝试dtype=np.float64 而不是dtype=img_grey.float64 我做到了,它修复了错误,谢谢!但是输出到 outputdata.csv 文件中的数据不是我想要的。我怎样才能格式化它,以便我可以获得与我发布的链接类似的输出? @AnuragDabas 【参考方案1】:

您几乎可以原样使用链接问答中的this answer。为了正确打印 CSV 文件中的整数,您需要相应地设置 np.savetxt 中的 fmt 参数。如果您明确希望将像素数放在前面,只需添加另一列从 1 到像素数。

这就是我的解决方案:

from PIL import Image
import numpy as np

img_grey = Image.open('path/to/your/image.png').convert('L')
print(img_grey.size)
# (300, 241)

# Taken from: https://***.com/a/60783743/11089932
xy_coords = np.flip(np.column_stack(np.where(np.array(img_grey) >= 0)), axis=1)

# Add pixel numbers in front
pixel_numbers = np.expand_dims(np.arange(1, xy_coords.shape[0] + 1), axis=1)
value = np.hstack([pixel_numbers, xy_coords])
print(value)
# [[    1     0     0]
#  [    2     1     0]
#  [    3     2     0]
#  ...
#  [72298   297   240]
#  [72299   298   240]
#  [72300   299   240]]

# Properly save as CSV
np.savetxt("outputdata.csv", value, delimiter='\t', fmt='%4d')
----------------------------------------
System information
----------------------------------------
Platform:      Windows-10-10.0.19041-SP0
Python:        3.9.1
PyCharm:       2021.1.1
NumPy:         1.19.5
Pillow:        8.2.0
----------------------------------------

【讨论】:

【参考方案2】:

Image_gray 是一个图像对象。此类对象没有浮点数据类型属性。您应该将 numpy 数据类型属性传递给 dtype 参数。 您可以传递 np.float32、np.float64 等,因为您想将像素从整数更改为十进制值。 您也可以将它们作为字符串传递,例如“float32”、“float64” 在这里查看文档https://numpy.org/devdocs/user/basics.types.html

【讨论】:

以上是关于如何从图像中提取 (x, y) 坐标并写入 CSV 文件?的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenCV 如何根据 x 和 y 坐标裁剪图像,并允许 x 和 y 坐标成为裁剪的中心?

如何从python中的图像中获取特定像素(蓝色)的x,y坐标?

如何从 csv 文件中提取图像、标签并使用 Torch 创建训练集?

从 x 列到 y 列以及从第 1 行到第 2 行 c++ 提取 csv 数据

从坐标列表中提取运动数据

图像处理halcon实现图像亚像素边缘轮廓坐标提取并存储