Wie kann ich mit OpenCV Bilder zuschneiden, wie ich es zuvor in PIL getan habe?
Arbeitsbeispiel zu PIL
im = Image.open('0.png').convert('L')
im = im.crop((1, 1, 98, 33))
im.save('_0.png')
Aber wie kann ich das auf OpenCV machen?
Folgendes 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 falsch verwendet getRectSubPix
. Wenn dies der Fall ist, erklären Sie bitte, wie ich diese Funktion richtig verwenden kann.
crop_img = img[margin:-margin, margin:-margin]
Ich hatte diese Frage und fand hier eine andere Antwort: Region von Interesse kopieren
Wenn wir (0,0) als obere linke Ecke des Bildes betrachten, wird es
im
von links nach rechts als x-Richtung und von oben nach unten als y-Richtung aufgerufen . und wir haben (x1, y1) als den oberen linken Scheitelpunkt und (x2, y2) als den unteren rechten Scheitelpunkt eines Rechteckbereichs innerhalb dieses Bildes, dann:Hier finden Sie eine umfassende Ressource zum Indizieren und Schneiden von Numpy-Arrays, die Ihnen mehr über das Zuschneiden eines Teils eines Bildes erzählen kann. Bilder würden als Numpy-Array in opencv2 gespeichert.
:) :)
quelle
im
nicht richtig gelesen wurde und leer ist. Versuchen Sie, eine IDE mit Haltepunkten zu verwenden, um Ihren Code Schritt für Schritt zu diagnostizieren. Sie können Google Colab verwenden , um Codeblöcke zu erstellen, und Ihr Jupytor-Notizbuch im Stackoverflow-Python-Chatroom freigeben, um Hilfe von jemandem zu erhalten.Beachten Sie, dass die Bild Slicing nicht eine Kopie der Erstellung ,
cropped image
sondern eine Schaffung vonpointer
auf dieroi
. Wenn Sie so viele Bilder laden, die relevanten Teile der Bilder mit Slicing beschneiden und dann in eine Liste einfügen, kann dies eine enorme Speicherverschwendung sein.Angenommen, Sie laden jeweils N Bilder
>1MP
und benötigen nur den100x100
Bereich in der oberen linken Ecke.Slicing
::Alternativ können Sie das relevante Teil von kopieren
.copy()
, damit der Garbage Collector entfernt wirdim
.Nachdem ich dies herausgefunden hatte, stellte ich fest, dass einer der Kommentare von user1270710 dies erwähnte, aber es dauerte einige Zeit, bis ich es herausfand (dh Debuggen usw.). Ich denke, es ist erwähnenswert.
quelle
copy()
den ROI im Vergleich zum Schneiden mache , was wäre das Ergebnis? Wenn ich eine Variable habe,tmp
in der ich jedes Bild speichere, das ich von meinem Computer lade, sollte das Schneiden keinen negativen Einfluss auf mein Gedächtnis haben, oder? Das von Ihnen beschriebene Problem hängt nur damit zusammen, was passiert, wenn Sie alle Bilder laden und dann den ROI erneut speichern, wobei sowohl die Originale als auch der ROI berücksichtigt werden . Bitte lassen Sie mich wissen, ob ich richtig verstanden habe.Dieser Code schneidet ein Bild von der Position x = 0, y = 0 auf h = 100, w = 200
quelle
Unten sehen Sie, wie Sie ein Bild zuschneiden.
Bildpfad: Der Pfad zum zu bearbeitenden Bild
Koordinaten:Koordinaten Ein Tupel von x / y-Koordinaten (x1, y1, x2, y2) [Öffnen Sie das Bild in mspaint und überprüfen Sie das "Lineal" auf der Registerkarte "Ansicht", um die Koordinaten anzuzeigen.]
saved_location : Pfad zum Speichern des zugeschnittenen Bildes
quelle
Robustes Zuschneiden mit OpenCV-Kopierrahmenfunktion:
quelle
x1,y1,x2,y2 = bbox
wenn ich sage:TypeError: 'int' object is not iterable
Hier ist ein Code für robusteres Imcrop (ein bisschen wie in Matlab).
quelle
Alternativ können Sie Tensorflow zum Zuschneiden und openCV zum Erstellen eines Arrays aus dem Bild verwenden.
Jetzt
img
ist ein (Bildhöhe, Bildbreite, 3) Formarray. Beschneiden Sie das Array mit Tensorflow:Setzen Sie das Bild mit tf.keras wieder zusammen, damit wir es uns ansehen können, wenn es funktioniert hat:
Dadurch wird das Bild in einem Notizbuch ausgedruckt (getestet in Google Colab).
Der ganze Code zusammen:
quelle