【问题标题】:How to read images in a file consecutively without sort functions?如何在没有排序功能的情况下连续读取文件中的图像?
【发布时间】:2022-01-20 14:37:57
【问题描述】:

我是图像处理的新手,我从视频中捕获帧,我想将它们转换为数组。这些帧必须是连续的。 这是我的代码的一部分

folder = "/content/otherGrayscaleImage"
onlyfiles = [f for f in os.listdir(folder) if os.path.isfile(os.path.join(folder, f))]

print("Working with {0} images".format(len(onlyfiles)))

for i in range(len(onlyfiles)):
    #do something
    print(onlyfiles[i])

这是输出

Working with 328 images
241.png
312.png
27.png
149.png
42.png
296.png
182.png
99.png
64.png
120.png
102.png
208.png
79.png
325.png
......

如您所见,我的输出打印是随机的,并不是从我的第一张图片开始,即 1.png

这是使用 .sorted() 函数排序后的输入。

1.png
10.png
100.png
101.png
.
.
199.png
2.png

我的最终目标是将64个连续的2d图像数组转换为3d数组,以实现python应该连续读取我的图像;但事实并非如此。

我应该如何连续读取文件中的图像?

PS:使用 sorted() 等排序函数无济于事

【问题讨论】:

  • 按文件名数值递增排序(去掉扩展名)。
  • 那你还想要什么?
  • 将来,当您想对文件进行编号并能够轻松对其进行排序时,请使用带有 0 填充的固定位数——即001.png010.png 等。
  • 这不是按数值排序。 (2 在 10 之前)。
  • 是什么阻止你这样排序?

标签: python numpy opencv python-imaging-library


【解决方案1】:

您需要一个自定义排序键。手动解决方案是这样的:

onlyfiles.sort(key=lambda x: int(x[:x.index('.')]))

这不是一个可靠的解决方案。如果您有任何文件在扩展名之前包含除整数以外的任何内容,或者缺少扩展名,则会引发错误。

幸运的是,有一个名为 natsort 的库可以很好地捕捉到人工排序的极端情况。 pip install natsort之后就可以了

from natsort import natsorted

onlyfiles = natsorted(onlyfiles)

强制性免责声明:我不隶属于 natsort,除非是满意的用户。

【讨论】:

  • 为什么在单行程序中使用额外的模块使应用程序变得混乱??
  • @YvesDaoust。这是一个非常强大的模块,因此似乎是一个有效的共享选项。
  • 健壮?内置的 Python 不是“健壮的”吗?
  • @YvesDaoust。我建议的关键功能当然不是。它变化无常,并且会在任何与预期模式不匹配的意外放置的文件上崩溃。
  • 没有崩溃,但是当之无愧的错误条件。当然比默许要好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-30
  • 2019-04-05
  • 1970-01-01
  • 2023-01-14
  • 2021-01-12
  • 1970-01-01
相关资源
最近更新 更多