Заменить конкретную ось другим значением в зависимости от условия - PullRequest
0 голосов
/ 14 апреля 2019

Предположим, у меня есть original_image: как (451, 521, 3) форма.
И он содержит [0,0,0] значений RGB в некоторых местах.

Я хотел бы заменить все [0,0,0] на [0,255,0]

То, что я пробовал, было
Я создал маску с True, где [0,0,0] расположены в original_image
И эта маска имеет (451, 521) форму

Я думал, что смогу использовать следующее
new_original_image=original_image[mask]
Но оказалось, что new_original_image - это просто массив (форма похожа на (18, 3)), все элементы которого (например, [[ 97 68 108],[127 99 139],[156 130 170],...]) отфильтрованы по True для массива mask из original_image

Ответы [ 3 ]

1 голос
/ 14 апреля 2019

Я хотел бы заменить все [0,0,0] на [0,255,0]

import cv2

img = cv2.imread("test.jpg")
rows, cols, channels = img.shape

for r in range(rows):
    for c in range(cols):
        if np.all(img[r,c][0]==[0,0,0]):
            img[r,c]=[0,255,0]
1 голос
/ 14 апреля 2019

Вот один из способов

idx=np.all(np.vstack(a)==np.array([0,0,5]),1)
a1=np.vstack(a)
a1[idx]=[0,0,0]
yourary=a1.reshape(2,-1,3)
Out[150]: 
array([[[0, 0, 0],
        [0, 0, 1],
        [0, 0, 0],
        [0, 0, 0]],
       [[0, 0, 0],
        [0, 0, 1],
        [0, 0, 0],
        [0, 0, 0]]])

Ввод данных

a
Out[133]: 
array([[[0, 0, 0],
        [0, 0, 1],
        [0, 0, 5],
        [0, 0, 5]],
       [[0, 0, 0],
        [0, 0, 1],
        [0, 0, 5],
        [0, 0, 5]]])
0 голосов
/ 14 апреля 2019

Основываясь на ответном решении от Вэнь-Бена, я пытаюсь написать подробный фрагмент кода, который я хотел реализовать

# original_image which contains [0,0,0] at several location 
# in 2 (last) axis from (451, 521, 3) shape image
# Stack original_image or using original_image.reshape((-1,3)) is also working
stacked=np.vstack(original_image)
# print(stacked.shape)
# (234971, 3)

# Create mask array which has True where [0,0,0] are located in stacked array
idx=np.all(stacked==[0,0,0],1)
# print(idxs.shape)
# (234971,)

# Replace existing values which are filtered by idx with [0,255,0]
stacked[idx]=[0,255,0]

# Back to original image shape
original_image_new=stacked.reshape(original_image.shape[0],original_image.shape[1],3)
# print(original_image_new.shape)
# (451, 521, 3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...