it-swarm.com.ru

инвертирование изображения в 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 __== '__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")

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

37
Mansueli

Вы почти сделали это. Вы были обмануты тем фактом, что 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)
77
Saullo G. P. Castro

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

imagem = cv2.bitwise_not(imagem)

Мне понравился пример по адресу: https://www.learnopencv.com/filling-holes-in-an-image-using-opencv-python-c/

31
Eric Olmon

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

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

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

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

х + (~ х) = -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 = 256 - х1 

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

0
Diroallu