2013-10-25 4 views
21

Я хочу загрузить цветное изображение, преобразовать его в оттенки серого, а затем инвертировать данные в файле.инвертирование изображения в 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") 

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

ответ

42

Вы почти сделали это. Вы были обмануты тем, что 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

Спасибо! Я не знал, что в python стандартное значение будет беззнаковым int ... – Mansueli

+3

Неплохо, не думал, что все будет так просто, спасибо. – Nit

+2

Не изобретайте велосипед, если вам это не нужно; для инвертирования данных используйте [Не] (http://docs.opencv.org/2.4/modules/core/doc/operations_on_arrays.html#bitwise-not) (ака 'bitwise_not'). – vaxquis

Смежные вопросы