如何使用numpy有效地初始化数组的各个部分?

时间:2019-05-25 12:12:09

标签: python numpy

我试图弄清楚是否可以使用numpy将3维数组的区域有效地设置为一个值。我的数组是一个具有3个颜色通道的黑色图像,我想将图像中一组像素周围的区域设置为某种颜色。

我的工作但很慢的代码是这样的(提取相关部分):

import skimage
import numpy as np

def clamp(n, upper, lower=0):
    return max(lower, min(n, upper))

def apply_contours(image, contours, color=(128.0,128.0,128.0), radius=5):
    """Draw the pixels in the contours in a given colour and size
    """
    for contour in contours:
        for pixel in contour:
            r1 = clamp(int(pixel[0])-radius, image.shape[0])
            r2 = clamp(int(pixel[0])+radius, image.shape[0])
            c1 = clamp(int(pixel[1])-radius, image.shape[1])
            c2 = clamp(int(pixel[1])+radius, image.shape[1])
            for y in range(r1,r2):
                for x in range(c1,c2):
                    for c in range(3):
                        image[y][x][c] = color[c]
    return image

input = skimage.io.imread("image.png")
contours = skimage.measure.find_contours(input, 0.5)
mask = np.zeros((input.shape[0],input.shape[1],3), dtype=np.uint8)
apply_contours(mask)

我并没有使用过numpy,但是我想到应该可以通过将apply_contours中的嵌套循环替换为这样来加快速度:

image[r1:r2][c1:c2] = np.array([color[0],color[1],color[2])

但是这似乎不起作用,因为生成的图像确实显示了任何更改,在循环版本中,它显示了我期望的内容。

我也尝试过:

image[r1:r2][c1:c2][0] = color[0]
image[r1:r2][c1:c2][1] = color[1]
image[r1:r2][c1:c2][2] = color[2]

但这给我一个错误IndexError: index 0 is out of bounds for axis 0 with size 0

使用numpy是否可以更有效地完成我想做的事情?

1 个答案:

答案 0 :(得分:0)

我知道了,我的总n00b状态为numpy。正确的语法是:

image[r1:r2,c1:c2] = np.array([color[0],color[1],color[2])