398 Stimmen

Wie man ein Bild in OpenCV mit Python zuschneidet

Wie kann ich Bilder zuschneiden, wie ich es zuvor in PIL gemacht habe, mit OpenCV.

Arbeitsbeispiel für PIL

im = Image.open('0.png').convert('L')
im = im.crop((1, 1, 98, 33))
im.save('_0.png')

Aber wie kann ich das in OpenCV machen?

Das habe ich versucht:

im = cv.imread('0.png', cv.CV_LOAD_IMAGE_GRAYSCALE)
(thresh, im_bw) = cv.threshold(im, 128, 255, cv.THRESH_OTSU)
im = cv.getRectSubPix(im_bw, (98, 33), (1, 1))
cv.imshow('Img', im)
cv.waitKey(0)

Aber es funktioniert nicht.

Ich glaube, ich habe getRectSubPix falsch verwendet. Wenn das der Fall ist, bitte erklären Sie, wie ich diese Funktion korrekt verwenden kann.

809voto

Froyo Punkte 17217

Es ist sehr einfach. Verwenden Sie Numpy-Slicing.

import cv2
img = cv2.imread("lenna.png")
crop_img = img[y:y+h, x:x+w]
cv2.imshow("beschnitten", crop_img)
cv2.waitKey(0)

173voto

samkhan13 Punkte 3167

Ich hatte diese Frage und fand eine andere Antwort hier: Bereich des Interesses kopieren

Wenn wir (0,0) als linke obere Ecke eines Bildes namens im betrachten, wobei links nach rechts als x-Richtung und oben nach unten als y-Richtung angesehen wird. und wir haben (x1, y1) als obere linke Ecke und (x2, y2) als untere rechte Ecke eines Rechteckbereichs innerhalb dieses Bildes, dann:

roi = im[y1:y2, x1:x2]
hier ist eine umfassende Ressource zur Indizierung und Ausschneiden von numpy-Arrays, die Ihnen mehr über Dinge wie das Zuschneiden eines Teils eines Bildes sagen kann. Bilder werden als numpy-Array in OpenCV2 gespeichert.

)

40voto

m.hatami Punkte 593

Dieser Code schneidet ein Bild von x=0, y=0 bis h=100, w=200 aus.

import numpy as np
import cv2

image = cv2.imread('download.jpg')
y=0
x=0
h=100
w=200
crop = image[y:y+h, x:x+w]
cv2.imshow('Bild', crop)
cv2.waitKey(0)

24voto

smttsp Punkte 3761

Beachten Sie, dass das Bildslicing keine Kopie des beschnittenen Bildes erstellt, sondern einen Zeiger auf das ROI erstellt. Wenn Sie so viele Bilder laden, die relevanten Teile der Bilder mit Slicing zuschneiden und dann in eine Liste einfügen, kann dies eine enorme Speicherplatzverschwendung sein.

Angenommen, Sie laden N Bilder, von denen jedes >1MP ist, und Sie benötigen nur einen 100x100 Bereich aus der linken oberen Ecke.

Slicing:

X = []
for i in range(N):
    im = imread('image_i')
    X.append(im[0:100,0:100]) # Dadurch bleiben alle N Bilder im Speicher. 
                              # Denn sie werden immer noch verwendet.

Alternativ können Sie den relevanten Teil durch .copy() kopieren, damit der Garbage Collector im entfernt.

X = []
for i in range(N):
    im = imread('image_i')
    X.append(im[0:100,0:100].copy()) # Dadurch bleiben nur die Ausschnitte im Speicher. 
                                     # Im's werden vom Garbage Collector gelöscht.

Nachdem ich das herausgefunden habe, habe ich festgestellt, dass einer der Kommentare von user1270710 das erwähnt hat, aber es hat mich einige Zeit gekostet, dies herauszufinden (d.h. Debuggen usw.). Daher denke ich, dass es erwähnenswert ist.

7voto

Sanyal Punkte 816

Im Folgenden finden Sie die Möglichkeit, ein Bild zuzuschneiden.

image_path: Der Pfad zum zu bearbeitenden Bild

coords: Ein Tupel von x/y-Koordinaten (x1, y1, x2, y2)[Öffnen Sie das Bild in mspaint und prüfen Sie das "Lineal" im Ansichts-Tab, um die Koordinaten zu sehen]

saved_location: Pfad zum Speichern des zugeschnittenen Bildes

from PIL import Image
    def crop(image_path, coords, saved_location:
        image_obj = Image.open("Pfad des Bildes, das zugeschnitten werden soll")
            cropped_image = image_obj.crop(coords)
            cropped_image.save(saved_location)
            cropped_image.show()

if __name__ == '__main__':
    image = "bild.jpg"
    crop(image, (100, 210, 710,380 ), 'zugeschnitten.jpg')

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X