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

How to extract (x, y) coordinates from image and write to CSV file?

我需要使用 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`

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

.

如何将我当前的脚本与上面的 link 结合起来并修复我目前的错误?


编辑:

错误已修复,但我无法正确获取图像文件的 (x, y) 坐标。它给了我一个很长的数字,如下所示:

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

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

Image_gray 是图像对象。此类对象没有浮点数据类型属性。您应该将 numpy 数据类型属性传递给 dtype 参数。 您可以传递 np.float32、np.float64 e.t.c,因为您希望将像素从整数更改为小数值。 您也可以将它们作为字符串传递,例如 'float32'、'float64' 在此处查看文档 https://numpy.org/devdocs/user/basics.types.html

您可以相应地使用 from the linked Q&A pretty much as-is. For the proper printing of the integers in the CSV file, you need to set the fmt parameter in np.savetxt。如果您明确希望将像素编号放在前面,只需添加另一列从 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: 
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
----------------------------------------