【发布时间】:2018-09-26 13:47:00
【问题描述】:
我正在编写一个 python 程序来预处理图像以用作语义分割任务的标签。原始图像具有三个通道,其中代表每个像素的三个值的向量代表该像素的类标签。例如,[0,0,0] 的像素可能是 1 类,[0,0,255] 可能是 2 类,依此类推。
我需要将这些图像转换为单通道图像,像素值从 0 开始并连续增加以表示每个类。本质上,我需要将旧图像中的 [0,0,0] 转换为新图像中的 0,将 [0,0,255] 转换为 1,以此类推。
图片的分辨率相当高,宽度和高度超过 2000 像素。我需要为数百张图像执行此操作。我目前的方法涉及迭代每个像素并用相应的标量值替换 3 维值。
filename="file.png"
label_list = [[0,0,0], [0,0,255]] # for example. there are more classes like this
image = imread(filename)
new_image = np.empty((image.shape[0], image.shape[1]))
for i in range(image.shape[0]):
for j in range(image.shape[1]):
for k, label in enumerate(label_list):
if np.array_equal(image[i][j], label):
new_image[i][j] = k
break
imsave("newname.png", new_image)
问题是上面的程序效率非常低,每张图片都需要几分钟的运行时间。这对于处理我所有的图像来说太过分了,因此我需要改进它。
首先,我认为可以通过将label_list 转换为numpy 数组和using np.where 来删除最内层的循环。但是,我不确定如何通过np.where 在二维数组中找到一维数组,以及它是否会有所改进。
来自this thread,我尝试定义一个函数并将其直接应用于图像。但是,我需要将每个 3 维标签映射到一个标量。字典不能包含列表作为键。有没有更好的方法来做到这一点,会有所帮助吗?
有没有办法(大幅度)提高效率,或者有没有更好的方法来完成上述程序的工作?
谢谢。
【问题讨论】:
标签: python arrays image performance numpy