Подтвердить что ты не робот

Инвертирование изображения в Python с помощью OpenCV

Я хочу загрузить цветное изображение, преобразовать его в оттенки серого, а затем инвертировать данные в файле.

Что мне нужно: перебрать массив в OpenCV и изменить каждое значение с помощью этой формулы (это может быть неправильно, но мне кажется разумным):

img[x,y] = abs(img[x,y] - 255)

но я не понимаю, почему он не работает:

def inverte(imagem, name):
    imagem = abs(imagem - 255)
    cv2.imwrite(name, imagem)


def inverte2(imagem, name):
    for x in np.nditer(imagem, op_flags=['readwrite']):
        x = abs(x - 255)
    cv2.imwrite(name, imagem)


if __name__ == '__main__':
    nome = str(sys.argv[1])
    image = cv2.imread(nome)
    gs_imagem = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    inverte(gs_imagem, "invertida.png")
    inverte2(gs_imagem, "invertida2.png")

Я не хочу делать явный цикл (я пытаюсь быть более питоническим). Я вижу, что на одном изображении, получившем белый фон, он стал черным, но только это не похоже на то, что другие цвета имеют много изменений (если они есть).

4b9b3361

Ответ 1

Вы почти сделали это. Вы были обмануты тем фактом, что abs(imagem-255) даст неправильный результат, поскольку ваш dtype является целым числом без знака. Вы должны сделать (255-imagem), чтобы целые числа оставались без знака:

def inverte(imagem, name):
    imagem = (255-imagem)
    cv2.imwrite(name, imagem)

Вы также можете инвертировать изображение, используя функцию bitwise_not OpenCV:

imagem = cv2.bitwise_not(imagem)

Ответ 3

Вы можете использовать оператор "тильда", чтобы сделать это:

import cv2
image = cv2.imread("img.png")
image = ~image
cv2.imwrite("img_inv.png",image)

Это потому, что оператор "тильда" (также известный как унарный оператор) работает, выполняя дополнение, зависящее от типа объекта

например, для целых чисел, его формула:

x + (~ x) = -1

но в этом случае opencv использует "объект массива uint8" для своих изображений, поэтому его диапазон составляет от 0 до 255

поэтому, если мы применим этот оператор к "объекту массива uint8", как это:

import numpy as np
x1 = np.array([25,255,10], np.uint8) #for example
x2 = ~x1
print (x2)

мы будем иметь в результате:

[230 0 245]

потому что его формула:

х2 = 255 - х1

и это именно то, что мы хотим сделать, чтобы решить эту проблему.