110 votes

Inverser l'image en Python avec OpenCV

Je veux charger une image en couleur, la convertir en niveaux de gris, puis inverser les données dans le fichier.

Ce dont j'ai besoin : parcourir le tableau dans OpenCV et changer chaque valeur avec cette formule (elle pourrait être incorrecte mais elle me semble raisonnable) :

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

mais je ne comprends pas pourquoi cela ne fonctionne pas :

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

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

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

Je ne veux pas faire de boucle explicite (j'essaie d'être plus pythonique). Je peux voir qu'une image avec un fond blanc est devenue noire, mais cela semble être la seule couleur ayant beaucoup (voire aucun) changement.

220voto

Saullo Castro Points 12260

Vous avez presque réussi. Vous avez été trompé par le fait que abs(imagem-255) donnera un résultat erroné puisque votre dtype est un entier non signé. Vous devez faire (255-imagem) afin de conserver les entiers non signés:

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

Vous pouvez également inverser l'image en utilisant la fonction bitwise_not d'OpenCV:

imagem = cv2.bitwise_not(imagem)

86voto

Eric Olmon Points 801

Alternativement, vous pourriez inverser l'image en utilisant la fonction bitwise_not d'OpenCV :

imagem = cv2.bitwise_not(imagem)

J'ai aimé cet exemple.

43voto

Diroallu Points 111

Vous pouvez utiliser l'opérateur "tilde" pour le faire :

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

C'est parce que l'opérateur "tilde" (également connu sous le nom d'opérateur unaire) fonctionne en effectuant un complément en fonction du type d'objet

par exemple pour les entiers, sa formule est :

x + (~x) = -1

mais dans ce cas, opencv utilise un "objet tableau numpy uint8" pour ses images donc sa plage va de 0 à 255

donc si nous appliquons cet opérateur à un "objet tableau numpy uint8" comme ceci :

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

nous aurons comme résultat :

[230 0 245]

car sa formule est :

x2 = 255 - x1

et c'est exactement ce que nous voulons faire pour résoudre le problème.

4voto

Lakshman Points 21

Vous pouvez également le faire avec numpy.

import cv2
import numpy as np

image = cv2.imread('your_image', 0)
inverted = np.invert(image)

cv2.imwrite('inverted.jpg', inverted)

3voto

fmw42 Points 6778

En Python/OpenCV, je pense que tu veux :

img = cv2.absDiff(img, 255)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X