如何从图像中提取 (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
----------------------------------------
我需要使用 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
您可以相应地使用 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
----------------------------------------