Увеличивайте и уменьшайте значение в зависимости от этих условий - PullRequest
0 голосов
/ 27 марта 2020

У меня есть массив beb формы (3,8), он представляет три строки по 8 бит (1 или 0), массив copiv формы (3,8, 2) который представляет в основном 8 первых пикселей изображения только с зелеными и синими значениями RGB. И у меня есть маска , массив логической формы (3,8). Значением массива маски является True, если значения Green и Blue имеют разную четность, и False, если они имеют одинаковую четность. Вот как они выглядят (beb, mask и copiv соответственно):

beb = np.array([[0,0,0,0,0,0,1,0],[0,1,1,0,0,0,0,1],[0,1,1,0,1,0,0,0]]) #shape (3,8)


mask = np.array([[True, False, True, True, True, False, False, True],
                 [True, False, True, True, True, False, False, True],
                 [True, False, True, True, True, False, False, True]]) #shape (3,8)


copiv = np.array([
[[138, 207],[133, 201],[133, 202],[134, 203],[133, 202],[133, 203],[134, 206],[133, 204]],
[[139, 208],[133, 201],[133, 202],[134, 203],[133, 202],[133, 203],[134, 206],[134, 205]],
[[139, 208],[133, 201],[133, 202],[135, 204],[133, 202],[133, 203],[135, 207], [134, 205]]]) # shape (3,8,2)

Я хочу увеличить или уменьшить второе значение массива copiv (так что значение Blue, которое является вторым значением, первое значение - это значение Грина) в зависимости от этих условий:

-Когда бит массива beb равен 0, а значения зеленого и синего одинаковы (например, [1 3] или [6 8], означает, что в массиве copiv он будет возвращать False, b c с той же четностью) мы ничего не делаем.

-При бите массив beb снова равен 0, но на этот раз соотношение зеленого и синего отличается (например, [4 3], это означает, что в массиве copiv он будет возвращать значение True), тогда в этом случае: если Blue - четное значение, мы увеличиваем Blue, если Blue - нечетное значение, мы уменьшаем Blue.

- Когда бит beb равен 1, а если Green и Blue - Истинно в массиве copiv : мы ничего не делаем

-А когда бит beb равен 1 и t Hat Green и Blue возвращают False, поэтому они имеют разное соотношение: если Blue четное, мы увеличиваем его, если оно нечетное, мы уменьшаем его.

Вот мой код, но декремент не работает:

print("COPIV BEOFRE : \n", copiv)


for i in range(beb.shape[0]):
        for j in range(beb.shape[1]):

            if (beb[i][j] == 0):
                for y in range(mask.shape[0]):
                    for z in range(mask.shape[1]):
                        for x in range(copiv.shape[0]):
                                for w in range(copiv.shape[1]):
                                    if (mask[y,z] == True and copiv[x,w,1:3] % 2 == 0):                
                                        copiv[x,w,1:3] += 1                                
                                    elif (copiv[x,w,1:3] % 2 != 0):
                                        copiv[x,w,1:3] -= 1                                                                                       

            elif (beb[i][j] == 1):
                if(mask[y,z] == False and copiv[x,w,1:3] % 2 == 0):
                    copiv[x,w,1:3] += 1                                #increment B
                elif (copiv[x,w,1:3] % 2 != 0):
                    copiv[x,w,1:3] -= 1           #decrement B


print("\nCOPIV AFTER : \n", copiv)

Ответы [ 2 ]

1 голос
/ 27 марта 2020

Как насчет:

copiv[...,1] ^= beb^mask

Объяснитель:

Можно проверить, что операцию «увеличение, если четное, уменьшение, если нечетное» можно перефразировать как «перевернуть младший бит». Это бит ^= в выражении --- если rhs равно 1, если 0, ^= ничего не делает.

Мы также можем проверить, что rhs принимает правильное значение для всех 4 рассмотренных случаев.

1 голос
/ 27 марта 2020

Вы можете достичь своих целей следующим образом

# first, generate boolean condition array.
cond1 = beb==1  # shape (3,8)

# then, new condition by logical operation
cond2 = np.logical_and(cond1, mask)

# finally, filter indices using boolean array, and assign value
copv[cond2,0] += 100    # 0 index for blue
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...