【问题标题】:convert a grayscale image to a 3-channel image [duplicate]将灰度图像转换为 3 通道图像 [重复]
【发布时间】:2018-03-29 11:55:13
【问题描述】:

我想将形状为(height,width) 的灰度图像转换为形状为(height,width,nchannels) 的3 通道图像。这项工作是通过for-loop 完成的,但必须有一个简洁的方法。这是程序中的一段代码,有人可以给出提示。请指教。

 30         if img.shape == (height,width): # if img is grayscale, expand
 31             print "convert 1-channel image to ", nchannels, " image."
 32             new_img = np.zeros((height,width,nchannels))
 33             for ch in range(nchannels):
 34                 for xx in range(height):
 35                     for yy in range(width):
 36                         new_img[xx,yy,ch] = img[xx,yy]
 37             img = new_img

【问题讨论】:

  • 这里的问题是什么?如果您只想更改尺寸,这是一个简单的重塑操作。如果你想重新创建颜色,没有一些模型/假设是不可能的。您的灰度图像没有颜色信息,您所能做的就是猜测颜色(这可能很简单也很糟糕,也可能更复杂但还不错;没有限制)。
  • @sascha 我想复制3次灰度图像,所以它与彩色图像形状一致,然后我的程序可以将图像视为相同。但我想有一个没有for循环的更好的实现

标签: python numpy


【解决方案1】:

您可以使用np.stack 更简洁地完成此操作:

img = np.array([[1, 2], [3, 4]])
stacked_img = np.stack((img,)*3, axis=-1)
print(stacked_img)
 # array([[[1, 1, 1],
 #         [2, 2, 2]],
 #        [[3, 3, 3],
 #         [4, 4, 4]]])

【讨论】:

  • 我认为 OP 期望 [ [[1 1 1][2 2 2]] [[3 3 3][4 4 4]] ]
  • @furas 是的!使用axis=-1 实现这一点(制作3个频道)
  • 上面的代码得到的形状是 (w,h,1,3) 这是错误的 (Py 3.6) 我需要stacked_img = np.squeeze(np.stack((rescaled,) * 3 , -1)) 让它回到 (w,h,3)
  • 首先不是(w,h,...),而是(h,w,...)。其次,OP的问题具有(w,h)而不是(w,h,1)的形状图像,因此发布的解决方案完全正确。第三,如果你有形状(w,h,1)的图像,你可以使用np.concatenate而不是np.stack,你会得到你想要的结果,即np.concatenate((img,)*3, axis=-1)
  • 也可以使用 np.tile 来实现这个...... np.tile(np.array( [ [1, 2], [3, 4] ] ))[.. .,无],(1,1,1))
猜你喜欢
  • 1970-01-01
  • 2011-04-18
  • 1970-01-01
  • 2019-03-15
  • 1970-01-01
  • 2020-10-20
  • 2022-12-20
  • 1970-01-01
相关资源
最近更新 更多