it-swarm.com.de

bild in Python mit OpenCV invertieren

Ich möchte ein Farbbild laden, in Graustufen konvertieren und dann die Daten in der Datei invertieren. 

Was ich brauche: um das Array in OpenCV zu iterieren und jeden einzelnen Wert mit dieser Formel zu ändern (es könnte falsch sein, erscheint mir aber vernünftig): 

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

aber ich verstehe nicht warum es nicht funktioniert:

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

Ich möchte keine explizite Schleife machen (ich versuche mehr Pythonic zu sein). Ich kann sehen, dass in einem Bild, das einen weißen Hintergrund hat, es schwarz wurde, aber nur dies sieht nicht so aus, als ob die anderen Farben (wenn überhaupt) viel ändern würden.

37
Mansueli

Sie haben es fast geschafft. Sie wurden von der Tatsache betrogen, dass abs(imagem-255) ein falsches Ergebnis liefert, da Ihre dtype eine vorzeichenlose Ganzzahl ist. Sie müssen (255-imagem) tun, um die Ganzzahlen unsigniert zu halten:

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

Sie können das Bild auch mit der bitwise_not-Funktion von OpenCV invertieren:

imagem = cv2.bitwise_not(imagem)
77

Alternativ können Sie das Bild mit der bitwise_not-Funktion von OpenCV invertieren:

imagem = cv2.bitwise_not(imagem)

Das Beispiel hat mir gefallen: https://www.learnopencv.com/filling-holes-in-an-image-using-opencv-python-c/

31
Eric Olmon

Sie können den Tilde-Operator dazu verwenden:

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

Dies liegt daran, dass der "Tilde" -Operator (auch als unärer Operator bezeichnet) arbeitet, der abhängig vom Objekttyp ein Komplement ausführt

für Ganzzahlen lautet die Formel beispielsweise:

x + (~ x) = -1

in diesem Fall verwendet opencv jedoch ein "uint8 numpy array object" für seine Bilder, sodass der Bereich zwischen 0 und 255 liegt

wenn wir diesen Operator also auf ein "uint8 numpy array object" wie folgt anwenden:

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

wir werden als Ergebnis haben: 

[230 0 245]

weil seine Formel lautet:

x2 = 256 - x1 

und genau das wollen wir tun, um das problem zu lösen.

0
Diroallu