如何从图像中提取 (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 创建训练集?