web-dev-qa-db-fra.com

inversion d'image en Python avec OpenCV

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

Ce dont j'ai besoin: pour parcourir le tableau dans OpenCV et changer chaque valeur avec cette formule (cela peut être faux mais cela me semble raisonnable): 

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

mais je ne comprends pas pourquoi ça ne marche pas:

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")

Je ne veux pas faire de boucle explicite (j'essaye d'être plus pythonique). Je peux voir que dans une image qui a un fond blanc, elle est devenue noire, mais seulement ceci ne donne pas l'impression que les autres couleurs changent beaucoup (le cas échéant).

37
Mansueli

Tu l'as presque fait. 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) pour conserver les entiers non signés:

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

Vous pouvez également inverser l'image à l'aide de la fonction bitwise_not d'OpenCV:

imagem = cv2.bitwise_not(imagem)
77

Vous pouvez également inverser l'image à l'aide de la fonction bitwise_not d'OpenCV:

imagem = cv2.bitwise_not(imagem)

J'ai aimé l'exemple sur: https://www.learnopencv.com/filling-holes-in-an-image-using-opencv-python-c/

31
Eric Olmon

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)

En effet, l'opérateur "tilde" (également appelé opérateur unaire) fonctionne en effectuant un complément dépendant du type d'objet

par exemple pour les entiers, sa formule est la suivante:

x + (~ x) = -1

mais dans ce cas, opencv utilise un "objet tableau uint8 numpy" pour ses images, sa plage est donc comprise entre 0 et 255

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

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

nous aurons comme résultat: 

[230 0 245]

parce que sa formule est:

x2 = 256 - x1 

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

0
Diroallu