Инвертирование изображения в 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")
Я не хочу делать явный цикл (я пытаюсь быть более питоническим). Я вижу, что на одном изображении, получившем белый фон, он стал черным, но только это не похоже на то, что другие цвета имеют много изменений (если они есть).
Ответы
Ответ 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)
Ответ 2
В качестве альтернативы вы можете инвертировать изображение, используя функцию bitwise_not
OpenCV:
imagem = cv2.bitwise_not(imagem)
Мне понравился пример:
https://www.learnopencv.com/filling-holes-in-an-image-using-opencv-python-c/
Ответ 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
и это именно то, что мы хотим сделать, чтобы решить эту проблему.