簡體   English   中英

如何檢查 RGB colors 列表中的所有項目是否在沒有循環的圖像中?

[英]How to check if all items in list of RGB colors is in an image without a loop?

假設我有一個 RGB 值列表,如下所示:

rgbL = [[20 45 40] [30 45 60] .... [70 50 100]]

然后,我有一張圖片說, img = cv.imread("location")

現在,如果圖像 RGB 值在我的 RGB 值列表 (rgbL) 中,我想將圖像的所有 RGB 值更改為 (255, 0, 0)。

我能夠通過這段代碼做到這一點:

for rgb in rgbL :

    k = list(filter(None, rgb[1:-1].split(" ")))
    r = int(k[0])
    g = int(k[1])
    b = int(k[2])

    img[np.all(img == (r, g, b), axis=-1)] = (255,0,0)  

但是上面的代碼花費的時間太長,因為我的“rgbL”列表太長了。

有沒有辦法不用循環就可以做到這一點? 以 numpyish 方式實現它的最佳方法是什么?

將您的rgbLimg轉換為 numpy arrays。一種無需循環的方法:

sh = img.shape
img = img.reshape(-1, 3)
img[np.where(((rgbL[:,None,:]-img)==0).all(axis=2))[1]]=np.array([255,0,0])
img = img.reshape(sh)

這需要你的圖像與rgbL的每一行的差異,並檢查 RGB 中的all零差異以使用np.where替換。

示例img和 output:

img:
[[ 20  45  40]
 [ 30  45  60]
 [  0   1   2]
 [ 70  50 100]
 [  4   5   6]]
rgbL:
[[ 20  45  40]
 [ 30  45  60]
 [ 70  50 100]]
Output:
[[255   0   0]
 [255   0   0]
 [  0   1   2]
 [255   0   0]
 [  4   5   6]]

更新:根據 OP 關於將字符串字典鍵轉換為 numpy arrays 的評論:

rgbL = np.array([list(map(int,[s.strip() for s in key.strip('[').strip(']').strip(' ').split(' ') if s.strip()])) for key in rgb_dict.keys()])

上面提到的算法是O(length of rgbL * size of image)

我們可以將它降低到O(rgbL 的長度 + 圖像的大小)

set_rgbl = set(rgbL)
height = img.shape[0]
width = img.shape[1]
BLUE_COLOR = (255, 0, 0)

for h in range(0, height):
    for w in range(0, width):
        if list(img[h, w]) in set_rgbl:
            img[h, w] = BLUE_COLOR

這里發生的是我們創建了一組 rgbL 值。 集合中的插入是恆定時間操作。 同樣適用於查找。 因此,當我們為每個像素迭代圖像中的每個像素值時,我們花費O(1)時間。 這導致我們的時間復雜度得到改善。

希望有所幫助。

暫無
暫無

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

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