Wenn Sie einen Teil eines Bildes oder Videos in Schwarz ausfüllen und zuschneiden möchten, erstellen Sie eine Maske für das Bild und überlagern Sie es.
Das Originalbild Maskiertes Bild
Verwenden Sie Numpy, um eine Maske zu erstellen, bei der der Bereich, den Sie schwärzen möchten, 0 und der Bereich, den Sie zuschneiden möchten, 1 ist. Als ich dachte, ich könnte durch Multiplizieren jedes Elements der Matrix maskieren, war die Ausgabe anders als erwartet.
h_img, w_img = img.shape[:2]
mask = np.zeros((h_img, w_img, 3))
radius = int(h_img / 2)
center = radius
cv2.circle(mask, (center, center), radius, (1, 1, 1), thickness=-1, shift=0)
masked_img = img * mask
Maske mit Numpy gemacht
Maskiertes Bild (masked_img)
Wenn Sie eine Matrix mit Numpy definieren, wird standardmäßig der Typ float64 verwendet, sofern nicht dtype angegeben ist. Andererseits wird das durch das Lesen von opencv gelesene Bild abhängig von seiner Helligkeit von CV_8U, CV_16F, CV_32F (normalerweise CV_8U) gelesen. Bei CV_8U unterstützt der Datentyp Numpy np.uint8. Mit anderen Worten, im fehlgeschlagenen Beispiel wird das CV_8U-Bild mit einem float64-Typ maskiert.
Geben Sie beim Definieren einer Matrix mit Numpy den Typ np.uint8 an. erledigt.
mask = np.zeros((h_img, w_img, 3), dtype=np.uint8) #Geben Sie den Typ als uint8 an
Maskiertes Bild
Wenn ich versuche, die Maske als Bild anzuzeigen, ist sie pechschwarz.
Es ist ein rudimentärer Fehler bei der Nichtübereinstimmung von Datentypen, aber es hat eine Weile gedauert, bis ich es bemerkt habe, wahrscheinlich weil ich in letzter Zeit nur Python verwendet habe und weniger Chancen habe, den Typ zu kennen. Anstatt es in np.zeros zu definieren, hätte ich zunächst np.zeros_like verwenden sollen, um die Matrix einschließlich des Bildtyps zu definieren.
Recommended Posts