簡體   English   中英

如何更改numpy數組中的像素值

[英]how to change pixel value in a numpy array

我有一個大的 RGB 圖像作為一個 numpy 數組,我想將所有具有 R=0、G=0、B=0 的像素設置為 R=255、G=0、B=0。 最快的方法是什么? 我試過了:

for pix in result:
    if np.all(np.logical_and(pix[0]==pix[1],pix[2]==0,pix[2]==pix[1])):
        pix [0] = 255

但這樣我就沒有一個像素。 是否有類似的方法是不迭代索引?

這是一個矢量化的解決方案。 您的圖像基本上是 w x h x 3(colors) 數組。 我們可以利用不易掌握但功能強大的廣播規則。

基本上,我們將整個數組與您正在尋找的值的 3 向量進行比較。 由於廣播規則,Numpy 會將每個像素與這三個向量進行比較,並告訴你它是否匹配(所以在這種特定情況下,如果紅色、綠色和藍色匹配)。 您最終將得到一個與圖像大小相同的 true 和 false 的布爾數組。

現在我們只想找到所有三種顏色都匹配的像素。 為此,我們使用“all”方法,如果數組的所有值都為真,則該方法為真。 如果我們將其應用於某個軸——在本例中為顏色軸——我們會得到一個 w×h 數組,該數組是真的,只要所有顏色都匹配。

現在我們可以將這個 2D 布爾蒙版應用回我們原來的 w x h x 3 數組,並獲得與我們的顏色匹配的像素。 我們現在可以重新分配它們——再次通過廣播。

這是示例代碼

import numpy as np

#create a 2x2x3 image with ones
img = np.ones( (2,2,3) )

#make the off diagonal pixels into zeros
img[0,1] = [0,0,0]
img[1,0] = [0,0,0]

#find the only zeros pixels with the mask 
#(of course any other color combination would work just as well)
#... and apply "all" along the color axis
mask = (img == [0.,0.,0.]).all(axis=2)

#apply the mask to overwrite the pixels
img[ mask ] = [255,0,0]

由於所有值都是正數或空值,因此一種簡單有效的方法是:

img[img.sum(axis=2)==0,0]=255

img.sum(axis=2)==0在兩個第一維度中選擇好的像素, 0在第三個維度中選擇紅色通道。

暫無
暫無

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

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