如何在Python中无迭代合并同维度2D Numpy浮点数组为元素含3浮点数的2D数组
合并2D NumPy数组为RGB格式数组的高效方法
嘿,你完全不需要用迭代来做这个操作!NumPy提供了专门的向量化函数来高效完成这类数组堆叠任务,代码简洁还比迭代快得多。
最简单的解决方案:用np.dstack()
np.dstack()(深度堆叠)专门用来将多个2D数组沿着**第三轴(深度轴)**合并,正好匹配你要把R、G、B三个通道合并成每个元素包含三个浮点数的需求。
结合你的代码,只需要在最后加上一行:
import cv2 import numpy as np image = cv2.imread('hurricane katrina 1.jpg', cv2.IMREAD_GRAYSCALE) a = 255 b = 2 * (np.pi/255) c = np.pi / 5 R = a * np.absolute(np.sin(b * image)) G = a * np.absolute(np.sin(b * image + c)) B = a * np.absolute(np.sin(b * image + 2 * c)) # 合并三个2D数组为RGB格式的数组 merged_image = np.dstack((R, G, B))
效果说明
- 原本R、G、B都是形状为
(H, W)的2D数组,合并后的merged_image形状会变成(H, W, 3) - 对于任意位置
(i, j),merged_image[i, j]就是一个包含三个浮点数的数组:[R[i,j], G[i,j], B[i,j]],完全符合你的要求 np.dstack()是底层优化的向量化操作,比手动循环迭代效率高几个数量级,尤其处理大尺寸图像时优势明显
另一个可选方法:np.stack()
如果你更习惯用通用的堆叠函数,也可以用np.stack()指定堆叠轴为最后一维(axis=-1),效果和dstack完全一致:
merged_image = np.stack((R, G, B), axis=-1)
额外提示(可选)
如果之后你需要将这个浮点数数组转换成OpenCV可以直接显示的8位无符号整数格式,只需要添加一行类型转换:
merged_image_uint8 = merged_image.astype(np.uint8)
内容的提问来源于stack exchange,提问作者alyssaeliyah
相关产品推荐
相关产品推荐

