如何高效生成原数组整数倍扩展数组?OpenCV图像放大优化
高效实现OpenCV图像的整数倍像素复制放大
以下是几种远超嵌套循环速度的实现方式,完全满足你“像素整数倍复制、无插值模糊”的需求:
方法1:用numpy原生repeat函数(简洁高效)
numpy的repeat函数是底层优化过的,直接在指定轴上重复元素,对灰度单通道或彩色三通道图像都适用:
import numpy as np import cv2 def pixel_scale(img, scale): # 先给每个像素在宽度方向重复scale次 scaled = np.repeat(img, scale, axis=1) # 再给每一行在高度方向重复scale次 scaled = np.repeat(scaled, scale, axis=0) return scaled # 测试你的示例 test_arr = np.array([[1,2],[3,4]], dtype=np.uint8) print(pixel_scale(test_arr, 2)) # 输出完全符合预期: # [[1 1 2 2] # [1 1 2 2] # [3 3 4 4] # [3 3 4 4]] # 处理实际OpenCV图像 img = cv2.imread("your_image.jpg") scaled_img = pixel_scale(img, 4) cv2.imshow("Scaled", scaled_img) cv2.waitKey(0) cv2.destroyAllWindows()
这个方法比嵌套循环快几十倍,代码简洁,适合大多数场景。
方法2:广播扩展(内存友好,大图像首选)
如果处理超大图像,担心中间数组占用内存,可以用维度扩展+广播的方式,避免额外内存开销:
def pixel_scale_broadcast(img, scale): # 给图像添加两个新维度,用于广播重复 expanded = img[:, np.newaxis, :, np.newaxis, :] # 广播到目标尺寸 scaled = np.broadcast_to(expanded, (img.shape[0], scale, img.shape[1], scale, img.shape[2])) # 调整维度并合并成最终图像形状 return scaled.transpose(0,1,2,3,4).reshape(img.shape[0]*scale, img.shape[1]*scale, img.shape[2])
这个方法不会生成中间重复数组,内存占用更低,适合高分辨率图像放大。
方法3:OpenCV的resize+INTER_NEAREST(速度天花板)
你之前可能误解了OpenCV的resize——INTER_NEAREST(最近邻插值)其实就是严格的像素复制,没有任何模糊插值,而且是OpenCV原生C++优化,速度是这几个方法里最快的:
def pixel_scale_opencv(img, scale): h, w = img.shape[:2] return cv2.resize(img, (w*scale, h*scale), interpolation=cv2.INTER_NEAREST)
测试你的示例,输出和预期完全一致,处理大图像时比numpy方法更快,代码量也少,强烈推荐使用。
内容的提问来源于stack exchange,提问作者SBixby
相关产品推荐
相关产品推荐

