簡體   English   中英

廣播到Numpy陣列的視圖中

[英]Broadcasting into views of Numpy arrays

我正在通過numpy處理圖像。 我想將圖像的一部分設置為其平均顏色。 我能夠做到這一點,但是當我想使用原始視圖執行此操作時,必須重新索引數組。 換句話說,我想使用第四行代碼,但是我堅持使用第三行代碼。

我已經閱讀了幾篇有關as_strided函數的文章,但是這使我感到困惑,我希望可以有一個更簡單的解決方案。 那么,有什么辦法可以稍微修改最后一行代碼以執行我想要的操作?

box = im[x-dx:x+dx, y-dy:y+dy, :]
avg = block(box) #returns a 1D numpy array with 3 values
im[x-dx:x+dx, y-dy:y+dy, :] = avg[None,None,:] #sets box to average color
#box = avg[None,None,:] #does not affect original array
box = blah

只是重新分配box變量。 先前引用的box變量的數組不受影響。 這不是您想要的。

box[:] = blah

是切片分配。 它修改了數組的內容。 這就是你想要的。

請注意,分片分配取決於語句的句法形式。 這一事實box被分配box = im[stuff]不作進一步分配到box片分配。 這類似於您如何做

l = [1, 2, 3]
b = l[2]
b = 0

b的賦值不影響l

灰度圖像

這會將數組的一部分設置為其平均值(均值):

im[2:4, 2:4] = im[2:4, 2:4].mean()

例如:

In [9]: im
Out[9]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

In [10]: im[2:4, 2:4] = im[2:4, 2:4].mean()

In [11]: im
Out[11]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 12, 12],
       [12, 13, 12, 12]])

彩色圖像

假設我們要分別對顏色的每個成分進行平均:

In [22]: im = np.arange(48).reshape((4,4,3))

In [23]: im
Out[23]: 
array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8],
        [ 9, 10, 11]],

       [[12, 13, 14],
        [15, 16, 17],
        [18, 19, 20],
        [21, 22, 23]],

       [[24, 25, 26],
        [27, 28, 29],
        [30, 31, 32],
        [33, 34, 35]],

       [[36, 37, 38],
        [39, 40, 41],
        [42, 43, 44],
        [45, 46, 47]]])

In [24]: im[2:4, 2:4, :] = im[2:4, 2:4, :].mean(axis=0).mean(axis=0)[np.newaxis, np.newaxis, :]

In [25]: im
Out[25]: 
array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8],
        [ 9, 10, 11]],

       [[12, 13, 14],
        [15, 16, 17],
        [18, 19, 20],
        [21, 22, 23]],

       [[24, 25, 26],
        [27, 28, 29],
        [37, 38, 39],
        [37, 38, 39]],

       [[36, 37, 38],
        [39, 40, 41],
        [37, 38, 39],
        [37, 38, 39]]])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM