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.

7voto

belgraviton Punkte 136

Robuste Beschneidung mit der OpenCV copy border Funktion:

def imcrop(img, bbox):
   x1, y1, x2, y2 = bbox
   if x1 < 0 or y1 < 0 or x2 > img.shape[1] or y2 > img.shape[0]:
        img, x1, x2, y1, y2 = pad_img_to_fit_bbox(img, x1, x2, y1, y2)
   return img[y1:y2, x1:x2, :]

def pad_img_to_fit_bbox(img, x1, x2, y1, y2):
    img = cv2.copyMakeBorder(img, - min(0, y1), max(y2 - img.shape[0], 0),
                            -min(0, x1), max(x2 - img.shape[1], 0),cv2.BORDER_REPLICATE)
   y2 += -min(0, y1)
   y1 += -min(0, y1)
   x2 += -min(0, x1)
   x1 += -min(0, x1)
   return img, x1, x2, y1, y2

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

2voto

Um es Ihnen einfacher zu machen, hier ist der Code, den ich benutze:

    top=514
    right=430
    height= 40
    width=100
    croped_image = image[top : (top + height) , right: (right + width)]
    plt.imshow(croped_image, cmap="gray")
    plt.show()

1voto

zabop Punkte 5436

Alternativ könnten Sie tensorflow für das Zuschneiden und openCV für die Erstellung eines Arrays aus dem Bild verwenden.

import cv2
img = cv2.imread('YOURIMAGE.png')

Jetzt ist img ein Array der Form (Bildhöhe, Bildbreite, 3). Schneiden Sie das Array mit tensorflow aus:

import tensorflow as tf
offset_height=0
offset_width=0
target_height=500
target_width=500
x = tf.image.crop_to_bounding_box(
    img, offset_height, offset_width, target_height, target_width
)

Setzen Sie das Bild mit tf.keras wieder zusammen, damit wir es anschauen können, wenn es funktioniert hat:

tf.keras.preprocessing.image.array_to_img(
    x, data_format=None, scale=True, dtype=None
)

Dies druckt das Bild in einem Notebook aus (getestet in Google Colab).


Der gesamte Code zusammen:

import cv2
img = cv2.imread('YOURIMAGE.png')

import tensorflow as tf
offset_height=0
offset_width=0
target_height=500
target_width=500
x = tf.image.crop_to_bounding_box(
    img, offset_height, offset_width, target_height, target_width
)

tf.keras.preprocessing.image.array_to_img(
    x, data_format=None, scale=True, dtype=None
)

1voto

Bharat Natrayn Punkte 120

Um den Ausschnitt oder das Interessengebiet (ROI) für das Gesicht zu verwenden, verwenden Sie den untenstehenden Code

import cv2 
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
image=cv2.imread("ronaldo.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
     cv2.rectangle(img,(x,y),(x+w,y+h),(255,255,0),2) 
     roi_image = gray[y:y+h, x:x+w]
cv2.imshow("Bild zuschneiden/Interessengebiet",roi_image) 
cv2.waitKey(0)
cv2.destroyAllWindows()

Überprüfen Sie die Referenz

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